1

我正在尝试使以下 PDO 语句正常工作并遇到问题。当我试图获取行数时,我一直得到 0,但我知道应该有 1 行。当我将它作为 mysqli 语句运行时(在尝试将其更改为 PDO 之前),它运行良好。这是代码:

    require_once ('pdo.php');
$isbn = $_POST['isbn'];
    // check to see if the isbn is a "problem" isbn or not
$problem = $conn->prepare("select isbn, note from problem where isbn = :isbn");
$problem->bindParam(":isbn", $isbn);
$problem->execute();
print_r($problem);

$num_rows = $problem->rowCount();

print_r($num_rows); die;

编辑:这是 pdo.php:

    <?php

function db_connect()
{ 
$db = new PDO("mysql:host=localhost; db=bookcell_BCOS_final", "xxxxx", "xxxxx");
return($db);
}
?>

我知道我的连接有效,但我得到 $num_rows 的 0。我在这里犯了什么错误?

4

5 回答 5

1

除了一点点怪癖和优化之外,您的代码对我来说看起来还不错。发布的值isbn可能是您没有获得数据的原因:

$problem = $conn->prepare("select isbn, note from problem where isbn = :isbn"); 
$problem->bindParam(":isbn", $_POST['isbn'], PDO::PARAM_STR); // <-- thats what parameter binding is for 
$problem->execute(); 
print_r($problem); 

$num_rows = $problem->rowCount(); // <-- gives the number of rows, not columnCOunt 

print_r($num_rows); die; 
于 2012-09-27T13:37:33.827 回答
0

for 的语法$num_rows = $problem->columnCount();是完全正确的。你可以试试,

$problem->execute(array("isbn" => $isbn));

而不是bindParam.

于 2012-09-27T13:35:35.763 回答
0

为了获得否。行数,您需要在此处使用pdo::rowCount()--手动

于 2012-09-27T13:39:02.813 回答
0

在 PDO 中验证您的execute语句是否有效,检查返回值(布尔值):

$success = $problem->execute();

if (!$success) {
    $arr = $problem->errorInfo();
    print_r($arr);
}

此外,您可能正在寻找rowCount()而不是,columnCount()但我认为错误处理是您最关心的问题。

此外,您可以让 PDO 在每次出现错误时抛出异常,比较:

于 2012-09-27T13:40:17.600 回答
0

根据数据库驱动程序及其运行的模式,PDO 可能无法为您提供行数。仔细查看文档PDOStatement::rowCount()

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

这是因为在许多情况下,数据库使用游标而不是获取完整结果并缓冲它们(这是旧mysql_*函数的行为方式)。在这种情况下,数据库不知道有多少行,直到您查看了所有行。将游标想象成文件系统指针之类的东西——在寻找文件末尾之前,您无法知道文件大小。

于 2012-09-27T13:42:25.777 回答