2015-07-09 106 views
0

我已經看過並閱讀了一些關於此的問題,但我無法弄清楚發生了什麼。我有一個插入到表中,然後用最後插入的ID只返回單個列(因爲我執行多個statments一個SP 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我得到空訪問它

$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; 

我一直在使用的輸出Paramater像這樣也試過:。

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排它doesn似乎我真的需要循環任何東西:

$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

我想通了。這工作得很好,我不需要輸入paramater或循環:

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;