SQL 语法错误 MariaDB 服务器版本,在第 1 行“@hotmail.com,Employee)”附近使用正确的语法[重复]

问题描述 投票:0回答:3

我正在尝试使用 php 制作一个注册页面,然后当我在下面编写 mysql 语句时,它不会接受它,而是会吐出一个错误,我现在正试图弄清楚这个错误几个小时。

   $query = "INSERT INTO users(username, password,name,surname,email,role)VALUES($username, $password,$name,$lastname,$email,$role)";
   $stmt = mysqli_prepare ($dbh, $query) or die(mysqli_error($dbh));

显示的错误是:

您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行“@hotmail.com,Employee)”附近使用的正确语法。

php mysqli
3个回答
4
投票

如果插入字符串,请确保使用正确的引号:

$query = "INSERT INTO users(username, password,name,surname,email,role)VALUES('$username', '$password','$name','$lastname','$email','$role')";

3
投票

您开始使用准备好的语句,但随后您转身将变量直接插入到查询中 - 不要这样做,因为它直接违背了使用

prepare()
的目的。改为绑定您的变量。

$query = "INSERT INTO users(username, password, name, surname, email, role) VALUES (?, ?, ?, ?, ?)";
$stmt = mysqli_prepare($dbh, $query) or die(mysqli_error($dbh));
$stmt->bind_param('sssss', $username, $password, $name, $lastname, $email, $role);
$stmt->execute();
$stmt->close();

您最初的错误是由于查询中的字符串周围缺少引号引起的,但是当使用带有占位符的准备好的语句时,您也不应该有它。

如果您在插入的变量上使用了

mysqli_real_escape_string()
,您现在应该将其删除 - 因为这些变量现在已在查询中参数化。

请参阅以下链接和文档


2
投票

出于安全原因,您不应在查询中使用变量。

改用这个:

$stmt = mysqli_prepare($link, "INSERT INTO users(username, password,name,surname,email,role)VALUES(?,?,?,?,?,?)");
mysqli_stmt_bind_param($stmt, 'ssssss', $password, $name, $surname, $email, $role);
mysqli_stmt_execute($stmt);

查看 php 文档:

© www.soinside.com 2019 - 2024. All rights reserved.