我现在一直在使用PDO并且正在重构一个项目,以便它使用存储过程而不是内联SQL.我收到一个我无法解释的错误.我正在使用PHP版本5.3.5和MySQL版本5.0.7.
我只是想让一个基本的存储过程与输出工作.这是存储过程:
DELIMITER //
CREATE PROCEDURE `proc_OUT` (OUT var1 VARCHAR(100))
BEGIN
SET var1 = 'This is a test';
END //
Run Code Online (Sandbox Code Playgroud)
这是我用来调用proc的代码,$ db是PDO的一个实例:
$stmt = $db->prepare("CALL proc_OUT(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);
// call the stored procedure
$stmt->execute();
echo $returnvalue;
Run Code Online (Sandbox Code Playgroud)
简单吧?但是,它会导致以下错误:
exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1414 OUT or INOUT argument 1 for routine mydb.proc_OUT is not a variable or NEW pseudo-variable in BEFORE trigger
Run Code Online (Sandbox Code Playgroud)
如果我像这样直接调用proc:
CALL proc_OUT(@res);
SELECT @res;
Run Code Online (Sandbox Code Playgroud)
它按预期工作,这让我相信它是如何用PHP调用的,但我似乎无法找到问题所在.我按照手册中的说明操作,但仍然收到此错误.有谁能建议我做错了什么?任何建议将非常感谢.非常感谢!
这不起作用:
$dbh = new PDO("dblib:host=xxxx;dbname=xxx", "xxxxx", "xxxxx");
$sth = $dbh->prepare("{exec wcweb_UserInfo(?)}");
$sth->bindParam(1, $name);
$sth->execute();
while($result = $sth->fetch(PDO::FETCH_ASSOC)) {
var_dump($result);
}
Run Code Online (Sandbox Code Playgroud)
这也行不通:
$dbh = new PDO("dblib:host=xxxxx;dbname=xxxx", "xxxxx", "xxxx");
$sth = $dbh->prepare("{call wcweb_UserInfo(?)}");
$sth->bindParam(1, $name);
$sth->execute();
while($result = $sth->fetch(PDO::FETCH_ASSOC)) {
var_dump($result);
}
Run Code Online (Sandbox Code Playgroud)
这个工作:
$dbh = new PDO("dblib:host=xxxxx;dbname=xxxx", "xxxxx", "xxxx");
$sth = $dbh->prepare("exec wcweb_UserInfo @userid=?");
$sth->bindParam(1, $name);
$sth->execute();
while($result = $sth->fetch(PDO::FETCH_ASSOC)) {
var_dump($result);
}
Run Code Online (Sandbox Code Playgroud)
我尝试了上面使用的2没有大括号的工作,等等.我知道有些人会说,好吧,就像它的工作方式一样吗?..问题是我使用sqlsrv_query库从IIS服务器移植一个正在运行的应用程序到Linux服务器.
应用程序中的所有数据库调用都是使用此方法编写的函数:{call wcweb_UserInfo(?)} ..没有指定任何参数名称,因此我必须修改每个数据库调用以包含参数名称.我的印象是PHP5的PDO库可以做同样的调用吗?
救命!有什么我做错了或只是PDO无法拨打这类电话?