0

重複の可能性:
PHP PDO ステートメントは、テーブル名をパラメーターとして受け入れることができますか?

私のクラスには、問題を起こしている関数があります。ここで関数

function insert($table,$column = array(),$value = array())
{
    $array1 = implode(",", $column);
    $array2 = implode(",", $value);

    try 
    { 
        $sql = $this->connect->prepare("INSERT INTO :table (:date1) VALUES (:date2)");  
        $sql->bindParam(':table',$table, PDO::PARAM_STR);
        $sql->bindParam(':data1',$array1, PDO::PARAM_STR);
        $sql->bindParam(':data2',$array2, PDO::PARAM_STR);

        $sql->execute();

    }  
    catch(PDOException $e) 
    {  
        echo $e->getMessage();  
    }  
}

私は次のように関数を呼び出します:

-> insert('coupons',array('categorie','name','link','code','id'),array('test11','test','test','test','NULL'));

私が得るエラーは次のとおりです。

警告: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: 無効なパラメーター番号: パラメーターが C:\xampp\htdocs\MYFRAMEWORK\lib\database.class.php の 46 行目に定義されていませんでした

46行目は次のとおりです。

$sql->execute();

だから今、私は問題がどこにあるのか本当にわかりません。ポインタはありますか?

4

2 に答える 2

5

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 データから列を構築している場合、これは脆弱であり、サニタイズする必要があります。
于 2012-11-15T21:32:10.230 に答える
0

クエリが正しく作成されていません。values周囲の'引用符がありません。

を実行するimplodeと、array2 は次のようになります。

 test1,test,test... //and so on.

Insertクエリ内で適切にバインドするには、'test1','test','test'... である必要があります。

$sql = $this->connect->prepare("INSERT INTO :table (:date1) VALUES (:date2)"); 

また、パラメータ名にとdate1の代わりにタイプミスがあります。data1date2data2

于 2012-11-15T20:17:15.870 に答える