pdo bindParam与关联数组

时间:2017-02-21 11:16:14

标签: php mysql arrays pdo associative-array

我正在尝试使用关联数组bindParams,通过foreach循环,但我不知道它以某种方式工作。我收到了这个错误:

  

SQLSTATE [HY093]:参数号无效:绑定变量数与令牌数不匹配

这是代码。变量$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();  
}

我很确定列正在对数组中的键进行处理。

编辑:更多代码

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:-2)

您正在使用每次迭代调用execute,因此仅使用一个实际绑定的变量触发它。

而不是那个循环只是将你的数组传递给执行

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

此外,您的代码为prone to sql injection through column names