1

次の PDO ステートメントを機能させようとしていますが、問題が発生しています。行数を取得しようとすると、0 を取得し続けますが、1 行が必要であることはわかっています。mysqli ステートメントとして (PDO に変更しようとする前に) 実行すると、完全に機能しました。コードは次のとおりです。

    require_once ('pdo.php');
$isbn = $_POST['isbn'];
    // check to see if the isbn is a "problem" isbn or not
$problem = $conn->prepare("select isbn, note from problem where isbn = :isbn");
$problem->bindParam(":isbn", $isbn);
$problem->execute();
print_r($problem);

$num_rows = $problem->rowCount();

print_r($num_rows); die;

編集: ここに pdo.php があります:

    <?php

function db_connect()
{ 
$db = new PDO("mysql:host=localhost; db=bookcell_BCOS_final", "xxxxx", "xxxxx");
return($db);
}
?>

接続が機能していることはわかっていますが、$num_rows に対して 0 が返されます。私はここでどんな間違いを犯していますか?

4

5 に答える 5

1

ちょっとした癖と最適化に加えて、あなたのコードは私にはうまく見えます。投稿された値isbnは、データを取得していない理由である可能性があります。

$problem = $conn->prepare("select isbn, note from problem where isbn = :isbn"); 
$problem->bindParam(":isbn", $_POST['isbn'], PDO::PARAM_STR); // <-- thats what parameter binding is for 
$problem->execute(); 
print_r($problem); 

$num_rows = $problem->rowCount(); // <-- gives the number of rows, not columnCOunt 

print_r($num_rows); die; 
于 2012-09-27T13:37:33.827 に答える
0

の構文$num_rows = $problem->columnCount();は完全に正しいです。あなたは試すことができます、

$problem->execute(array("isbn" => $isbn));

の代わりにbindParam

于 2012-09-27T13:35:35.763 に答える
0

いいえを取得するため。行の場合、使用する必要がありますpdo::rowCount()--マニュアルはこちら

于 2012-09-27T13:39:02.813 に答える
0

PDO で、executeステートメントが機能したかどうかを確認するには、戻り値 (bool) を確認します。

$success = $problem->execute();

if (!$success) {
    $arr = $problem->errorInfo();
    print_r($arr);
}

rowCount()また、代わりに探しているかもしれませんがcolumnCount()、エラー処理があなたの最大の問題だと思います。

さらに、エラーが発生するたびに PDO に例外をスローさせることができます。比較してください。

于 2012-09-27T13:40:17.600 に答える
0

データベース ドライバーと実行中のモードによっては、PDO が行数を取得できない場合があります。のドキュメントをPDOStatement::rowCount()よく見てください:

関連する PDOStatement によって実行された最後の SQL ステートメントが SELECT ステートメントであった場合、一部のデータベースは、そのステートメントによって返された行数を返すことがあります。ただし、この動作はすべてのデータベースで保証されているわけではなく、移植可能なアプリケーションに依存するべきではありません。

これは、多くの場合、データベースが完全な結果を取得してバッファリングするのではなく、カーソルを使用するためです (これは古いmysql_*関数の動作です)。この場合、すべての行を確認するまで、データベースは行数を認識しません。カーソルは、ファイル システム ポインターのようなものと考えてください。ファイルの最後までシークするまで、ファイル サイズはわかりません。

于 2012-09-27T13:42:25.777 に答える