我使用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()
函数对其进行过滤。没有过滤/编码也不起作用。
答案 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
的值,那么这里有一些您真正需要检查的事情:
$rows = $stmt->fetchAll();
$rowCount = count($rows);
dsn string:指定字符集(将rowCount
添加到DSN字符串的末尾。details here PDO
答案 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);