这个问题是一个相当开放的问题。我在MS SQLServer和经典的ASP和ASP.net中使用存储过程已经有一段时间了,我非常喜欢它们。
我有一个小的爱好项目,我正在工作,由于各种原因,我已经放弃了灯的路线。在MySQL和PHP5中使用存储过程有什么提示/技巧/陷阱或良好的起点吗?我的MySQL版本支持存储过程。
发布于 2008-09-23 10:36:03
忘了mysqli吧,它比PDO更难用,应该已经被删除了。它确实引入了对mysql的巨大改进,但要在mysqli中达到同样的效果,有时需要付出巨大的努力才能超越PDO,即关联fetchAll。
相反,我们应该看看PDO,特别是 prepared statements and stored procedures。
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
// call the stored procedure
$stmt->execute();
print "procedure returned $value\n";发布于 2010-12-22 02:17:27
@michal kralik -不幸的是,PDO使用的MySQL C应用程序接口有一个错误,这意味着在MySQL的一些版本上运行你的代码会导致错误:
“语法错误或访问冲突: 1414例程$procedure_name的OUT或INOUT参数$parameter_number不是变量或新的伪变量”。
你可以在bugs.mysql.com上看到错误报告。这个问题已经在5.5.3+ & 6.0.8+版本中得到了修复。
要解决此问题,您需要将in和out参数分开,并使用用户变量存储结果,如下所示:
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(:in_string, @out_string)");
$stmt->bindParam(':in_string', 'hello');
// call the stored procedure
$stmt->execute();
// fetch the output
$outputArray = $this->dbh->query("select @out_string")->fetch(PDO::FETCH_ASSOC);
print "procedure returned " . $outputArray['@out_string'] . "\n";发布于 2008-09-23 01:13:45
您需要使用MySQLI (MySQL改进的扩展)来调用存储过程。下面是调用SP的方法
$mysqli = new MySQLI(user,pass,db);
$result = $mysqli->query("CALL sp_mysp()");使用SPs时,您需要关闭第一个结果集,否则将收到一个错误。以下是更多信息:
http://blog.rvdavid.net/using-stored-procedures-mysqli-in-php-5/ (断开的链接)
或者,您可以使用预准备语句,我发现它非常简单:
$stmt = $mysqli->prepare("SELECT Phone FROM MyTable WHERE Name=?");
$stmt->bind_param("s", $myName);
$stmt->execute();https://stackoverflow.com/questions/118506
复制相似问题