2015-07-09 6 views
0

Я видел и читал несколько вопросов об этом, но я не могу понять, что происходит. У меня есть SP, который вставляет в таблицу, а затем возвращает только один столбец с последним добавленным идентификатором (Так как я выполнение нескольких statments lastInsertID() не работает.PHP, возвращающий результат из хранимой процедуры

CREATE DEFINER=`graffixnyc`@`%` PROCEDURE `createUser`(
IN userName VARCHAR(50), 
IN firstName VARCHAR(25), 
IN lastName VARCHAR(25), 
IN pass text) 
BEGIN 
SELECT FLOOR(RAND() * 0xFFFFFFFF) into @salt; 
INSERT INTO `users` (`username`, `first_name`,`last_name`,`salt`,`password`) 
VALUES (userName, firstName,lastName, (select 
@salt),sha2(concat(md5(pass(select @salt)),256)); 
SELECT LAST_INSERT_ID() as lastinsert; 

END 

Теперь, когда я исполню это MySql это возвращает значение последней вставленной записи при попытке доступа к нему с PHP я получаю Null

$paramUsername = $req->params('username'); // Getting parameter with names 
$paramFirstName = $req->params('firstname'); 
$paramLastName = $req->params('lastname'); 
$paramPassword = $req->params('password'); 
$sql = "CALL createUser(:username, :firstname,:lastname,:password)"; 
try { 
    $dbCon = getConnection(); 
    $stmt = $dbCon->prepare($sql); 
    $stmt->bindParam("username", $paramUsername); 
    $stmt->bindParam("firstname", $paramFirstName); 
    $stmt->bindParam("lastname", $paramLastName); 
    $stmt->bindParam("password", $paramPassword); 
    $stmt->execute(); 
    $row= $stmt->fetch(); 
    $last_id=$row["lastinsert"]; 
    $user->id =$last_id; 

Я также попытался использовать выход так, как в параметре:..

CREATE DEFINER=`graffixnyc`@`%` PROCEDURE `createUser`(
IN userName VARCHAR(50), 
IN firstName VARCHAR(25), 
IN lastName VARCHAR(25), 
IN pass text, 
OUT lastinsert INT) 
BEGIN 
SELECT FLOOR(RAND() * 0xFFFFFFFF) into @salt; 
INSERT INTO `users` (`username`, `first_name`,`last_name`,`salt`,`password`) 
VALUES (userName, firstName,lastName, (select 
@salt),sha2(concat(md5(pass(select @salt)),256)); 
SET lastinsert=(SELECT LAST_INSERT_ID()); 
SELECT lastinsert; 

END 

$paramUsername = $req->params('username'); 
$paramFirstName = $req->params('firstname'); 
$paramLastName = $req->params('lastname'); 
$paramPassword = $req->params('password'); 
$sql = "CALL createUser(:username, :firstname,:lastname,:password, 
@lastinsert)"; 

try { 
    $dbCon = getConnection(); 
    $stmt = $dbCon->prepare($sql); 
    $stmt->bindParam("username", $paramUsername); 
    $stmt->bindParam("firstname", $paramFirstName); 
    $stmt->bindParam("lastname", $paramLastName); 
    $stmt->bindParam("password", $paramPassword); 
    $stmt->execute(); 
    $row = $dbCon->query("select @lastinsert;")>fetch(); 
    $last_id=$row["@lastinsert"]; 
    $user->id =$last_id; 

Когда Я стараюсь это так, я получаю эту ошибку:

{"error":{"text":SQLSTATE[HY000]: General error: 2014 Cannot execute queries 
while other unbuffered queries are active. Consider using 
PDOStatement::fetchAll(). Alternatively, if your code is only ever going to 
run against mysql, you may enable query buffering by setting the 
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.}} 

Так что я попытался FetchAll и получил ту же ошибку .. Затем я попытался это, который я нашел здесь, который работает, но так как он возвращает только 1 строку с 1 Фейлдом это Безразлично Кажется, мне не нужно было ничего перебирать:

$stmt->execute(); 
$stmt = $dbCon->prepare("select @lastinsert;"); 
$outputArray = $dbCon->query("select @lastinsert;")->fetchAll(); 
foreach($outputArray as $row) 
{ 
    $last_id=$row["@lastinsert"]; 
} 

Итак, если есть лучший способ сделать это? Я уверен, что есть. Я довольно новичок в PHP и mySQL, но имею большой опыт работы с SQLServer, поэтому любое понимание будет оценено.

+0

вы пробовали вместо 'print_r' строки? – FrankerZ

ответ

0

Я понял это .. Это хорошо работает, и мне не нужен входной или В параметре цикла:

SP:

CREATE DEFINER=`graffixnyc`@`%` PROCEDURE `createUser`(
IN userName VARCHAR(50), 
IN firstName VARCHAR(25), 
IN lastName VARCHAR(25), 
IN pass text) 
BEGIN 
SELECT FLOOR(RAND() * 0xFFFFFFFF) into @salt; 
INSERT INTO `users` (`username`, `first_name`, 
`last_name`,`salt`,`password`) 
VALUES (userName, firstName,lastName, (select @salt),sha2(concat(md5(pass 
),(select @salt)),256)); 
SELECT LAST_INSERT_ID()as lastinsert; 

END 

PHP:

$paramUsername = $req->params('username'); 
$paramFirstName = $req->params('firstname'); 
$paramLastName = $req->params('lastname'); 
$paramPassword = $req->params('password'); 
$sql = "CALL createUser(:username, :firstname,:lastname,:password)"; 
try { 
    $dbCon = getConnection(); 
    $stmt = $dbCon->prepare($sql); 
    $stmt->bindParam("username", $paramUsername); 
    $stmt->bindParam("firstname", $paramFirstName); 
    $stmt->bindParam("lastname", $paramLastName); 
    $stmt->bindParam("password", $paramPassword); 
    $stmt->execute(); 
    $user->id =$stmt->fetchColumn(0); 
    $dbCon = null; 
Смежные вопросы