Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用mysql';准备语句的s间隔_Php_Mysqli_Bindparam - Fatal编程技术网

Php 使用mysql';准备语句的s间隔

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中尝试时,双问号作为一个参数,而

我使用扩展名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中尝试时,双问号作为一个参数,而不是两个参数。


如何解决此问题?

使用占位符,您只能绑定数据文本,换句话说,就是字符串和数字

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代码。然后,为了简单起见,您可能希望将其包装在用户定义的函数中。称之为白名单()