准备好的声明返回获取结果&计数

时间:2017-06-15 02:01:26

标签: 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_execute($dbd)) {
            echo "Execute Error: " . mysqli_error($dbconnection);
        } else {
            //do nothing
        }
    } else {
        echo "Prep Error: " . mysqli_error($dbconnection);
    }

    $result = mysqli_stmt_get_result($dbd);

所以上面的代码工作正常并返回我的结果。我现在要做的是使用相同的语句获取行数,但我不想写一个全新的预备语句。如果我编写一个单独的预准备语句并使用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);

抛出和错误,好像我无法运行同时使用相同的预准备语句获取结果和存储结果。我只是试图保持我的代码紧凑,尽可能多地重用。如果我将上面的内容分解为两个单独的预处理语句,它工作正常,我只是想知道有一种方法可以在我现有的语句中添加一行或两行并获得行数。或者我是否必须用新的stmt_init,stmt_prepare,bind_param,execute等编写一个全新的代码块...

1 个答案:

答案 0 :(得分:0)

我尝试了你的代码(并重新格式化了一下),但是当我同时使用store_result()和get_result()时,我无法使用它。我只能使用store_result然后使用bind_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);
}