0

正如标题所述:我正在尝试使用 PDO 和令牌更新 MySQL 数据库中的特定记录,以防止任何注入。

这是我的代码:

一些有助于构建查询的数组:

$id = 1234
$values = array ('a','b','c',);
$variables = array ($A, $B, $C);

通过循环构建的查询:

$sql =  "UPDATE table1 SET ";   
        foreach($values as $value)
        {
        $sql .="$value = :$value, ";
        }
        $sql = rtrim($sql,', ');    
        $sql .=" WHERE id = '$id'";

通过 PDO 执行查询:

try     
{
$pdo = new PDO('mysql:host=localhost; dbname=db01', $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare($sql);
foreach(array_combine($values, $variables) as $value=>$variable)
{
$stmt->bindParam(":$value", $variable);
}

$stmt->execute();

结果:指定记录中的每个字段(匹配 $id)都设置为相同的值,该值始终等于数组中列出的最后一个变量的内容(在此示例中,它们都将包含 $C 中保存的值)

回显 SQL 查询表明它已正确构造。

有任何想法吗?感谢您的考虑

4

2 回答 2

1

从评论扩展:

在你的foreach循环中, the$variable是一个,而不是一个引用,所以当你使用时mysqli_stmt::execute(),你实际上最终使用了 last $variable

为避免这种情况,您必须使用以下内容:

$cache=array_combine($values,$variables);
foreach($cache as $value=>$variable)
{
  $stmt->bindParam(":$value",$cache[$value]);
}
于 2012-11-07T03:12:54.750 回答
0

你必须这样做:

  foreach(array_combine($values, $variables) as $value=>$variable)
  {
    $stmt->bindParam(":$value", $variable);
    $stmt->execute();
   }

在 for 循环中执行您的查询。循环完成后不要执行查询,因为它只会获取数组的最后一个值。它只会执行一次。

于 2012-11-06T06:16:49.483 回答