因此,为了完成一项学校作业,我必须制作一个网站。该网站必须包含从数据库中获取文章的功能。
例如,我可以用 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/