sql >> データベース >  >> RDS >> Mysql

PDObindParamの問題

    PDOは、テーブル名や列名ではなく、値データをバインドします。

    バインディングの使用を誤解しています。テーブル名と列名をPDOにバインドすることはできません。データをバインドして、それらの列に挿入します。文字列操作を使用してテーブル名と列を含めるようにSQLを作成する必要があります。

    データをフォーマットする

    $columnと$valueの名前を$column_array、$ value_arrayに変更して、それぞれが単純な配列であると想定しました。$column_array = array('column1', 'column2', ...) etc.

    $placeholders = array_map(function($col) { return ":$col"; }, $column_array);
    
    $bindvalues = array_combine($placeholders , $value_array);
    

    $placeholdersは次のようになります:

    $placeholders = array(
            ':column1',
            ':column2',
             ...
        );
    

    $ bindvaluesは次のようになります:

    $bindvalues = array(
            ':column1'=>'value1',
            ':column2'=>'value2',
             ...
        );
    

    構築、準備、実行

    $sql = $this->connect->prepare("INSERT INTO $table (" .implode(",", $column_array) .") VALUES (". implode(",", $placeholders) . ")";
    

    これにより、フォームの準備されたステートメントが得られます:

    $sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...)
    

    次に、プリペアドステートメントを実行し、$valuesを引数として渡すことができます。

    $sql->execute($bindValues);
    

    注:

    • 言及しなければならない1つの警告。 元のデータがSQLインジェクションに対してサニタイズされていることを確認してください。 PDOはバインドされた値に対してそれを処理しますが、たとえば$ _POSTデータから列を作成する場合、これは脆弱であり、サニタイズする必要があります。


    1. Djangoの一意のモデルフィールドと大文字と小文字の区別(postgres)

    2. 別のテーブルのデータを使用して計算列を作成する

    3. T-SQLスキップストアドプロシージャ

    4. MySQLユーザーパスワードの変更