Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 准备报表返回获取结果&;计数_Php_Mysql_Count_Prepared Statement - Fatal编程技术网

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);
}
试试这个-