我正在尝试获取插入调用后返回的输出参数。我不知道如何纠正我的 PDO 语法,以便它返回新创建的部分的 ID。
connection.php
$host = "127.0.0.1";
$db = "my_db";
$user = "root";
$pass = "";
$charset = "utf8";
$dsn = "mysql:host=$host; dbname=$db; charset=$charset";
try {
$opt = [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new \PDO($dsn, $user, $pass, $opt);
}catch(Exception $e){
$errorMessage = $e->getMessage();
echo "<script type='text/javascript'>alert('$errorMessage');</script>";
}
daoimpl.php
function addNewSection(Section $section)
{
//$isSuccessful = false;
$outSectionId = 0;
$sectionName = $section->getSectionName();
$this->connection->beginTransaction();
try {
$sp_addNewSection = $this->connection->prepare('CALL addSection(?,@outSectionId)');
$sp_addNewSection->bind_param('s',$sectionName);
$sp_addNewSection->execute();
//not sure how to do it correctly here
$select = $this->connection->prepare('SELECT @outSectionId');
$select->execute();
$resultSet = $select->fetchAll(PDO::FETCH_ASSOC);
$outSectionId = $resultSet['@outSectionId'];
$this->connection->commit();
//$isSuccessful = true;
} catch (PDOException $e) {
die($e->getMessage());
$this->connection->rollback();
}
//return $isSuccessful;
return $outSectionId;
}
addSection存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `addSection`(`pSectionName` VARCHAR(255), OUT opSectionId INT)
BEGIN
INSERT INTO section(section_name)
VALUES(pSectionName);
SELECT LAST_INSERT_ID() INTO opSectionId;
SELECT opSectionId;
END
将输出参数部分 ID 值返回给 php 非常重要,因为我将在事务 block 中添加更多查询。
我就是无法让它工作。如果我在 MySQL Workbench 中运行/调用存储过程,我可以获取sectionId,但它在 PHP 中不起作用。
如果有任何帮助,我将不胜感激。
谢谢。
最佳答案
尝试在您的过程中定义DELIMITER
:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `addSection`(`pSectionName` VARCHAR(255), OUT opSectionId INT) BEGIN
INSERT INTO section(section_name) VALUES(pSectionName);
SELECT LAST_INSERT_ID() INTO opSectionId;
SELECT opSectionId;
END $$
DELIMITER ;
关于php - 从 PDO Callable 语句获取 out 参数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53141074/