Php 准备报表返回获取结果&;计数
我正在尝试获取查询结果和行计数,如果可能的话,不必对数据库进行两次访问。我以程序的方式使用准备好的声明。我的代码如下:Php 准备报表返回获取结果&;计数,php,mysql,count,prepared-statement,Php,Mysql,Count,Prepared Statement,我正在尝试获取查询结果和行计数,如果可能的话,不必对数据库进行两次访问。我以程序的方式使用准备好的声明。我的代码如下: $dbd = mysqli_stmt_init($dbconnection); if (mysqli_stmt_prepare($dbd, "SELECT * FROM Contacts WHERE First_Name = ?" )) { mysqli_stmt_bind_param($dbd, "s", $val1); if (!mysqli_stmt_execut
$dbd = mysqli_stmt_init($dbconnection);
if (mysqli_stmt_prepare($dbd, "SELECT * FROM Contacts WHERE First_Name = ?" )) {
mysqli_stmt_bind_param($dbd, "s", $val1);
if (!mysqli_stmt_execute($dbd)) {
echo "Execute Error: " . mysqli_error($dbconnection);
} else {
//do nothing
}
} else {
echo "Prep Error: " . mysqli_error($dbconnection);
}
$result = mysqli_stmt_get_result($dbd);
因此,上面的代码工作正常,并返回我的结果。我现在想做的是使用相同的语句获取行数,但我不想编写一个全新的语句。如果我编写一个单独的prepared语句并使用store_results和num_rows,我会得到行数,但这将迫使我不得不编写一个完整的新代码块并跳到db。我试图做以下事情,但它抛出错误:
$dbd = mysqli_stmt_init($dbconnection);
if (mysqli_stmt_prepare($dbd, "SELECT * FROM Contacts WHERE First_Name = ?" )) {
mysqli_stmt_bind_param($dbd, "s", $val1);
if (!mysqli_stmt_execute($dbd)) {
echo "Execute Error: " . mysqli_error($dbconnection);
} else {
//do nothing
}
} else {
echo "Prep Error: " . mysqli_error($dbconnection);
}
$result = mysqli_stmt_get_result($dbd);
mysqli_stmt_store_result($dbd);
$rows = mysqli_stmt_num_rows($dbd);
抛出和错误,就好像我不能使用同一个prepared语句同时运行get results和store results一样。我只是尽可能地保持代码的紧凑性和重用性。如果我把上面的语句分成两个独立的语句,它就可以正常工作了,我只是想知道有没有一种方法可以在我现有的语句中添加一两行,然后得到行数。或者我必须用新的stmt_init、stmt_prepare、bind_param、execute等编写一整段新代码。我尝试了你的代码(并重新格式化了一点),但当我同时使用store_result()和get_result()时,我无法让它工作。我只能使用store\u result然后bind\u result()
因此,另一种方法是获取所有行,然后对它们进行计数:
例如:
$sql = "SELECT * FROM Contacts WHERE First_Name = ?";
$stmt = mysqli_stmt_init($dbconnection);
if (mysqli_stmt_prepare($stmt, $sql) === false) {
trigger_error("Prep Error: " . mysqli_error($dbconnection));
return 1;
}
if (mysqli_stmt_bind_param($stmt, "s", $val1) === false) {
trigger_error("Bind Error: " . mysqli_stmt_error($stmt));
return 1;
}
if (mysqli_stmt_execute($stmt) === false) {
trigger_error("Execute Error: " . mysqli_stmt_error($stmt));
return 1;
}
$result = mysqli_stmt_get_result($stmt);
$rows = mysqli_fetch_all($result, MYSQLI_ASSOC);
$num_rows = count($rows);
print "$num_rows rows\n";
foreach ($rows as $row) {
print_r($row);
}
在我看来,PDO要容易得多:
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test", "xxxx", "xxxxxxxx");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$sql = "SELECT * FROM Contacts WHERE First_Name = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$val1]);
$num_rows = $stmt->rowCount();
print "$num_rows rows\n";
while ($row = $stmt->fetch()) {
print_r($row);
}
试试这个-