我试图让以下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。我在这里犯了什么错误?
答案 0 :(得分: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;
答案 1 :(得分:0)
$num_rows = $problem->columnCount();
的语法完全正确。你可以试试,
$problem->execute(array("isbn" => $isbn));
而不是bindParam
。
答案 2 :(得分:0)
获得号码。行,您需要使用pdo::rowCount()
- manual here
答案 3 :(得分:0)
在PDO中,如果execute
statement确实有效,请检查返回值(布尔):
$success = $problem->execute();
if (!$success) {
$arr = $problem->errorInfo();
print_r($arr);
}
此外,您可能正在寻找rowCount()
而不是columnCount()
,但我认为错误处理是您最关心的问题。
此外,每次出现错误时,您都可以让PDO抛出异常,比较:
答案 4 :(得分:0)
根据数据库驱动程序及其运行的模式,PDO可能无法为您提供行计数。仔细查看the documentation for PDOStatement::rowCount()
:
如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。 但是,并不保证所有数据库都会出现这种情况,不应依赖于便携式应用程序。
这是因为在许多情况下,数据库使用游标而不是获取完整结果并缓冲它们(这是旧mysql_*
函数的行为方式)。在这种情况下,在查看所有行之前,数据库不知道有多少行。将光标视为文件系统指针 - 在搜索到文件末尾之前,您无法知道文件大小。