问题是一个相当开放的问题。我一直在使用MS SQLServer的存储过程与经典的ASP和ASP.net一起使用,很喜欢它们。

我有一个小型的业余爱好项目我正在研究,并且由于各种原因已经走了LAMP路线。使用MySQL和PHP5的存储过程的任何提示/技巧/陷阱或良好的起点?我的MySQL版本支持存储过程。

有帮助吗?

解决方案

忘记 mysqli ,它比PDO更难使用,应该已经删除了。确实,它引入了对mysql的巨大改进,但是为了在mysqli中实现相同的效果,有时需要相对于PDO的巨大努力,即关联 fetchAll

相反,请查看 PDO ,特别是 准备好的陈述和存储过程

$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";

其他提示

@michal kralik - 遗憾的是,PDO使用的MySQL C API存在一个错误,这意味着使用某些版本的MySQL运行上面的代码会导致错误:

  

"语法错误或访问冲突:1414 OUT或INOUT参数$ parameter_number用于例程$ procedure_name不是变量或NEW伪变量“。

您可以在 bugs.mysql.com 上查看错误报告。它已修复5.5.3+版本和6.0.8 +。

要解决此问题,您需要将其分开。输出参数,并使用用户变量来存储结果,如下所示:

$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";

实际上并不是必须使用mysqli或PDO来调用MySQL 5中的存储过程。您可以使用旧的mysql_函数调用它们。你唯一不能做的就是返回多个结果集。

我发现无论如何返回多个结果集都有些容易出错;它在某些情况下确实有效,但仅当应用程序记得全部使用它们时,否则连接将处于断开状态。

您需要使用 MySQLI (MySQL改进的扩展名)来调用存储过程。您可以通过以下方式拨打 SP

$mysqli = new MySQLI(user,pass,db);

$result = $mysqli->query("CALL sp_mysp()");

使用SP时,您需要关闭第一个结果集,否则您将收到错误消息。以下是一些更多信息:

  

http://blog.rvdavid.net/使用存储-程序-mysqli的功能于PHP-5 /   (断链)

或者,您可以使用准备好的声明,我觉得非常简单:

  $stmt = $mysqli->prepare("SELECT Phone FROM MyTable WHERE Name=?");

  $stmt->bind_param("s", $myName);

  $stmt->execute();

MySQLI文档: http://no.php.net/manual/烯/ book.mysqli.php

我一直在使用ADODB,这对于抽象实际命令以使其在不同的SQL Server(即mysql到mssql)之间可移植是一件很棒的事情。但是,似乎不直接支持存储过程。这意味着,我已经运行了一个SQL查询,就好像它是一个普通的查询,而是“调用” SP。 一个示例查询:

$query = "Call HeatMatchInsert('$mMatch', '$mOpponent', '$mDate', $mPlayers, $mRound,  '$mMap', '$mServer', '$mPassword', '$mGame', $mSeason, $mMatchType)";

这不是对返回数据的考虑,这很重要。我猜这可以通过设置一个@Var来完成,你可以选择自己作为返回@Variable。

要成为抽象虽然,虽然制作第一个基于php存储过程的Web应用程序是非常难以解决的(mssql有很好的文档记录,但事实并非如此),它完成后很好 - 由于以下内容很容易进行更改分开。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top