基本 select 查询在页面中不返回任何内容,但在 phpMyAdmin 中获取结果

A basic select query returning nothing in page, but gets results in phpMyAdmin

我有一个非常基本的查询,raceid 与另一个 table 的 id 相关联。 'name' 是一个 varchar 列。 注意:下面的查询是echo $sql的输出:

SELECT * FROM runner WHERE raceid=738 AND name="Varsity"

我的PHP是这个:

$sql = 'SELECT * FROM runner WHERE raceid=' . $raceid . ' AND name="' . $name . '"';

$stmt = $db->query($sql);

$row_count = $stmt->rowCount();
echo $row_count.' rows selected';

我没有准备上面代码中的语句用于调试我已经简化了代码。

当我 运行 它出现在我的页面中时,我收到“已选择 0 行”的回显。所以查询工作正常,但不匹配。我在 phpMyAdmin 中粘贴了完全相同的查询,我得到了我想要的匹配项。

我检查了字符集 - table 和名称列都是 utf8。

如果我从查询中删除 'name="Varsity"',查询会从右侧 table 生成结果 - 因此连接良好。搜索此名称时出现问题,但一切正常。

在这种情况下,我还可以检查哪些其他内容来进行调试?

我也试过反引号名称,甚至可以肯定的是,我已将 'name' 列更改为更明确的内容:

$sql = "SELECT * FROM runner WHERE raceid=$raceid AND `racername`='$racerename' ";

Prepared语句也不行

$stmt = $db->prepare("SELECT * FROM runner WHERE raceid=:raceid AND racername=:racername");
$stmt->execute(array(':raceid' => $raceid, ':racername' => $racername));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

$row_count = $stmt->rowCount();

echo $row_count; // outputs 0

如我之前所述,如果我从查询中删除 name/racername,则查询有效。它检索许多与 raceid 匹配的结果。在这些结果中还有我正在寻找的赛车名。 IE。数据库连接绝对有效,它是正确的数据库。 另外 如果我删除 raceid,并且只搜索 racername,那同样有效并检索所有结果。那到底是什么?这是一个非常简单的查询,匹配两件事。

没有解决 SQL 注入问题,

$sql = "SELECT * FROM runner WHERE raceid=$raceid AND `name`='$name'";

如果是引用问题,应该处理它,我认为这可能是。 MySQL 将(通常,取决于模式)将您语句中的双引号解释为 $name 是标识符而不是值,并且 name 应该反引号,因为它是MySQL 关键字。

但是解决 SQL 注入问题会更好,并且使用准备好的语句并不困难:

$stmt = $db->prepare("SELECT * FROM runner WHERE raceid = ? AND `name` = ?");
$stmt->execute(array($raceid, $name));

我猜你使用 PDO,正如我评论的那样

http://php.net/manual/en/pdostatement.rowcount.php

PDOStatement::rowCount() 不会 return 受 SELECT 语句影响的行数。

所以你可能可以这样通过:

$sql = 'SELECT * FROM runner WHERE raceid=' . $raceid . ' AND name="' . $name . '"';
$stmt = $db->query($sql);
$rows = $stmt->fetchAll();
echo count($rows).' rows selected';

这里是更安全的变体,可以避免 sql 注入:

$sql = 'SELECT * FROM runner WHERE raceid = :raceid AND name = :name';
$stmt = $db->prepare($sql);
$stmt->bindParam(':raceid', $raceid, PDO::PARAM_INT);
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll();
echo count($rows).' rows selected';