2017-06-15 55 views
0

我想要同时获得我的查询结果和行计数,但是如果可能的话,必须使两次行数为数据库行。我正在以程序方式使用准备好的陈述。我的代码如下:准备好声明返回获取结果和计数

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

+0

试试这个 - HTTP ://php.net/manual/en/mysqli-stmt.num-rows.php – ajreal

回答

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); 
}