Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL在PHP PDO中从存储过程中检索变量_Php_Mysql_Pdo - Fatal编程技术网

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

MySQL在PHP PDO中从存储过程中检索变量,php,mysql,pdo,Php,Mysql,Pdo,这个问题我已经问了很多次了,但都很长,我就是想不起他们在做什么。。。那么,有人能告诉我如何使用PDO将此过程中的LAST\u INSERT\u ID()导入php: 表: 程序: 我尝试过的PHP代码: 但是,对于一个脑细胞比我多的人来说,这可能是显而易见的,这是行不通的。谢谢你的帮助 关于我认为这应该有效的原因: (示例4)让我先说这是一个猜测,因为我从不使用事先准备好的语句 通常,您不绑定您的返回值,而是这样做 $status = $statement->execute( ); $

这个问题我已经问了很多次了,但都很长,我就是想不起他们在做什么。。。那么,有人能告诉我如何使用PDO将此过程中的
LAST\u INSERT\u ID()
导入php:

表: 程序: 我尝试过的PHP代码: 但是,对于一个脑细胞比我多的人来说,这可能是显而易见的,这是行不通的。谢谢你的帮助

关于我认为这应该有效的原因:
(示例4)

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

通常,您不绑定您的返回值,而是这样做

$status = $statement->execute(  );

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

请恕我直言……

事实证明,这是一个已经存在很长时间的错误。。。从2005年开始

以下是原始错误报告:。下面是新的bug报告:

返回答案有多种方法,我找到了其中一种,并演示了它

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

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

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

这里描述得很清楚:

更新(2017年1月):

下面是一个示例,显示了“IN”、“INOUT”和“OUT”Mysql过程参数的变量用法

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

  • 开发时:在“仿真模式”下运行PDO,因为它在确定过程调用中的错误时更可靠
  • 仅将PHP变量绑定到过程“IN”参数
当您尝试将变量绑定到INOUT和OUT参数时,会出现一些非常奇怪的运行时错误

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

运行时环境(XAMPP):

  • PHP:5.4.4
  • Mysql:5.5.16
源代码:

SQL代码: PHP代码: 数据库连接:

注意:输出与
EMULATE\u
=false相同

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

定义并准备SQL过程调用:

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

  • 1) 绑定PHP变量

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

  • 2) 设置SQL用户输入输出变量

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

执行以下程序:

将SQL变量放入PHP变量中:

注:可能不是最好的方式-/

显示PHP变量


您可能希望使用bindparam而不是bindvalue。bindparam通过引用获取一个变量,该变量允许语句将值设置回变量中。是的,试过了,没有工作,使用
bindParam
它似乎正在工作,因为我现在没有得到
$returnid not set
错误。。。但是,它仍然不响应手册中所说的任何内容:
length:数据类型的长度。要指示某个参数是存储过程中的OUT参数,必须显式设置长度。
Nope。。。那也没用。。。我已经更新了我的帖子,以反映我所尝试的内容,其中返回的
未定义索引
错误:(…但是,为了您的麻烦,这里有一张小鸭子滑板的图片…但是这并没有像应该使用的那样使用
OUT
函数,如:(示例4)所述。如果我要使用另一个
SEELCT
语句,我也可以将过程更改为让
选择LAST\u INSERT\u ID()作为returnid
而不是
设置returnid=LAST\u INSERT\u ID()
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
$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;
$status = $statement->execute(  );

$resultArray = $statement->fetchAll( );
$statement->closeCursor( );
if (!is_array($resultArray)) {
    return array();
}
return $resultArray[0]['returnid'];
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$$
$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);
$phpInParam     = 5;                  
$phpInOutParam  = 404;          /* PHP InOut variable  ==> read and should be changed  */
$phpOutParam    = null;         /* PHP Out   variable  ==> should be changed           */
$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);
$allOk = $stmt->execute();
$sql = "SELECT @varInOutParam AS phpInOutParam,
               @varOutParam   AS phpOutParam
        FROM dual";
$results = current($db->query($sql)->fetchAll());

$phpInOutParam = $results['phpInOutParam'];
$phpOutParam   = $results['phpOutParam'];
"$phpInParam:"     => "5"
"$phpInOutParam:"  => "409"
"$phpOutParam:"    => "-15"