当前位置: 首页 > 面试题库 >

MySQL从PHP PDO中的存储过程中检索变量

越高峻
2023-03-14
问题内容

我已经看到了这个问题问的时候负荷,但他们都真的很长了,我自己在做什么......所以,就不能回避我的头,可能有人告诉我怎么走LAST_INSERT_ID(),从这个使用PDO将过程转换为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)


问题答案:

事实证明,这是自2005年以来已经存在很长时间的错误!

这是原始的错误报告:2005年到2013年。这是新的错误报告:从2013年至今。

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

“技巧”是从“ mysql”过程获取输出。这是一个“两阶段”过程。

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

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

在这里很清楚地描述了它:php-calling-mysql-stored-
procedures

更新(2017年1月):

这是一个示例,显示Mysql过程参数的“ IN”,“ INOUT”和“ OUT”变量的用法。

在我们开始之前,有一些技巧:

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

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

像往常一样,我倾向于提供比要求更多的评论;-/

运行时环境(XAMPP):

  • 的PHP:5.4.4
  • MySQL的:5.5.16

源代码:

  • SQL过程
  • PHP与输出

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 User INOUT变量

$ db-> exec(“ 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"


 类似资料:
  • 问题内容: 我试图通过存储过程获取一个字段,我使用以下查询。我的目的是获取多行,但是只有在存在单行时,它才能成功执行结果。否则它将返回错误,如下所述。 MYSQL查询 错误信息 注意 问题答案: 该错误不在您的过程中。错误出现在您的查询中-返回的行多于一行,但是您无法将多个结果设置为标量值’emp1’。 您应该限制查询,使其返回一行。 如何从mysql中的存储过程检索多行? 计划A:填写另一个表,

  • 本文向大家介绍将列的值存储到MySQL存储过程的变量中,包括了将列的值存储到MySQL存储过程的变量中的使用技巧和注意事项,需要的朋友参考一下 要声明变量,请在MySQL存储过程中使用DECLARE。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 这是创建存储过程并将上述表的列值存储在存储过程变量中的查询- 调用存储过程- 这

  • 问题内容: 我正在尝试创建一个存储过程。这是我到目前为止(不起作用)的内容: HAVERSINE是我创建的可以正常工作的函数。如您所见,我正在尝试从“城市”表中获取城市的ID,然后将cityLat和cityLng设置为该记录的其他值。我显然在这里通过使用SELECTs做错了。 这有可能吗?看来应该如此。任何帮助将不胜感激。 问题答案: 更正了一些问题,并添加了一个替代选择-适当删除。

  • 问题内容: 我在任何地方都找不到此答案,但是可以从MySQL中的另一个存储过程调用存储过程吗?我想找回标识值,并在父存储过程中使用它。我们不能再使用FUNCTIONS! 问题答案: 参数应该可以帮助您将值返回给调用过程。基于此,解决方案必须是这样的。

  • 问题内容: 我的存储过程的基本结构是 MySQL版本: 5.1.61-0ubuntu0.11.10.1-log 当前,如果“查询2”失败,则提交“查询1”的结果。 如果任何查询失败,如何回滚事务? 问题答案: 看看http://dev.mysql.com/doc/refman/5.0/en/declare- handler.html 基本上,您声明错误处理程序,它将调用回滚