Php PDO不返回任何行

Php PDO不返回任何行,php,mysql,pdo,Php,Mysql,Pdo,此设置不会从数据库返回任何内容。这是我第一次使用PDO,所以我可能遗漏了一些东西。它根本没有抛出任何错误,只是一个空结果 $results = array(); $stmt = $bd->prepare("Select Beer.Beer_Name, Prices.Price, Prices.Shop_Name FROM Beer, Prices WHERE Beer.Beer_Name = Prices.Beer_Name AND Shop_Id = :retailer");

此设置不会从数据库返回任何内容。这是我第一次使用PDO,所以我可能遗漏了一些东西。它根本没有抛出任何错误,只是一个空结果

$results = array();

$stmt = $bd->prepare("Select Beer.Beer_Name, Prices.Price, Prices.Shop_Name FROM Beer, Prices WHERE Beer.Beer_Name = Prices.Beer_Name AND Shop_Id = :retailer");

    $stmt->bindValue(':retailer', $retailer);


$stmt->execute();



$results[0] = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($results[0]);

您不需要事先设置数组,并且可以在使用
$query->RowCount()
之前检查结果。下面是一个使用错误捕获的示例:

try {
    // Enabled throwing errors - you can remove this after debugging
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // Prepare the statement
    $stmt = $bd->prepare("Select Beer.Beer_Name, Prices.Price, Prices.Shop_Name FROM Beer, Prices WHERE Beer.Beer_Name = Prices.Beer_Name AND Shop_Id = :retailer");

    // You can also use bindparams, I like to use execute and pass and array so it is shorter
    $stmt->execute(array(
        ':retailer' => $retailer
    ));
    if($stmt->RowCount()==0) {
        // Do stuff when no results are found (without an error)
    } else {
        $Results = $stmt->FetchAll();
    }

// Catch any exceptions and put the error into $e
} catch (Exception $e) {
    // Echo the error we got - you should only output errors when debugging
    echo $e->GetMessage();
}

如果您有任何问题,请告诉我,但此方法会显示任何数据库错误。如果您没有收到错误,您的查询将不会返回任何内容。

问题1-您可能没有正确捕获错误。在异常模式下设置PDO,用try/catch包装代码。问题2-$retailer可能为空,或者根本没有与$retailer匹配的记录。提示1-始终在MySQL终端或其他MySQL GUI工具中测试您的查询,以便确保您的查询会成功,并进行调试。是的,我打印了$DELERKER,并对其进行了设置,我在数据库上手动运行了查询,结果返回了一行。建立数据库连接。显示错误。使用显式连接。它已经正常化了,我只是在测试它的连接。问题解决了,请键入数据库名称。还可以设置
ERRMODE\u WARNING
,在其中它的行为更像
mysqli
mysql\u*()
,但异常模式确实是最通用的,因为您可以将所有内容包装在
try/catch
块中。不,永远不要使用
rowCount
,因为它不准确,可能无法工作。如果执行失败,则执行异常。然后
fetchAll
并对数组中的元素进行计数,这就是获得“行计数”的方式。或者,您可以检查
$stmt->execute()
的结果,如果返回true,您可以
fetchAll
@N.B.我刚刚研究了一下,看起来您是对的。我从来没有遇到过Mysql上的RowCount问题,但是根据文档,其他数据库可以以不同的方式处理它。感谢tipThe,问题是即使MySQL也可能报告错误。在99.9%的MySQL部署中,您可能不会遇到这个问题,但事实是它不可靠——这很糟糕。如果您可以编辑您的答案,将计算数组的行数而不是
rowCount
,我将非常乐意投票支持您。