2017-07-18 16 views
5

私は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部分の前に、クエリの最後に余分なコンマを追加するだろうが、うまくいけば、あなたは私が達成しようとしているものを手に入れます。

+1

あなたは[SQLインジェクション](http://php.net/manual/en/security.database.sql-injection.php)に大きく開いていると、本当にすべきクエリを連結する代わりに[Prepared Statements](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)を使用してください。あなたがユーザーの入力をまったくエスケープしていないからです! –

+1

SQLインジェクションを避けるためには、値のプリペアドステートメントとカラム名のホワイトリストを実際に切り替えるべきです。 – jeroen

+0

プリペアドステートメントで列名をバインドすることはできません。ですから、SQLクエリ文字列に可変文字列を入れるつもりなら、正しくエスケープしても問題ありません。 –

答えて

1

PHPのimplode()機能を使用すると、コードを少し変更しても問題はありません。

空の配列をとり、更新パラメータを連結します。

empty()の場合は、implode()は文字列を取得します。

更新されたコード:

$sql = "UPDATE desk_attributes SET "; 
foreach ($deskAttr as $key => $value) { 
$value = mysqli_real_escape_string($link, $value); // $links is database connection string. 
$key = mysqli_real_escape_string($link, $key); // $links is database connection string. 
$updtAttrs[] = $key ." = '" . $value . "'"; 
} 
$sql .= ! empty($updtAttrs) ? implode(', ', $updtAttrs) : ''; 
$sql .= " WHERE id=" . $value->id; 
+2

このコードは** _非常に_ **安全ではありません。それはSQ1注射に対して広く開いています。このようなユーザー入力を直接連結するのではなく、Prepared Statementsを使用する必要があります。また、許可された列名のリストが必要です。 –

+0

いいえ、そうではありません。準備ができている文章を止めるのを止め、mysqli_real_escape_stringの文書を読んでください。 –

+0

@KiJéy - コメントのタイムラインと投稿の編集をチェックしてください。 ** 1。**コメントを書いたとき、mysqli_real_escape_string()は答え_at all_に含まれていませんでした。 ** 2。** '$ key'は完全にアンエスケープされた_still_です。これは_still_によってSQLインジェクションに対して100%オープンされます。 Btw、実際に 'mysqli_real_escape_string()'で十分でない状況があります:https://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string/12118602#12118602 –

関連する問題