作者:1凡evan | 来源:互联网 | 2023-05-16 15:47
所以我有这个大块的PHP代码
if($_POST['action']=='newComment')
{
$mysqli = new mysqli("localhost", "root", "", "nested_comment");
$new_post = $mysqli->real_escape_string($_POST['content']);
$result = $mysqli->query("SELECT @myLeft := lft FROM comment
WHERE lft = '1';
UPDATE comment SET rgt = rgt + 2 WHERE rgt > @myLeft;
UPDATE comment SET lft = lft + 2 WHERE lft >= @myLeft;
INSERT INTO comment(content, lft, rgt) VALUES('$new_post', @myLeft, @myLeft + 1);");
if($result)
echo "ok";
else
echo $mysqli->error;
}
当我运行它时,会抛出一个错误:
您的SQL语法有错误; 检查与您的MySQL服务器版本对应的手册,以便在'UPDATE comment SET rgt = rgt + 2 WHERE rgt> @myLeft附近使用正确的语法; 在第3行更新注释SET'
但是当我将sql查询放入Sequel Pro(Mac)时,它运行良好.我尝试了许多其他帖子的解决方案,但没有一个能够奏效.我的语法有问题,或者mysql版本出了什么问题?非常感谢.
1> exussum..:
这是因为您尝试一次执行多个语句
http://php.net/manual/en/mysqli.quickstart.multiple-statement.php
Mysqli有这个功能
mysqli_multi_query()
请注意,现在可以将找到的任何SQL注入链接在一起.使用时要小心
安全考虑
API函数mysqli_query()和mysqli_real_query()不设置激活服务器中多个查询所需的连接标志.额外的API调用用于多个语句,以减少意外SQL注入攻击的可能性.攻击者可能会尝试添加诸如的语句; DROP DATABASE mysql或; 选择休眠(999).如果攻击者成功将SQL添加到语句字符串但未使用mysqli_multi_query,则服务器将不会执行第二个注入的恶意SQL语句.