2012-07-31 1 views
0

Je suis un nouvel apprenant et j'essaie d'obtenir le dernier identifiant inséré d'un enregistrement.Obtention du dernier identifiant d'enregistrement via la procédure

Mais ici, il me donne l'erreur suivante:

Erreur: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'SELECT @p_customerId' à la ligne 1

Une idée pour résoudre ce problème.

Merci,

<?php 
class MyConnection{ 
    var $db_host = '127.0.0.1'; 
    var $db_user = 'root'; 
    var $db_password = 'xxx'; 
    var $db_name = 'xxx'; 
    var $connection; 

    function Connect(){ 
     $this->connection = @mysqli_connect($this->db_host, $this->db_user, $this->db_password) 
     or 
     die("Error: ".mysqli_connect_error()); 
     mysqli_select_db($this->connection, $this->db_name); 
     mysqli_query($this->connection, "SET NAMES 'utf8'"); 
    } 

    function Disconnect(){ 
     mysqli_close($this->connection); 
    } 

    function ExecSQL($query){ 
     $result = mysqli_query($this->connection, $query) or die('Error: '.mysqli_error($this->connection)); 
     return $result; 
    } 

    function LastInsertId() { 
     return mysqli_insert_id(); 
    } 
} 

if (isset($_POST['btnSubmit'])) { 
    $v_custname = mysql_real_escape_string($_POST['txtcustname']); 
    $v_custphone = mysql_real_escape_string($_POST['txtcustphone']); 
    $v_custemail = mysql_real_escape_string($_POST['txtcustemail']); 

    $conn = new MyConnection(); 
    $conn->Connect(); 
    $conn->ExecSQL("CALL sp_customer('$v_custname','$v_custphone','$v_custemail',@p_customerId); SELECT @p_customerId;"); 
    echo $conn->LastInsertId(); 
    $conn->Disconnect(); 

} 
?> 

Voici la procédure;

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_customer`(IN `p_customerName` VARCHAR(50), IN `p_customerPhone` VARCHAR(50), IN `p_customerEmail` VARCHAR(50), OUT `p_customerId` INT) 
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
BEGIN 
INSERT INTO customer(CustomerName, CustomerPhone, CustomerEmail)VALUES(p_customerName, p_customerPhone, p_customerEmail); 
SELECT LAST_INSERT_ID() as p_customerId; 
END 

Répondre

1

Vous essayez d'exécuter plusieurs instructions dans une requête.

Lire ceci: http://php.net/manual/en/mysqli.quickstart.multiple-statement.php

Bien sûr, je ne sais pas pourquoi vous avez ajouté SELECT @p_customerId; à la requête ... Votre ligne de code suivante demande le dernier insert ID de toute façon. Pourquoi ne supprimez-vous pas cela et faites une requête à une seule instruction?

+0

J'ai enlevé que l'on et fait quelques modifications sur le code, mais maintenant son retour 0 j'ai ajouté une autre fonction: { \t \t $ result = mysqli_insert_id lastInsertId() Fonction \t ($ this-> connexion); \t \t return $ résultat; \t} Et en essayant de le faire passer: \t $ conn = new MyConnection(); \t $ conn-> Connect(); \t $ conn-> ExecSQL ("CALL sp_customer ('$ v_custname', '$ v_custphone', '$ v_custemail', @ p_customerId)"); \t echo $ conn-> LastInsertId(); – Dan

+0

Oh, désolé ... Votre fonction a déjà appelé 'LAST_INSERT_ID()' et l'a définie dans la variable 'p_customerId'. Donc, au lieu d'appeler '$ conn-> LastInsertId()', pouvez-vous simplement faire une seconde requête pour faire le 'SELECT @p_customerId;'? – paddy

Questions connexes