【问题标题】:Dot (Full Stop) in Get Value Breaks the SQL Query (PDO)Get Value 中的点(句号)会破坏 SQL 查询 (PDO)
【发布时间】:2015-10-23 15:41:14
【问题描述】:

我正在使用 PDO 从 MySQL 数据库中获取结果,并使用来自 $_GET 请求方法的值作为条件。一切正常,但如果 $_GET 值中有任何句号(点),MySQL 将返回 0 行。

这是我的示例:

<?php
    function filter($val) {
        $f = htmlentities($val);
        $f = filter_input(INPUT_GET, $f);
        return strip_tags($f);
    }

    $dev = filter("dev");

    function DevFetch($dev) {
        $q = $this->link->prepare("SELECT app FROM table WHERE dev = ?");
        $q->bindValue("1", $dev);
        $q->execute();
        if($q->rowCount() > 0) {
            return $q->fetchAll();
        } else {
            return false; 
        }
    }
?>

这里有一些例子。

案例一:

results.php?developer=Google+Inc // works fine

案例 2:

results.php?developer=Google // works fine

案例 3:

results.php?developer=Google+Inc. // doesn't work with dot at the end

请帮忙。请注意,我正在编码(urlencode()$_GET 值以及使用filter_input() 函数对其进行过滤。没有过滤/编码也不行。

【问题讨论】:

  • 使用参数化查询而不是过滤输入...
  • the query failsreturns 0 rows 之间也有区别。返回 0 行的查询有效,只是没有找到任何匹配的内容。
  • @andrewsi 谢谢你的澄清
  • 是否有匹配results.php?developer=Google+Inc.的记录?
  • 那么你的代码在哪里??

标签: php mysql pdo get


【解决方案1】:

由于您使用准备好的语句,因此您不需要 filter 函数。

就这么简单:

 function DevFetch($dev) {
    $q = $this->link->prepare("SELECT app FROM table WHERE dev = ?");
    $q->bindValue(1, $dev);
    $q->execute();
    $result = $q->fetchAll();
    if(count($result) > 0) {
        return $result;
    } else {
        return false; 
    }
}

$input = $_GET["dev"];
DevFetch($input);

【讨论】:

  • 好吧,如果 OP 已经用所有过滤器填充了数据库,他将需要继续使用它来检索他的数据。这里要问的关键是是否有查询记录(WHERE dev = 'Google+Inc.'),也许这就是问题的开始......
  • 想通了,.htaccess 文件对 $_GET 值做了一些不好的事情。它正在删除点。需要对此进行调查。感谢您的回答!
【解决方案2】:

直接取自the docs:

PDOStatement::rowCount() 返回受相应 PDOStatement 对象执行的最后一个 DELETE、INSERT 或 UPDATE 语句影响的行数。

如果关联 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都可以保证这种行为,并且不应依赖于可移植应用程序。

这意味着这个声明(作为SELECT):

$this->link->prepare("SELECT app FROM table WHERE dev = ?");

不影响rowCount的返回值。要获得行数,您必须求助于mysqli 或写:

$rows = $stmt->fetchAll();
$rowCount = count($rows);

如果您说的确实是真的,并且只有末尾带有点的值没有返回 rowCount 的值,那么您确实应该检查以下几件事:

  1. PDO dsn 字符串:指定字符集(在 DSN 字符串末尾添加;charset=utf8details here
  2. 设置错误模式以使 PDO 在失败时抛出异常:PDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION
  3. 检查您的数据库中是否有值 具有末尾的点的行,如果它不存在,那么您的代码将按预期工作,这仅仅是因为没有结果 合作

【讨论】:

  • 感谢您的回答,但是如果 $_GET 参数中没有任何点,rowCount() 可以工作。我什至尝试了没有 rowCount() 条件,仍然没有运气。
  • @rehmat:更新了我的答案实际上提到了最后要检查的最关键的事情:您的数据库中是否有 dev = 'Google+Inc.' 的记录?如果不是:您的代码可以工作,因为根本没有什么可以获取/返回...
  • .htaccess 正在从 $_GET 值中删除点。谢谢你的回答,它教会了我一些东西。我在我的 dsn 中丢失了字符集,补充说。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2015-10-15
相关资源
最近更新 更多