私はMySQLサーバに動的クエリを作成する方法を探しています。あなたが見ることができるように、SQLの列名がdeskAttr
キーと同じですPHPを使った動的MySQLクエリ
$deskAttr = json_decode($_POST["desk_attributes"]);
foreach($deskAttr as $key => $value) {
$sql = "UPDATE desk_attributes SET iw_standard=".$value->iw_standard.", avaya_standard=".$value->avaya_standard.", avaya_withcallid=".$value->avaya_withcallid.", avaya_withtransfer=".$value->avaya_withtransfer.", dual_screen=".$value->dual_screen.", air_conditioning=".$value->air_conditioning.", iw_obdialler=".$value->iw_obdialler." WHERE id=".$value->id;
$conn->query($sql);
}
:現時点ではこれは私がサーバー上のデータを更新するために使用するコードです。私はこの行をループにする方法を探しているので、MySQLテーブルに列を追加する場合はこの行を変更する必要はありません。
$deskAttr = json_decode($_POST["desk_attributes"]);
foreach($deskAttr as $key => $value) {
$sql = "UPDATE desk_attributes SET";
foreach($value as $k => $v) {
$sql .= " $k = $value->$k ,";
}
$sql .= "WHERE id=".$value->id";
}
は、どのように私はそれが実際に動作しますので、上記のコードを記述します。それは次のようになります
?おかげさまで
EDITは、多分
$deskAttr
はオブジェクトの配列と列の名前であるオブジェクトのキーの名前と同じであることを知って参考になります。ここで は、私は擬似コードで何を意味するかです:
foreach($object in $deskAttr) {
$sql = "UPDATE table SET ";
foreach($key in $object) {
if($key != "id")
$sql .= "$key = $object->$key, ";
}
$sql .= "WHERE id = $object->id;
$conn->query($sql);
}
明らかにこれはWHERE部分の前に、クエリの最後に余分なコンマを追加するだろうが、うまくいけば、あなたは私が達成しようとしているものを手に入れます。
あなたは[SQLインジェクション](http://php.net/manual/en/security.database.sql-injection.php)に大きく開いていると、本当にすべきクエリを連結する代わりに[Prepared Statements](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)を使用してください。あなたがユーザーの入力をまったくエスケープしていないからです! –
SQLインジェクションを避けるためには、値のプリペアドステートメントとカラム名のホワイトリストを実際に切り替えるべきです。 – jeroen
プリペアドステートメントで列名をバインドすることはできません。ですから、SQLクエリ文字列に可変文字列を入れるつもりなら、正しくエスケープしても問題ありません。 –