在构建我的应用程序时,我顺利地进行了创建查询。但是,当我将PHP从创建文件复制到更新文件时,我收到此错误:
更新人员设置名字="名字",姓氏="姓氏",电子邮件= "test@mail.com",电话号码 = 1234567890 其中 ID = 1">
SQLSTATE[42000]:语法错误或访问冲突:1064 您有一个 您的 SQL 语法错误;检查与您的手册相对应的手册 MariaDB 服务器版本,用于在第 1 行的"附近使用的正确语法
通常,当我收到此错误时,该错误会为我提供一个准确的修复位置。任何人都可以帮我找到这个错误吗?
更新.sql:
if (isset($_POST['submit'])) {
require "../resources/config.php";
require "../resources/common.php";
try {
$connection = new PDO($dsn, $username, $password, $options);
$id = $_GET['id'];
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$phonenumber = $_POST['phonenumber'];
$updated_number = array($firstname, $lastname, $email, $phonenumber);
$sql = sprintf(
"UPDATE %s SET firstname = '$firstname', lastname = '$lastname', email = '$email', phonenumber = $phonenumber WHERE id = %s",
"people",
$id
);
$statement = $connection->prepare($sql);
$statement->execute($updated_number);
header("Location: index.php");
}
catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
}
你这里有两个问题。首先,也是更重要的,是你对准备好的陈述的使用。应绑定查询本身中的所有值。所以你的查询应该真的是:
$updated_number = array($firstname, $lastname, $email, $phonenumber, $id);
$sql = sprintf("UPDATE %s
SET firstname = ?, lastname = ?, email = ?, phonenumber = ?
WHERE id = ?",
"people");
第二个是你的sprintf
使用情况。
WHERE id = %s
%s
是一个字符串,%d
是一个整数。但是,对于正确的预准备语句,这是不需要的。如果"people"
不是变量并且是动态构建的,我认为将整个查询构建为普通字符串会更容易。例如
$sql = 'UPDATE people
SET firstname = ?, lastname = ?, email = ?, phonenumber = ?
WHERE id = ?';
不要使用 sprintf
来构建 SQL 语句,因为它会使您的代码面临 SQL 注入攻击,最好使用预准备语句
$sql = "UPDATE `people` SET `firstname` = :firstname, `lastname` = :lastname, `email` = :email, `phonenumber` = :phonenumber WHERE `id` = :id;"
$statement = $connection->prepare($sql);
$statement->bindParam(':firstname', $firstname);
$statement->bindParam(':lastname', $lastname);
$statement->bindParam(':email', $email);
$statement->bindParam(':phonenumber', $phonenumber);
$statement->bindParam(':id', $id);