php - 从 PDO Callable 语句获取 out 参数的正确方法

标签 php mysql pdo

我正在尝试获取插入调用后返回的输出参数。我不知道如何纠正我的 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/

相关文章:

javascript - 用javascript中的mysql数据库中的数据填充下拉列表

php - 如何组织数据库

mysql - 根据多边形的纬度、经度坐标从mysql数据库中选择行

php - 检查pdo中mysql存储函数的 bool 返回值

php - PHP 守护进程中的 "MySQL gone away",使用 pcntl_fork

php - codeigniter mysql停止连续第三次插入

PHP - 从 blob 文件创建图像并与另一个文件组合,同时保持透明度

php - 仅当 SQL 搜索给出结果时才读取数组

php - 如何使用 PHP 转换规范化数据集?

php - PDO 与 MYSQLI、准备语句和绑定(bind)参数