获取值中的点(完全停止)打破SQL查询(PDO)

时间:2015-10-23 15:41:14

标签: php mysql pdo get

我使用PDO从MySQL数据库中获取结果,并使用$_GET请求方法中的值作为条件。一切正常,但如果$_GET值中有任何fullstop(点),则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; 
        }
    }
?>

以下是一些例子。

案例1:

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()函数对其进行过滤。没有过滤/编码也不起作用。

2 个答案:

答案 0 :(得分:1)

直接来自the docs

  

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

     

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

这意味着此声明(为getattr(alist, 'remove')(val) ):

document.getElementById('txt3adj<%=pempid%>').value = Math.max(0, result);

不会影响SELECT的返回值。要获得行数,您必须求助于$this->link->prepare("SELECT app FROM table WHERE dev = ?"); 或写:

rowCount

如果您说的确实是真的,并且只有末尾带点的值不会返回mysqli的值,那么这里有一些您真正需要检查的事情:

  1. $rows = $stmt->fetchAll(); $rowCount = count($rows); dsn string:指定字符集(将rowCount添加到DSN字符串的末尾。details here
  2. 设置错误模式,让PDO在失败时抛出异常:PDO
  3. 检查数据库中是否有具有最后一个点的行,如果不是,那么代码按预期工作,只是因为有否结果与
  4. 一起使用

答案 1 :(得分: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);