4

2つのクエリを次々に実行します。1つはINSERTで、もう1つは挿入された行を選択するSELECTです。行は正常に挿入されましたが(データベースで確認できます)、selectクエリは行を返すことができません。

SELECTクエリを再度実行すると、正しい結果が返されます。

入れる:

    $stmt = $pdo->prepare('INSERT INTO user (id ,name, lastname ,birthday, social_type, social_id) VALUES(NULL, :name, :lastname, :birthday, :social_type, :social_id)');
    $success=$stmt->execute(array(
        ':name' => $user['name'],
        ':lastname' => $user['lastname'],
        ':birthday' => $user['birthday'],
        ':social_type' => $user['social_type'],
        ':social_id' => $user['social_id']      
    ));

選択する

    $stmt = $pdo->prepare('SELECT * FROM user WHERE social_id = :social_id AND social_type = :social_type LIMIT 1');
    $stmt->execute(array(
        'social_id' => $user['social_id'],
        'social_type' => $user['social_type'] ));
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
4

1 に答える 1

2

INNODBを使用している場合:

INNODBを使用している場合、行が挿入されたことを確認したので、SELECTが挿入された実際の行のキーを照会している限り、SELECTとともに返されるはずです。(INSERT DELAYEDのような機能を使用していないのですか?それにより、行が返されなくなる可能性があります。)

MYISAMを使用している場合:

MyISAMはトランザクションをサポートしていないため、SELECTは挿入を返す必要がありますが、これが実際に保証されていることを示すものは見つかりません。

注:以下にリストされている最初のURLは、MYISAM(このリンクによるデフォルト)を使用している場合、INSERTSがテーブルをロックすることを示しています。ただし、2番目のURLは、挿入によって配置されたロックが読み取り可能なロックであることを示しているため、テーブルの読み取りが妨げられることはありませんでした。

http://www.sitepoint.com/mysql-mistakes-php-developers/

http://aarklondatabasetrivia.blogspot.com/2009/04/how-to-lock-and-unlock-tables-in-mysql.html

INNODBを使用している場合(続き):

    AUTOCOMMITがシステムで使用されている場合(よくわかりません)、選択した行が表示されているはずです(この質問は、挿入された行がデータベースに追加されたことが確認されたことを示しています)。

    トランザクションが使用中の場合、トランザクションはコミットされている必要があります(この質問は、挿入された行がデータベースに追加されたことが確認されたことを示しています)。

    最初に実行されるSELECTクエリは、2回目のクエリと同じですか?

    $user['social_id']INSERT後とSELECT時の値が同じでよろしいですか?

    何らかの理由でINSERTDELAYEDを使用している場合、行が返されない可能性があります


注:このURLによると、トランザクションを開始した場合、選択された行は次のSELECTステートメントに表示されます(PHPではありません)。

http://zetcode.com/databases/mysqltutorial/transactions/

このステートメントは、トランザクションを開始する場合、AUTOCOMMITを設定する必要がないことを意味します。

「MySQLは、トランザクションの一部ではないステートメントも自動的にコミットします。」

このURLは、PHPでトランザクションを開始する方法を説明しています。

PHP+MySQLトランザクションの例

于 2013-01-07T18:44:03.603 に答える