【问题标题】:MySQL retrieve variable from Stored Procedure in PHP PDOMySQL从PHP PDO中的存储过程中检索变量
【发布时间】:2014-07-08 00:12:46
【问题描述】:

我已经看到这个问题被问了很多次,但它们都很长,我无法理解他们在做什么......所以,有人可以告诉我如何得到使用 PDO 将这个过程中的LAST_INSERT_ID() 转换为 php:

表:

CREATE TABLE names (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name varchar(50) NOT NULL
)

程序:

CREATE DEFINER=`root`@`localhost` PROCEDURE `simpleProcedure`(newname varchar(50), OUT returnid INT(11))
BEGIN
    INSERT INTO names (name) VALUES (newname);
    SET returnid = LAST_INSERT_ID();
END

我试过的PHP代码:

$stmt=$db->prepare("CALL simpleProcedure(:name,:returnid)");
$stmt->bindValue(':name',$name,PDO::PARAM_STR);
$stmt->bindParam(':returnid',$returnid,PDO::PARAM_INT,11);
$stmt->execute();
echo $returnid;

但是,对于比我有更多脑细胞的人来说,这可能很明显,这是行不通的。任何帮助表示赞赏。

关于我为什么认为这应该有效的参考:

http://www.php.net/pdo.prepared-statements(示例 #4)

【问题讨论】:

  • 您可能希望使用 bindparam 而不是 bindvalue。 bindparam 通过引用获取变量,这将允许语句将值设置回变量中。 php.net/manual/en/pdostatement.bindparam.php
  • 是的,试过了,没用
  • 所以,bindParam 似乎正在尝试工作,因为我现在没有收到 $returnid not set 错误......但它仍然没有 echo 任何东西跨度>
  • 在手册中说:length: Length of the data type. To indicate that a parameter is an OUT parameter from a stored procedure, you must explicitly set the length.
  • 不……那也没用……我已经更新了我的帖子以反映我的尝试

标签: php mysql pdo


【解决方案1】:

事实证明,这是一个持续了很长时间的错误……从 2005 年开始!

这是原始错误报告:2005 through to 2013。这是新的错误报告:From 2013 to the present

有多种方法可以返回答案,我找到了其中一种并进行了演示......

“诀窍”是从“mysql”过程中获取输出。这是一个“两阶段”的过程。

  • 第一部分是使用您的输入运行该过程,并告诉它存储结果的 MYSQL 变量。

  • 然后,您运行一个单独的查询来“选择”那些“mysql”变量。

这里描述的很清楚:php-calling-mysql-stored-procedures

更新(2017 年 1 月):

这里是一个例子,展示了变量'IN'、'INOUT'和'OUT'Mysql过程参数的使用。

在我们开始之前,这里有一些提示:

  • 开发时:在“模拟模式”下运行 PDO,因为它在确定过程调用中的错误时更加可靠。
  • 仅将 PHP 变量绑定到过程“IN”参数。

当您尝试将变量绑定到 INOUT 和 OUT 参数时,您会遇到一些非常奇怪的运行时错误。

像往常一样,我倾向于提供比所需更多的 cmets ;-/

运行时环境 (XAMPP):

  • PHP:5.4.4
  • Mysql: 5.5.16

源代码:

SQL 代码:

CREATE PROCEDURE `demoSpInOutSqlVars`(IN     pInput_Param  INT, /* PHP Variable will bind to this*/   
                                      /* --- */  
                                      INOUT  pInOut_Param  INT, /* contains name of the SQL User variable that will be read and set by mysql */
                                      OUT    pOut_Param    INT) /* contains name of the SQL User variable that will be set by mysql */
BEGIN
    /*
     * Pass the full names of SQL User Variable for these parameters. e.g. '@varInOutParam'
     * These 'SQL user variables names' are the variables that Mysql will use for:
     *    1) finding values
     *    2) storing results
     *
     * It is similar to 'variable variables' in PHP.  
     */
     SET pInOut_Param      := ABS(pInput_Param) + ABS(pInOut_Param); /* always positive sum  */
     SET pOut_Param        := ABS(pInput_Param) * -3;                /* always negative * 3  */ 
END$$

PHP 代码:

数据库连接:

$db = appDIC('getDbConnection', 'default'); // get the default db connection
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);    
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

注意:输出与EMULATE_PREPARES = false 相同。

设置所有要使用的 PHP 变量:

$phpInParam     = 5;                  
$phpInOutParam  = 404;          /* PHP InOut variable  ==> read and should be changed  */
$phpOutParam    = null;         /* PHP Out   variable  ==> should be changed           */

定义和准备 SQL 过程调用:

$sql = "call demoSpInOut(:phpInParam, 
                         @varInOutParam, /* mysql variable name will be read and updated */
                         @varOutParam)"; /* mysql variable name that will be written to  */

$stmt = $db->prepare($sql);

绑定 PHP 变量并设置 SQL 变量:

  • 1) 绑定 PHP 变量

    $stmt->bindParam(':phpInParam', $phpInParam, PDO::PARAM_INT);

  • 2) 设置 SQL 用户 INOUT 变量

    $db->e​​xec("SET @varInOutParam = $phpInOutParam"); // 这是安全的,因为它只是将值设置到 MySql 变量中。

执行程序:

$allOk = $stmt->execute();

将 SQL 变量放入 PHP 变量中:

$sql = "SELECT @varInOutParam AS phpInOutParam,
               @varOutParam   AS phpOutParam
        FROM dual";
$results = current($db->query($sql)->fetchAll());

$phpInOutParam = $results['phpInOutParam'];
$phpOutParam   = $results['phpOutParam'];

注意:也许不是最好的方法;-/

显示 PHP 变量

"$phpInParam:"     => "5"
"$phpInOutParam:"  => "409"
"$phpOutParam:"    => "-15"

【讨论】:

  • 但这并没有使用应使用的OUT 函数,如php.net/pdo.prepared-statements 中所述(示例#4)。如果我打算使用另一个 SEELCT 语句,我可以将程序更改为使用 SELECT LAST_INSERT_ID() AS returnid 而不是 SET returnid = LAST_INSERT_ID()
【解决方案2】:

让我先说这是一个猜测,因为我从不使用准备好的语句......

通常你不绑定你的返回值,你这样做

$status = $statement->execute(  );

$resultArray = $statement->fetchAll( );
$statement->closeCursor( );
if (!is_array($resultArray)) {
    return array();
}
return $resultArray[0]['returnid'];

加点盐……

【讨论】:

猜你喜欢
  • 2013-03-22
  • 2014-09-07
  • 2019-06-27
  • 1970-01-01
  • 2013-11-02
  • 2013-03-13
  • 2012-09-12
  • 2021-04-08
  • 2013-09-10
相关资源
最近更新 更多