1

MySQL/PDO では、PDO::lastInsertID() が接続に対して最後に挿入されたオブジェクトの ID を返すと思います。どのメソッドでも呼び出すことができるシングルトン オブジェクトに PDO オブジェクトが含まれているため、サーバーへの HTTP 要求ごとに 1 つのデータベース接続しかありません。

class Database {
    public $db;
    private static $dsn;
    private static $instance;

    private function __construct()
    {
        $this->db = new PDO( self::$dsn );
    }

    public function __destruct()
    {
        $this->db = null;
    }

    public static function getInstance()
    {
        if ( !isset( self::$instance ) ) {
            $object = __CLASS__;
            self::$instance = new $object;
        }

        return self::$instance;
    }
}

$database = Database::getInstance();
$handle = $database->db->prepare(); // etc etc etc

間違っている場合は訂正してください。ただし、Apache への各 HTTP リクエストは個別の PHP インスタンスを生成すると考えているため、これらの PHP インスタンス間でシングルトンが共有されるとは思いません。また、コードに同時実行性がないため、そうすべきだと思います。直線的に起こっています。したがって、次のようなケースはあり得ないと思います。

  1. メソッド A はクエリ A で行を挿入します
  2. メソッド B はクエリ B で行を挿入します
  3. メソッド A は、クエリ A の結果を期待して最後に挿入された ID を要求し、代わりにクエリ B の結果を取得します。
  4. メソッド B は、最後に挿入された ID を要求し、クエリ B の結果を期待して取得します。

すでにこれらを読んでいますが、答えは見つかりませんでした:

PDO Last Insert ID は常に正しいものですか? http://php.net/manual/en/pdo.lastinsertid.php

4

1 に答える 1