gpt4 book ai didi

php - 使用 PDO 更新 MySQL 记录,但数据包含破坏 SQL 语法的字符串

转载 作者:行者123 更新时间:2023-11-29 14:13:44 25 4
gpt4 key购买 nike

我正在使用以下 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 是要更新的字段标题数组(数据库中的列标题),而 $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 将“every day”识别为语法,并且它破坏了更新命令。

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

感谢您的考虑

如果相关的话,这是我用来执行更新的 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
}

最佳答案

每当您在 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 注入(inject),它是网站遭到黑客攻击的主要方式之一。

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

关于php - 使用 PDO 更新 MySQL 记录,但数据包含破坏 SQL 语法的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13042361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com