php - PDO SQLiteクエリのゼロ結果の問題

原文 php sqlite pdo

調べてみましたが、これに関する情報を見つけることができません。コードの問題なのか、インメモリSQLiteデータベースとPDOの既知の問題なのかはわかりません。

基本的に、メモリ内のSQLiteデータベーステーブルに単一の行を挿入した後、挿入されたアイテムと一致しないクエリが行を返さないことを期待します。ただし、次のコードは単一の行(false)を提供しますが、実際のP​​DOエラーコードは提供しません。

<?php

    // Create the DB
    $dbh = new PDO('sqlite::memory:');
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // Data we'll be using
    $name = 'Entry';

    // Create DB table
    $dbh->query('
        CREATE TABLE
            Test
            (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name VARCHAR(50) NOT NULL
            )
    ');

    // Insert data
    $stmt = $dbh->prepare('
        INSERT INTO
            Test
            (
                name
            )
        VALUES
            (
                :name
            )
    ');

    $stmt->bindParam(':name', $name, PDO::PARAM_STR, 50);
    $stmt->execute();

    // Check data has actually been inserted
    $entries = $dbh->query('
        SELECT
            *
        FROM
            Test
    ')->fetchAll(PDO::FETCH_ASSOC);

    var_dump($entries);

    // Query DB for non-existent items
    $stmt = $dbh->prepare('
        SELECT
            *
        FROM
            Test
        WHERE
            name != :name
    ');

    $stmt->bindParam(':name', $name, PDO::PARAM_STR);
    $stmt->execute();

    // How many rows returned
    echo $stmt->rowCount();

    // Actual data returned
    var_dump($stmt->fetch(PDO::FETCH_ASSOC));
?>


私はいくつかのハッカーで問題を回避することができましたが、これを行う必要がないのは素晴らしいことです。

<?php

    echo (
        (0 == $stmt->rowCount()) || 
        (
            (1 == $stmt->rowCount()) && 
            (false === (($row = $stmt->fetch(PDO::FETCH_ASSOC)))) && 
            ('0000' == array_pop($dbh->errorInfo()))
        )
    ) ? 'true' : 'false';

?>


誰かが私が犯したかもしれない重大な間違いを助けたり指摘したりできますか?
答え
PDOStatement::rowCount()が戻る


...対応するPDOStatementオブジェクトによって実行された最後のDELETE、INSERT、またはUPDATEステートメントの影響を受けた行の数。

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


PDOへようこそ。ここでは、簡単なものは機能し、それほど簡単ではないものは1日を台無しにします。 SQLiteは、「結果セットにいくつの行があるか」という信頼性がないドライバの1つです。関数。コメントから:


SQLite 3.x以降、SQLite API自体が変更され、すべてのクエリは「ステートメント」を使用して実装されます。このため、SQLite API自体はこの機能を提供していないため、PDOがSELECT結果のrowCountを知る方法はありません。


PDOStatement::fetch()からfalseが返された場合、「何も返されなかった」ことが保証されます。チェックコードが少し読みにくい場合でも、チェックコードは完全に正常です。独自の正気のために、PDOおよびPDOStatementからのラッピングまたは派生を検討することをお勧めします。

(免責事項:私はPDOのファンです。)
関連記事

php - PHPハッシュraw_output形式

php - PHPExcel:結合セルにスタイルを設定できません

php - Codeigniterセッションが長い配列で機能しない

php - アカウントwoocommerceを書き換え、ログインして、サブドメインにURLを登録する

php - LaravelのEager Load Constraints Filterの問題

php - 小枝テンプレートを使用してXMLを表示する

javascript - PHP配列へのJavaScript

php - 外部文字を返すSQLへのPHPクエリ、部分的にのみ正しいのはなぜですか?

php - 定数としてのSESSION変数の格納

php - PHPで常時連絡を使用してトランザクションメールを送信する方法