質問はかなりオープンなものです。私は、古典的な ASP と ASP.net でしばらくの間、MS SQLServer で Stored Procs を使用してきましたが、それらが大好きです。
私が取り組んでいる小さな趣味のプロジェクトがあり、さまざまな理由で LAMP ルートに行きました。MySQL と PHP5 でストアド プロシージャを使用するためのヒント/トリック/トラップ、または適切な出発点はありますか? 私のバージョンの MySQL は、ストアド プロシージャをサポートしています。
質問はかなりオープンなものです。私は、古典的な ASP と ASP.net でしばらくの間、MS SQLServer で Stored Procs を使用してきましたが、それらが大好きです。
私が取り組んでいる小さな趣味のプロジェクトがあり、さまざまな理由で LAMP ルートに行きました。MySQL と PHP5 でストアド プロシージャを使用するためのヒント/トリック/トラップ、または適切な出発点はありますか? 私のバージョンの MySQL は、ストアド プロシージャをサポートしています。
@michal kralik - 残念ながら、PDO が使用する MySQL C API にはバグがあります。これは、MySQL の一部のバージョンで上記のコードを実行すると、エラーが発生することを意味します。
「構文エラーまたはアクセス違反: ルーチン $procedure_name の 1414 OUT または INOUT 引数 $parameter_number は、変数または新しい疑似変数ではありません」.
bugs.mysql.comでバグ レポートを参照できます。バージョン 5.5.3+ & 6.0.8+ では修正されています。
この問題を回避するには、in パラメーターと out パラメーターを分離し、ユーザー変数を使用して次のように結果を保存する必要があります。
$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/en/book.mysqli.php
実際には、MySQL 5 でストアド プロシージャを呼び出すために mysqli または PDO を使用することは必須ではありません。古い 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 は十分に文書化されていますが、これはそうではありません)。