2017-02-21 89 views
-1

我想绑定一个关联数组,通过一个foreach循环,但我没有得到它以某种方式工作。我得到这个错误:pdo bindParam与关联数组

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

这里是代码。该变种$columns$values来自阵列为好,操纵,其接受他们像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(); 
} 

我敢肯定的列macthing键在数组中。

编辑:更多的代码

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

代码不足以提供正确的判断。至少显示'$ values'。 –

+0

@ PaulT.Rawkeen对不起,我用代码编辑了这个问题 – SC92

+0

'$ array'仍然是一个谜。 –

回答

6

出现此错误是因为您在每次迭代时都执行查询,但是由于错误而首先停止。当它在第一次迭代中执行时,实际上只绑定了一个变量和一个令牌,因此计数错误并且出现错误。您只需要将执行移出循环

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

谢谢,这工作 – SC92

+0

欢迎你 – Fabio

-2

要调用与每个迭代执行的,所以它只有一个变量实际上束缚射击。

而不是循环的只是通过你的数组执行

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

而且,你的代码是prone to sql injection through column names

+0

感谢您的链接! – SC92