Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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 带有分页脚本的PDO语法或访问冲突错误_Php_Mysql_Pdo_Pagination - Fatal编程技术网

Php 带有分页脚本的PDO语法或访问冲突错误

Php 带有分页脚本的PDO语法或访问冲突错误,php,mysql,pdo,pagination,Php,Mysql,Pdo,Pagination,下面的代码可以工作,但是如果我键入一些组合,例如index.php?page_no(没有一个页面),或者page_no=0(即零,但page_no=1,上面的一切都可以工作),或者如果我在url中键入的数字超过19个(例如22222222)(在index.php?page_no=之后)我得到以下类型的错误: 致命错误:未捕获异常“PDOException”并显示消息“SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以获

下面的代码可以工作,但是如果我键入一些组合,例如
index.php?page_no
(没有一个页面
),或者
page_no=0
(即零,但
page_no=1
,上面的一切都可以工作),或者如果我在url中键入的数字超过19个(例如22222222)(在
index.php?page_no=
之后)我得到以下类型的错误:

致命错误:未捕获异常“PDOException”并显示消息“SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以获取中第1行“5.5555556e+19,5”附近要使用的正确语法

致命错误:未捕获异常“PDOException”并显示消息“SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以获取中第1行的'-5,5'附近使用的正确语法
我的代码如下:

分页


//这里有一些html和一些列的回声
我的配置文件的一部分(我最近添加了第一行,没有帮助):

$DB\u con->setAttribute(PDO::ATTR\u EMULATE\u PREPARES,false);
$DB_con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
我已经24小时、7天、24小时不间断地在这方面工作了好几天。直到几周前我自己偶然发现这个问题时,我才知道我有这个问题


如果这里有人能给我指出正确的方向,我将不胜感激。谢谢!

乍一看,这似乎是同一问题的两个方面:SQL“LIMIT”命令的参数无效

在一端,提供负值:

$starting_position=($_GET["page_no"]-1)*$records_per_page;

$query2=$query." limit $starting_position,$records_per_page";
当“page_no”为0时,则限制最终为“limit-5,5”,这是无效的。若要解决此问题,请改用类似以下内容:

$limit_bounded = min(max(0, $starting_position), PHP_INT_MAX); // Bounded between 0 and PHP_INT_MAX, which is ~2147000000.
$query2=$query." limit $limit_bounded,$records_per_page";
在高端,您可能会看到整数溢出,或者只是使用了太多的字符作为上限


作为一个安全问题,您应该转义SQL查询中使用的参数,特别是当您从$\u GET接收参数时,以防止SQL注入(恶意用户可能会请求“'DROP TABLES”或类似的'page\u no'变量,并为您造成问题)。

-5无效(不能低于0),并且16个字符太高。在盲目使用之前请检查输入。这看起来像是将大于平台可以处理的最大整数值的值作为数字处理的典型结果,这意味着它将转换为浮点、松散精度,并可能导致在将其传输回时使用指数表示法进入字符串上下文//这是一个实际问题吗?您有那么多记录,传递这么高的页码是有意义的吗?我毫不怀疑。因此,我建议您对传递的页码进行值检查,如果超出合理的界限,则拒绝它。“当您将其传输回字符串上下文时”–顺便说一句,你为什么要这样做?你已经在使用准备好的语句了,那么你为什么不在极限值上使用占位符呢?@aynber我现在肯定会更彻底,不再盲目me@CBroe你是对的,我绝对没有那么多的记录需要这么高的页码。谢谢你的推荐非常感谢。您的回答非常有效。在阅读了您的回答后,我现在对SQL LIMIT命令和无效/有效限制有了更大程度的了解。还感谢您提醒我安全问题(SQL注入).我已经接受了你的答案,另外我还想对答案进行投票,但因为我的分数只有3,我还没有能力这么做。关于SQL注入,如果我在分页中使用它-
$stmt=$this->db->prepare($query);$stmt->execute();
然后在索引中-
$query='SELECT*FROM view-i-created ORDER BY passport DESC';
这样安全吗?老实说,我不想提供可能不完全不准确的信息。在我看来,使用'prepare()'是一个相当不错的解决方案,适用于一般安全的应用程序。但要获得详尽的解释,请查看我现在正在查看引用的线程。大量信息!我正在阅读更多关于一阶注入、二阶注入和未检查的动态sql的信息。有关PD的广泛且非常有用的信息O准备足够的语句和SQL注入。