[英]Stored Procedures, MySQL and PHP
這個問題是一個相當開放的問題。 我已經將MS SQLServer的存儲過程與經典的ASP和ASP.net一起使用了一段時間,並且非常喜歡它們。
我正在從事一個小型的業余項目,由於各種原因,LAMP路線已經消失。 在MySQL和PHP5中使用存儲過程有任何提示/技巧/陷阱或良好的起點嗎? 我的MySQL版本支持存儲過程。
@michal kralik-不幸的是,PDO使用的MySQL C API有一個錯誤,這意味着以某些版本的MySQL運行上述代碼會導致錯誤:
“語法錯誤或訪問沖突:例程$ procedure_name的1414 OUT或INOUT參數$ parameter_number不是變量或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的巨大改進,但是要在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";
您將需要使用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/zh/book.mysqli.php
使用mysqli或PDO在MySQL 5中調用存儲過程實際上並不是強制性的。您可以使用舊的mysql_函數很好地調用它們。 您唯一不能做的就是返回多個結果集。
我發現無論如何返回多個結果集都容易出錯。 它在某些情況下確實有效,但前提是應用程序必須記住全部使用它們,否則連接將處於斷開狀態。
我一直在使用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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.