3

質問はかなりオープンなものです。私は、古典的な ASP と ASP.net でしばらくの間、MS SQLServer で Stored Procs を使用してきましたが、それらが大好きです。

私が取り組んでいる小さな趣味のプロジェクトがあり、さまざまな理由で 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+ では修正されています。

この問題を回避するには、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";
于 2010-12-21T18:17:27.473 に答える
4

忘れてください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";
于 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 に答える