这是一个相当开放的问题。我已经使用MS SQLServer的Stored Procs和classic ASP以及ASP.net有一段时间了,非常喜欢它们。
我正在进行一个小型的业余项目,由于各种原因,我选择了LAMP路线。有没有任何提示/技巧/陷阱或好的起点来开始使用MySQL和PHP5的存储过程?我的MySQL版本支持存储过程。
这是一个相当开放的问题。我已经使用MS SQLServer的Stored Procs和classic ASP以及ASP.net有一段时间了,非常喜欢它们。
我正在进行一个小型的业余项目,由于各种原因,我选择了LAMP路线。有没有任何提示/技巧/陷阱或好的起点来开始使用MySQL和PHP5的存储过程?我的MySQL版本支持存储过程。
$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";
PDOStatement::fetchColumn
立即获取结果。像这样$result = $this->dbh->query("select @out_string")->fetchColumn()
。 - undefined实际上,在MySQL 5中调用存储过程并不一定需要使用mysqli或PDO。您可以使用旧的mysql_函数来调用它们。唯一无法做到的是返回多个结果集。
我发现返回多个结果集有些容易出错;在某些情况下确实可以工作,但只有当应用程序记得消耗所有结果集时才能正常工作,否则连接将处于断开状态。
忘记 mysqli
,它比 PDO 更难使用,应该已经被删除了。它确实在 mysql 上引入了巨大的改进,但有时为了在 mysqli 中实现相同的效果需要付出巨大的努力,例如关联的 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";
$mysqli = new MySQLI(user,pass,db);
$result = $mysqli->query("CALL sp_mysp()");
或者,您可以使用预处理语句,这种方法我认为非常直观易懂: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();
我一直在使用ADODB,它是一个很好的东西,可以抽象实际命令,使其在不同的SQL服务器之间可移植(例如从mysql到mssql)。然而,存储过程似乎没有直接支持。这意味着,我必须像运行普通查询一样运行SQL查询,但要“调用”存储过程。 以下是一个示例查询:
$query = "Call HeatMatchInsert('$mMatch', '$mOpponent', '$mDate', $mPlayers, $mRound, '$mMap', '$mServer', '$mPassword', '$mGame', $mSeason, $mMatchType)";
这并没有考虑到返回的数据,这是很重要的。我猜想这可以通过设置一个 @Var 来完成,你可以选择它作为返回的 @Variable。
抽象一点说,虽然基于 php 存储过程的 web 应用程序初次开发很难解决(mssql 很好文档化,但这不是),但完成后非常棒——由于分离,更改非常容易进行。