Page 1 sur 1

[PDO][Sybase]Probleme avec @@identity

Posté : 26 juin 2006, 12:05
par zigz4g
Salut.

J'essaye de récupérer le dernier insert fait dans ma base avec l'aider de la l'instruction @@identity de sybase ASE 15.
Voici mon code de tests :
<?php
$dsn = 'dblib:host=192.168.0.0:5000;dbname=test';
try {
    $db = new PDO($dsn, 'test', 'xxxx');
    $query = 'insert into test (message) values ("test un message")';
    if ($db->exec($query) === false) {
        echo 'Erreur d\'insertion dans la base.<br />';
        exit;
    }
    else {
        echo 'Insertion reussie.<br />';
    }
    $query = 'insert into test (message) values ("test deux messages")';
    if ($db->exec($query) === false) {
        echo 'Erreur d\'insertion dans la base.<br />';
        exit;
    }
    else {
        echo 'Insertion reussie.<br />';
    }
    if (($last = $db->exec('select @@identity')) === false) {
        echo 'Erreur pour lire le dernier element.<br />';
        echo '<pre>';print_r($db->errorInfo());echo '</pre><br />';
    }
    else {
        echo 'Le last est : ', $last, '.<br />';
    }
}
catch (PDOException $e) {
    echo 'Le message d\'erreur est : ', $e->getMessage(), '<br />';
}
?>
Actuellement, ça me retourne cette sortie :

Code : Tout sélectionner

Insertion reussie. Le last est : 1.
J'aimerais un lastInsertId de PDO mais il ne gère pas cette fonctionnalité pour Sybase. Quelqu'un aurait une idée ???

Pour info j'ai testé select @@identity en ligne de commande et le résultat est plus ou moins bon.
Si je fais un insert et juste après un @@identity, j'ai bien le bon résultat. Par contre si je fais un insert avec PHP et après un select @@identity en ligne de commande, j'obtiens un mauvais résultat. Ca me parait correct car je n'ai pas la même connexion d'ouverte vers le serveur mais est-ce que quelqu'un pourrait me le confirmer ?
Merci.

Posté : 27 juin 2006, 15:27
par zigz4g
Je viens de trouver mon erreur sur l'identity.
Je donne la solution et je rajoute comment mettre a 1 l'autoincrement.
Une deuxième solution pour le prix d'une ;)
<?php
$dsn = 'dblib:host=192.168.0.0:5000;dbname=test';
try {
    $db = new PDO($dsn, 'test', 'xxxxx');
    $query = 'insert into test (message) values ("test un message")';
    for ($i = 1; $i <= 5; $i++) {
        if ($db->exec($query) === false) {
            echo 'Insertion KO.<br />';
            exit;
        }
        else {
            echo 'Insertion OK.<br />';
        }
    }
    $identity = $db->prepare('select @@identity');
    $identity->execute();
    foreach ($identity as $tmp) {
        echo 'Last id = '.$tmp[0].'<br />';
    }
    if ($db->exec('delete from test')) {
        echo 'Delete OK.<br />';
    }
    else {
        echo 'Delete KO.<br />';
    }
    $stmt = $db->prepare('sp_chgattribute  "test", "identity_burn_max", 0, \'1\'');
    if ($stmt->execute() === false) {
        echo '<pre>';print_r($stmt->errorInfo());echo '</pre><br />';
    }
}
catch (PDOException $e) {
    echo 'Message erreur : '.$e->getMessage().'<br />';
}
?>
sp_chgattribute
C'est la procédure pour remettre a 1 l'identity.