php - MySQL select 查询发现一个不应该在 PDO 中找到的结果

标签 php mysql pdo

因此,为了完成一项学校作业,我必须制作一个网站。该网站必须包含从数据库中获取文章的功能。

例如,我可以用 domain.com/content/article/1/ 显示文章 1。

但是,当我使用像这样的 URL domain.com/content/article/2aadd/ 时,它仍然显示文章 2。 甚至 ../10aadd/ 显示第 10 条。 如果我尝试请求一篇不存在的文章,例如 ../11aadd(第 11 条不存在),它将显示找不到该文章的错误,就像它应该的那样.


我使用 URL 重写,所以像这样的 URL domain.com/content/article/1/ 被重写为 domain.com/index.php?c=content&a=article&arg=1

我使用数据库类,每个选择查询都发送到一个选择查询方法。它接受以下参数:

  • $q - 查询
  • $params - 包含查询参数的数组
  • $fetch - 抓取模式

发送以下参数以显示文章:

  • 从 PHP2b_OOP_EIND_Articles 中选择标题和内容,其中 id=:id 和 enabled=1
  • array("id"=>$_GET["arg"])
  • 协会

在每次调用此方法时,都会准备一个新语句并使用 $params 数组作为参数执行。


我已经转储了 $params 数组,它确实显示了整个字符串(例如 10aadd)。

我试过没有干净的 URL。

我试图查找它,但我找不到任何东西。


这可能是什么原因?

最佳答案

我怀疑您的 MySQL 表的 id 列被定义为整数数据类型。

当 MySQL 将字符串数据类型强制转换为整数时,您正在体验 MySQL 的特性。

select CAST('10aaadd' AS INT)

返回值 10,很奇怪。

您的查询在变量替换后显示为 WHERE id = '10aaadd'

因为 MySQL 将该字符串隐式转换为 int,所以它找到 id 值为 10 的行。

很奇怪吧?

如果您希望 $_GET 或 $_POST 参数中只有整数,最好检查一下,如果您收到的值与预期不符,则抛出错误。 PHP's is_numeric() function可以为您做到这一点。

关于php - MySQL select 查询发现一个不应该在 PDO 中找到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41578702/

相关文章:

php - 更改 MySQL date_format 中的月份名称?

mysql - 如何优化 MySQL (Laravel) 中的存储过程

mysql - 如何找出导致应用程序变慢的原因?

mysql - PDO 使用 DATEADD 函数删除所有行不起作用

php - 无法使用 MSSQL 在 PDO 中引用表名

php - PDO 限制查询在执行中使用绑定(bind)不起作用

php sql 显示来自不同贡献者的图像

PHP:将变量转换为空

php - 使用 PHP 合并本地和在线数据库

mysql - 我无法从文件中加载仅包含整数列的 MySQL 表