2

PDOを使用して挿入クエリを実行し、lastInsertId()を使用して新しく作成されたIDを取得しています。これはすべて私のローカルホスト環境で機能しています。

まったく同じコードをサーバーに移動すると、insertステートメントが機能して新しい行がデータベースに挿入されても、lastInsertId()は常に空白を返します。これは私の構成の設定ですか?どんな助けでも大歓迎です。

$insertstmt = $dbinsert->prepare($insertsql);

// bindParams ...

$insertstmt->execute();

// always blank
$id = $dbinsert->lastInsertId();

$dbinsert = null;
4

2 に答える 2

4

このメソッドを使用してlastInsertId()を置き換えることになりました:http://php.net/manual/en/pdo.lastinsertid.php#105580

$temp = $sth->fetch(PDO::FETCH_ASSOC);
于 2012-12-06T19:59:53.440 に答える
0

この問題の解決策をブログで説明しました。コード内のSQLクエリを直接変更できなかったため、この方法でPDOクラスを拡張しました

class BetterPDO extends \PDO
{
    protected $stmt;
    protected $withIdentitySelect;

    public function prepare($statement, $driver_options = null)
    {
        $this->$withIdentitySelect = false;

        if (preg_match('/^insert/i', $statement)) {
            $statement = "{$statement}; select SCOPE_IDENTITY() AS 'Identity';";
            $this->$withIdentitySelect = true;
        }

        $this->stmt = parent::prepare($statement, is_array($driver_options) ? $driver_options : []);
        return $this->stmt; 
    }

    public function query($statement)
    {              
        $this->$withIdentitySelect = false;

        if (preg_match('/^insert/i', $statement)) {
            $statement = "{$statement}; select SCOPE_IDENTITY() AS 'Identity';";
            $this->$withIdentitySelect = true;
        }

        $this->stmt = parent::query($statement);
        return $this->stmt;     
    }

    public function lastInsertId($name = null)
    {
        $lastIndex = 0;

        if (($this->$withIdentitySelect) && ($this->stmt->columnCount() > 0)) {
            $lastIndex = $this->stmt->fetchColumn(0);
            $this->stmt->closeCursor();
        }

        return $lastIndex;
    }
}
于 2017-09-04T10:48:54.057 に答える