簡體   English   中英

存儲過程,MySQL和PHP

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM