Php 使用mysql';准备语句的s间隔
我使用扩展名Mysqlnd准备阻止SQL注入的DB请求。 我的网站上有这样的请求:Php 使用mysql';准备语句的s间隔,php,mysqli,bindparam,Php,Mysqli,Bindparam,我使用扩展名Mysqlnd准备阻止SQL注入的DB请求。 我的网站上有这样的请求: SELECT a, b FROM table where a = ?; 下一个请求在我的网站上不起作用: SELECT a, b FROM table where b > DATE_SUB(CURRENT_TIMESTAMP(),INTERVAL ? ?); 错误日志:PHP致命错误:对…中的非对象调用成员函数execute() 这是因为请求的语法错误 当我在DB IDE中尝试时,双问号作为一个参数,而
SELECT a, b FROM table where a = ?;
下一个请求在我的网站上不起作用:
SELECT a, b FROM table where b > DATE_SUB(CURRENT_TIMESTAMP(),INTERVAL ? ?);
错误日志:PHP致命错误:对…中的非对象调用成员函数execute()
这是因为请求的语法错误
当我在DB IDE中尝试时,双问号作为一个参数,而不是两个参数。
如何解决此问题?使用占位符,您只能绑定数据文本,换句话说,就是字符串和数字
INTERVAL
接受两个参数,expression
和unit
虽然表达式
部分是一个数字,可以绑定,但单元
部分是一个关键字,因此无法绑定。因此,您只能将其列为白名单。下面是我写的一篇文章,可以帮助解决这一问题
$unit = white_list($_GET['unit'], ["DAY","MINUTE","SECOND"], "Invalid time unit name");
$sql = "SELECT a, b FROM table where b > DATE_SUB(CURRENT_TIMESTAMP(),INTERVAL ? $unit)";
它不是很整洁,但至少简洁且安全。使用占位符,您只能绑定数据文本,换句话说,就是字符串和数字
INTERVAL
接受两个参数,expression
和unit
虽然表达式
部分是一个数字,可以绑定,但单元
部分是一个关键字,因此无法绑定。因此,您只能将其列为白名单。下面是我写的一篇文章,可以帮助解决这一问题
$unit = white_list($_GET['unit'], ["DAY","MINUTE","SECOND"], "Invalid time unit name");
$sql = "SELECT a, b FROM table where b > DATE_SUB(CURRENT_TIMESTAMP(),INTERVAL ? $unit)";
它不是很整洁,但至少简洁和安全。我没有测试过它,但我假设你不能参数化天/周/…部分查询是否有帮助?@NigelRen没有真正的帮助,因为我想用我的参数选择一个月/天/小时/…我没有测试过,但我假设你不能参数化天/周/。。。部分查询有帮助吗?@NigelRen没有真正的帮助,因为我想用我的参数来选择它是一个月/天/小时/…还是用PHP的原生
in_array
函数$unit=in_array($\u GET['unit],[“DAY”,“MINUTE”,“SECOND”])?$\u GET['unit:“Invalid”;
$unit=“Invalid“
将导致SQL错误而不是:“无效”
您可以退出()骰子()抛出新错误等,这样它将不再是“仅在数组中()”,而是一段PHP代码。然后,为了简单起见,您可能希望将其包装在用户定义的函数中。把它叫做white_list(),或者不用white_list,只使用PHP的原生in_array
函数$unit=in_array($_GET['unit'],[“DAY”,“MINUTE”,“SECOND”])$_获取['unit']:“无效”
$unit=“Invalid”
将导致SQL错误,而不是:“Invalid”
您可以退出()die()抛出新错误等,这样它将不再是“just in_array()”,而是一段PHP代码。然后,为了简单起见,您可能希望将其包装在用户定义的函数中。称之为白名单()