如何在PHP中解析SQL查询字符串
我试图用一个简单的查询更新数据库中的一些值,但我无法使与如何在PHP中解析SQL查询字符串,php,sql,Php,Sql,我试图用一个简单的查询更新数据库中的一些值,但我无法使与date函数相关的查询正常工作 $update_issued = "UPDATE books SET isIssued = 0 WHERE bookId =" . $_GET["bookid"]; //This one works $update_date = "UPDATE loans SET returnDate = " . date("F j, Y, g:i a") . " WHERE bookId = " . $_GET["book
date
函数相关的查询正常工作
$update_issued = "UPDATE books SET isIssued = 0 WHERE bookId =" . $_GET["bookid"]; //This one works
$update_date = "UPDATE loans SET returnDate = " . date("F j, Y, g:i a") . " WHERE bookId = " . $_GET["bookid"]; //This one does not
mysqli_query($db, $update_issued, $update_date);
所以,我想问题出在哪里。DB上的returnDate列需要一个varchar值,新值必须像字符串一样用引号括起来。我试着在提问前附上它,但把引号放错了地方 应该是这样的:
$update\u date=“更新贷款设置返回日期=”。日期(“F j,Y,g:i a”)。“'WHERE bookId=“$_获取[“bookid”]//这一个没有
因此,date函数返回的值将用单引号括起来,就像您所做的那样:
UPDATE loans SET returnDate='20.11.2019 22:33`WHERE bookId=“.$\u GET[“bookId”];
要将参数传递给查询,请使用准备好的语句以防止SQL注入攻击
$update_date = mysql_prepare($db, "UPDATE loans SET returnDate = ? WHERE bookId = ?");
mysqli_stmt_bind_param($update_date, 'si', date("F j, Y, g:i a"), $_GET["bookid"]);
mysqli_stmt_execute($update_date);
通过这样做,可以防止攻击者传递可能导致系统执行不必要操作的字符串;如果攻击者在?bookid
中传递了0或1=1
,则您的查询将影响所有行
作为一个次要方面,使用面向对象的样式调用
$db->prepare
比调用mysqli_prepare($db…
;更好的是使用PDO层。请使用prepared语句。日期必须用单引号括起来。但是如果bookid
是“5”,情况会更好;drop table books“我知道这是不安全的,很容易被利用,但我正在尝试在构建安全的东西之前学习基础知识。这基本上是一个爱好者项目,不会被其他人使用。准备好的语句是“基础知识”。“不要找借口以错误的方式做事。还要确保数据库列的类型正确。正确的DATETIME
列将不接受此日期格式。请不要使用连接来生成查询。