2017-06-15 19 views
0

私は、私のクエリの結果と、可能な場合は2回のトリップを行う必要がある行数wihtoutの両方を取得しようとしています。私は手続き的な方法で準備文を使用しています。私のコードは次の通りです:Prepared Statement Return結果とカウントを取得

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

ザ・スローおよびエラー。私のコードをコンパクトに保ち、可能な限り再利用しようとしています。私は上記の2つの分離準備文にそれを壊す場合、それは正常に動作します、ちょうど私の既存の文に行を追加して行数を取得する方法があると思っています。または、新しい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); 
} 
関連する問題