3

这个问题是一个相当开放的问题。一段时间以来,我一直在经典的 ASP 和 ASP.net 中使用带有 MS SQLServer 的存储过程,并且非常喜欢它们。

我有一个我正在从事的小型爱好项目,由于各种原因,我选择了 LAMP 路线。在 MySQL 和 PHP5 中使用存储过程的任何提示/技巧/陷阱或良好的起点?我的 MySQL 版本支持存储过程。

4

5 回答 5

7

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

“语法错误或访问冲突:例程 $procedure_name 的 1414 OUT 或 INOUT 参数 $parameter_number 不是变量或新伪变量”。

您可以在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";
于 2010-12-21T18:17:27.473 回答
4

算了mysqli,它比 PDO 更难使用,应该已经被删除了。确实,它对 mysql 进行了巨大的改进,但要在 mysqli 中实现相同的效果,有时需要对 PDO 即 associative 付出巨大的努力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";
于 2008-09-23T10:36:02.700 回答
2

您需要使用MySQLI(MySQL 改进扩展)来调用存储过程。以下是您如何调用SP

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

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

使用 SP 时,您需要关闭第一个结果集,否则您会收到错误消息。这里有更多信息:

http://blog.rvdavid.net/using-stored-procedures-mysqli-in-php-5/ (断开的链接)

或者,您可以使用Prepared Statements,我觉得它非常简单:

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

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

  $stmt->execute();

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

于 2008-09-23T01:13:44.690 回答
2

在 MySQL 5 中使用 mysqli 或 PDO 调用存储过程实际上并不是强制性的。您可以使用旧的 mysql_ 函数很好地调用它们。您唯一不能做的就是返回多个结果集。

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

于 2008-09-23T21:23:50.913 回答
0

我一直在使用 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 有很好的文档记录,但事实并非如此),但它完成后很棒 - 由于分离,更改很容易进行。

于 2008-12-07T08:49:04.990 回答