MySQL select查询找到不应该在PDO中找到的结果

时间:2017-01-10 21:25:37

标签: php mysql pdo

因此,对于学校作业,我必须建立一个网站。该网站必须包含从数据库中获取文章的功能。

例如,我可以使用 domain.com/content/article/1 / 显示第1条。

但是,当我使用这样的网址 domain.com/content/article/2aadd / 时,它仍会显示第2条。 甚至 ../ 10aadd / 也显示了第10条。 如果我尝试请求与 ../ 11aadd 不存在的文章(第11条不存在),则会显示无法找到的错误这篇文章就像它应该的那样。

我使用网址重写,因此像 domain.com/content/article/1 / 这样的网址会被重写为 domain.com/index.php?c=content&a=article& ;精氨酸= 1

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

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

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

  • 从PHP2b_OOP_EIND_Articles中选择标题,内容,其中id =:id和enabled = 1
  • 阵列(" ID" = GT; $ _ GET ["精氨酸"])
  • ASSOC

在此方法的每次调用中,正在准备并使用 $ params 数组作为参数执行新语句。

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

我没有干净的网址就试过了。

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

这可能是什么原因?

1 个答案:

答案 0 :(得分:1)

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

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

select CAST('10aaadd' AS INT)

奇怪地回报了值10

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

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

很奇怪,是吗?

如果你只想在$ _GET或$ _POST参数中使用整数,那么检查它是个好主意,如果你收到的值不符合预期则抛出错误。 PHP's is_numeric() function可以为您做到这一点。