0

我正在使用以下 foreach 循环构建 SQL 查询:

$sql =  "UPDATE table01 SET ";  
        foreach(array_combine($values, $variables) as $value=>$variable)
        {
        $sql .="$value = $variable,";
        }
        $sql = rtrim($sql,','); 
        $sql .=" WHERE id = '$id'";

$values 是要更新的字段标题数组(db 中的列标题),而 $variables 是包含数据的变量数组。

由这种循环构建的查询示例如下:

UPDATE table01
SET sv_21 = 123, sv_22 = 123, sv_23 = 2011, sv_I8 = 1 sachet every day, sv_I9 = 3
WHERE id = '001'

SQL of 将“每天”识别为语法,它会破坏更新命令。

我怎样才能输入这些数据?实际上,这些查询通常要大得多,并且多个字符串会导致语法错误。

感谢您的考虑

如果是相关的,这里是我用来执行更新的 PDO:

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

$stmt = $pdo->prepare($sql);
$stmt->execute();         




# Affected Rows?
  echo $stmt->rowCount(); // 1
}
4

1 回答 1

1

每当您在 SQL 字段中输入文本数据(而不是数字数据)时,都需要将其放在引号中。例如:

UPDATE table01
SET sv_21 = 123, sv_22 = 123, sv_23 = 2011, sv_I8 = '1 sachet every day', sv_I9 = 3
WHERE id = '001'

某些类型的 SQL,例如 MySQL,将允许您将任何数据放在引号中,因此您应该更新您的 PHP 以像这样工作:

$sql =  "UPDATE table01 SET ";  
        foreach(array_combine($values, $variables) as $value=>$variable)
        {
        $sql .="$value = '$variable',"; // output: sv_I8 = '1 sachet every day',
        }
        $sql = rtrim($sql,','); 
        $sql .=" WHERE id = '$id'";

但是,在执行此操作之前,您应该知道这是使用数据库的危险方式。如果用户将撇号 ( ') 放入他们的数据中,那么他们可以将自己的 SQL 命令添加到您的数据库中。这称为 SQL 注入,它是网站被黑客入侵的主要方式之一。

更新数据库的一种更安全的方法是编写带有占位符的完整 SQL 语句,并明确定义每个占位符的值。您可以在此处了解有关此方法的更多信息:http: //net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

于 2012-10-24T03:17:25.420 回答