PDOでストアドプロシージャの結果取得

一つ前の記事で書いたように、MySQLのストアドプロシージャを使ったアプリを書いたんですが、
ストアドプロシージャで作ったデータをPHPのPDOでどう取得すればいいのかわからなかったので覚書き。

参考までにつくったのは下のものです。ちなみに「ふっかつのじゅもん」はアクセス誘導のために
別の場所に書いてあったんですが、ここにも書いておきます。「モウイッカイ」です。


ハロウィンの運命






入力したデータをRESTで送って、返却値をJavaScriptで黄色い枠内に書き込んでいます。

送信するデータは以下のとおりです。

  • id : 結果表示場所のid
  • hidden : 送信ボタンの上に追加する表示部分のid
  • type : halloween、xmas、otherのどれかを指定(他でも使いまわすため)
  • name : 入力された名前
  • pass : ふっかつのじゅもん(オプション)

上記パラメータを受信したサーバー側で、JavaScriptを生成。それを送り返して来ます。
その戻ってきたデータを読み込んだブラウザで、スクリプトが作動して結果が表示されます。

サーバー側のPHPソースですが、パラメーター取得方法とエラー処理、それから生成されるJavaScriptに関しては、今回のテーマと違うので省略します。

プロシージャの仕様は以下のとおりです。

fortune(OUT _string VARCHAR(2048), IN _user VARCHAR(128), IN _type VARCHAR(128), IN _pass VARCHAR(1024));

コマンドで使うときは以下のカンジです。

call fortune(@str, “username”, “halloween”, “password”);
SELECT @str;

以下、PDOでストアドプロシージャのデータを取得する部分のソースです。

ちなみにコメントアウトしてある3行ですが、環境によって必要であったり、なかったりします。
実際に設置したのはCORESERVERですが、CORESERVERでは、ないと文字化けしますのでコメントアウトは外して有効にしてあります。ただ、ローカルのLinux mintにaptで構築した環境では不要でした。

$host="localhost";
$dbname="xxxxxxxxxxxxx";
$username="xxxxxxxxxxxxx";
$password="xxxxxxxxxxxxx";

$base="var pos=document.getElementById('%s');以下省略";

try{
	$pdo=new PDO("mysql:host=$host;dbname=$dbname",$username,$password);

	//以下の3行は環境によっては必要
	//$pdo->query("SET character_set_client=utf8");
	//$pdo->query("SET character_set_connection=utf8");
	//$pdo->query("SET character_set_results=utf8");

	$stmt=$pdo->prepare("call fortune(@str,?,?,?)");

	$stmt->bindValue(1,$name,PDO::PARAM_STR);
	$stmt->bindValue(2,$type,PDO::PARAM_STR);
	$stmt->bindValue(3,$pass,PDO::PARAM_STR);

 	$stmt->execute();

	header("Content-type: text/javascript; charset=UTF-8");
	printf($base,$id,$pdo->query('SELECT @str')->fetchColumn());
}catch(PDOException $e){
	header("HTTP/1.1 500 Internal Server Error");
}

$pdo=null;

prepareを使って処理するということがわかれば簡単なのですが、そこにたどり着くまで苦労しました。

bindValueの第3引数には、第2引数の型を指定します。
今回はたまたま文字列型だけでしたが、PHPのマニュアルページに色々な型が書いてあります。

PHP implodeで簡単表作成

PHPのimplode関数を使うと、恐ろしく簡単なコードでHTMLの中に表が作れたのであった。

CodeZineの「PDOでサクサクDB開発」という記事に、下のコードが掲載されていた。

try {
    $pdo = new PDO("mysql:host=localhost; dbname=pdotest",
                   "root", "pass");
    $stmt = $pdo->query("SELECT * FROM CD");

    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        echo implode(", ", $row) . PHP_EOL;
    }
} catch (PDOException $e){
    var_dump($e->getMessage());
}

$pdo = null;

この中のimplodeという関数を知らなかった。

implodeとは何ぞや?」と思い、調べてみたらチョー簡単にHTMLのテーブルが作れることがわかった。

“PHP implodeで簡単表作成”の続きを読む