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

时间:2016-06-14 20:16:55

标签: php mysql phpmyadmin

我有一个非常基本的查询,raceid与另一个表中的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中粘贴完全相同的查询,我得到了我想要的匹配。

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

如果从查询中删除'name =“Varsity”',查询将生成右表的结果 - 因此连接良好。搜索此名称有些不妥,但一切看起来都不错。

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

我也尝试过反复使用名称,甚至可以肯定的是,我已将“名称”列更改为不那么含糊不清的内容:

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

预备声明也不起作用

$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

正如我之前所说,如果我从查询中删除名称/ racername,查询将起作用。它检索许多与raceid匹配的结果。在这些结果中也是我正在寻找的racername。即。数据库连接绝对有效,它是正确的数据库。 另外如果我删除了raceid,并且只搜索racername,那么它也可以运行并检索所有结果。那到底是什么?这是一个非常简单的查询匹配2件事。

2 个答案:

答案 0 :(得分:1)

我猜你使用PDO并且我评论了

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

PDOStatement :: rowCount()不返回受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';

答案 1 :(得分:0)

没有解决SQL注入问题,

$sql = "SELECT * FROM runner WHERE raceid=$raceid AND `name`='$name'";
如果它是一个引用问题,

应该照顾它,我认为它可能是。 MySQL(通常,取决于模式)将语句中的双引号解释为$name是标识符而不是值,并且name应该被反引号,因为它是MySQL关键字。< / p>

但解决SQL注入问题会更好,并且准备好的声明并不困难:

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