简体   繁体   中英

PHP returning output from a Stored Procedure

I have seen and read a few questions about this but I can't figure out what's going on. I have a SP that inserts into a table and then returns just a single column with the last inserted id(Since I'm executing multiple statments lastInsertID() doesn't work.

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

Now when I execute this is MySql is returns the value of the last inserted record. When I try to access it with PHP I get 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;

I have also tried using an output Paramater like so:

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;

When I try it like this I get this error:

{"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.}}

So I tried FetchAll and got the same error.. I then tried this which I found here which works but since it's only returning 1 row with 1 feild it doesn't seem like I should really need to loop through anything:

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

So if there a better way to do this? I'm sure there is. I'm pretty new to PHP and mySQL but have a lot of experience with SQLServer so any insight would be appreciated.

I figured it out.. This works well and I don't need the input paramater or the loop:

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM