2015-07-09 186 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;