Я видел и читал несколько вопросов об этом, но я не могу понять, что происходит. У меня есть 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, поэтому любое понимание будет оценено.
вы пробовали вместо 'print_r' строки? – FrankerZ