0

Linux ワークステーションから MS SQL Server 2008 データベースに接続するために DBLIB ドライバーを使用しています。

DBLIB は PDO::lastInsertId() メソッドをサポートしていないため、最後に挿入された ID を取得するために SELECT SCOPE_IDENTITY() を使用していますが、コードが機能していません。

私のコードを見てみましょう:

  function setDataByQuery($query, $values){
    $sth = $this->dbLink->prepare($query);
    $this->bindParams($sth, $values);
    $sth->execute();
    var_dump($sth->fetchAll(PDO::FETCH_ASSOC));
    //$this->lastId = $this->dbLink->lastInsertId();
    return true;
    }
private function bindParams(&$sth, $values){
    $type = array('i'=>PDO::PARAM_INT, 's'=>PDO::PARAM_STR);
    foreach($values as $key=>$value)
        $sth->bindParam($key, $value['data'], $type[$value['type']]);
    }

メソッド setDataByQuery は問題なく挿入されますが、最後に挿入された ID を取得しようとすると、空の配列が取得されます。

私の挿入クエリは次のようになります。

"INSERT INTO personas (nombres, apellido_paterno, apellido_materno, fecha_nacimiento, sexo, estado_civil, direccion, codigo_postal, id_delegacion, id_empresa)
                VALUES (:n,:aP,:aM,'1900-1-1','H','Unión Libre','Dirección','0000',1,1);SELECT SCOPE_IDENTITY() AS theID;";

この質問によると、問題はないはずですが、違いは、準備されたクエリを使用しているため、問題が発生する可能性があることです。助けてください。

4

1 に答える 1

0

何らかの理由で、両方のステートメントが同じクエリ内にある場合、これは機能しなかったため、仕事をする別の関数を作成しました。

function setDataByQuery($query, $values){
    $sth = $this->dbLink->prepare($query);
    $this->bindParams($sth, $values);
    if(!$sth->execute())
            return false;
    $this->lastId = $this->lastInsertId();
    //$this->lastId = $this->dbLink->lastInsertId();
    return true;
    }
 private function lastInsertId($seqname = null){
    $sth = $this->dbLink->prepare('SELECT SCOPE_IDENTITY() AS id');
    $sth->execute();
    $result = $sth->fetch();
    return $result['id'];
    }
于 2012-05-04T22:54:08.473 に答える