2017-02-21 7 views
-1

私は連想配列で束縛しようとしていますが、foreachをループしていますが、どういうわけかそれを働かせません。このエラーが表示されます:pdo bindParam(連想配列あり)

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

ここにコードがあります。 VAR $columns$valuesは、その私は列が配列のキーをmacthingているかなり確信しているx, x, x:x, :x, :x

$stmt1 = $conn->prepare("INSERT INTO data($columns) 
VALUES ($values)"); 
foreach ($array as $key => $value) 
{ 
    $key = ":" . $key; 
    $stmt1->bindParam($key, $value); 
    $stmt1->execute(); 
} 

のようにそれらを受け入れるように操作だけでなく、アレイから来ています。

EDIT:コードのより

$values = ''; 
$columns = implode(',', $array); 
foreach($array as $key) 
{ 
    $values .= ":" . $key . ","; 
} 
$values = substr($values , 0, -1); 
+0

適切な判断を下すコードが不十分です。少なくとも$値を表示してください。 –

+0

@ PaulT.Rawkeen申し訳ありませんが、コード – SC92

+0

で質問を編集しました。まだ '$ array'は謎です。 –

答えて

6

エラーは、各繰り返しでクエリを実行しているために発生しますが、エラーのために最初は停止しています。最初の反復で実行されると、実際には1つの変数と1つのトークンのみがバインドされるため、カウントが正しくないため、エラーが発生します。ループから実行を移動するだけで済みます

foreach ($array as $key => $value) { 
    $key = ":" . $key; 
    $stmt1->bindParam($key, $value); 
} 
$stmt1->execute(); 
+0

ありがとう、これは – SC92

+0

あなたは大歓迎ですよ – Fabio

-2

あなたは反復ごとに実行呼び出しているので、それが実際にバインド変数は1つだけで発射されます。代わりに、そのループの

だけでも、あなたのコードがprone to sql injection through column namesで実行

$stmt1 = $conn->prepare("INSERT INTO data($columns) VALUES ($values)"); 
$stmt1->execute($array); 

にあなたの配列を渡します。

+0

リンクありがとう! – SC92