我正在尝试使用 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)”附近使用的正确语法。
如果插入字符串,请确保使用正确的引号:
$query = "INSERT INTO users(username, password,name,surname,email,role)VALUES('$username', '$password','$name','$lastname','$email','$role')";
您开始使用准备好的语句,但随后您转身将变量直接插入到查询中 - 不要这样做,因为它直接违背了使用
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()
,您现在应该将其删除 - 因为这些变量现在已在查询中参数化。
请参阅以下链接和文档
出于安全原因,您不应在查询中使用变量。
改用这个:
$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 文档: