【问题标题】:Prepared Statement Return Get Results & Count准备好的语句返回获取结果和计数
【发布时间】:2017-06-15 02:01:26
【问题描述】:

我正在尝试同时获得查询的结果和行数,但如果可能的话,不必两次访问数据库。我以程序方式使用准备好的语句。我的代码如下:

 $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 等编写一个全新的代码块...

【问题讨论】:

标签: php mysql count prepared-statement


【解决方案1】:

我尝试了您的代码(并对其进行了一些重新格式化),但是当我同时使用 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);
}

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 2021-08-02
    • 2011-01-23
    • 2014-09-15
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多