Flash Builder 4 -> PHPからのデータの戻り値

Posted by muchag | Flash Builder 4 |
初回投稿:2010-07-10 (土) 19:27:26 | 最終更新:2010-08-04 (水) 1:03:31

FB4 と PHP との連携をしていて、どうにも希望通りにいかない。

問題点

どうだめか というと
戻り値のデータ型を自動取得できないのだ。
全部 String(文字列型) になってしまう。

FB4 にて自動生成される PHP クラスでは、DBへのアクセスに mysqli を用いている。
こちらで見ると戻り値は確かに Stringint の2種類。

最近の私は PDO を利用しているので、せっかくなら PDO でDB操作をしたい。
でも PDO では、全て String になる。
 

stdClass クラスオブジェクト

そこで PDO について調べながら PDO -> 定義済み定数 の記事を書いていて
初めて stdClass という文字を見た。

なんじゃろ とは思いながらも FB4 の方が気になっていて放置しておいた。

ところが、更に進めていくと、FB4 にて自動生成される PHP クラスから FB4 への戻り値も
stdClass であることがわかった。

そこで改めて stdClass についても調べてみた。
stdClass クラス

なるほどねぇ。
だから戻り値を普通に配列で受け取ろうとしてもだめだったのか。
 

FETCHモードの変更

そこで早速 PDO のFETCHモードを PDO::FETCH_ASSOC から PDO::FETCH_OBJ に変更してみた。
しかし残念ながら結果はアウト。戻り値のデータ型は全て string。 😥

実験していて気になったのが mysqli と PDO の取得結果の差。

mysqli
var_dump($row);

object(stdClass)#2 (5) {
[“id”]=>
∫(1)
[“name”]=>
&string(9) “夢茶爺”
}
PDO
var_dump($row);

object(stdClass)#2 (5) {
[“id”]=>
string(1) “1”
[“name”]=>
string(9) “夢茶爺”
}

むむむ、mysqli の方は String の前に &(アンパサンド)がある・・・。
あのインテグラルは、整数型だと一応理解している証拠?

あれ? でも Adobe のチュートリアルでは戻り値の var_dump は
全部 string で、しかも & がない・・・。
Flex チュートリアル:クライアントアプリケーション用の PHP サービスの作成

ううううう。
別に計算するわけではないので、全部文字列型でも先へ進めるんだけど
ぎもぢわるい・・・。
 

複数レコードの取得を試行

ん~ 戻り値が複数レコードになるタイプも試してみようっと。

自動生成されたコード

  1. $stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename");       
  2. $this->throwExceptionOnError();
  3.  
  4. mysqli_stmt_execute($stmt);
  5. $this->throwExceptionOnError();
  6.  
  7. $rows = array();
  8.  
  9. mysqli_stmt_bind_result($stmt, $row->id, $row->name, $row->birthday);
  10.  
  11. while (mysqli_stmt_fetch($stmt)) {
  12.   $rows[] = $row;
  13.   $row = new stdClass();
  14.   mysqli_stmt_bind_result($stmt, $row->id, $row->name, $row->birthday);
  15. }
  16.  
  17. mysqli_stmt_free_result($stmt);
  18. mysqli_close($this->connection);
  19.  
  20. return $rows;

あら?こんなになった。

mysqli
var_dump($row);

array(2) {
[0]=>
object(stdClass)#2 (3) {
[“id”]=>
int(1)
[“name”]=>
string(9) “夢茶爺”
[“birthday”]=>
string(10) “2001-01-01”
}
[1]=>
object(stdClass)#4 (3) {
[“id”]=>
int(2)
[“name”]=>
string(6) “kuchag”
[“birthday”]=>
string(10) “1901-01-01”
}
}

&(アンパサンド)もついてないし、インテグラルではなくちゃんと int になってる。
 

脱線

ここでは全く関係ないんだけど、ちょっとコードが気になって
自動生成 PHP コードをいじってみた。

  1. mysqli_stmt_bind_result($stmt, $row->id, $row->name, $row->birthday);

while 文があるのに1行飛び出している9行目が気になって
これをコメントアウトし、更に12行目を while 文の最後に移動した。

  1. $rows = array();
  2.  
  3. //mysqli_stmt_bind_result($stmt, $row->id, $row->name, $row->birthday); //コメントアウト
  4.  
  5. while (mysqli_stmt_fetch($stmt)) {
  6.     $row = new stdClass();
  7.     mysqli_stmt_bind_result($stmt, $row->id, $row->name, $row->birthday);
  8.     $rows[] = $row; //移動
  9. }

mysqli_stmt_bind_result というメソッドは
mysqli_stmt_fetch より手前にないといけないので
よく考えたら、アホなことをしたわけだが
そこは怪我の功名。

インテグラルや &(アンパサンド)に再会できた。

mysqli
var_dump($row);

array(2) {
[0]=>
object(stdClass)#4 (3) {
[“id”]=>
int(2)
[“name”]=>
string(6) “kuchag”
[“birthday”]=>
string(10) “1901-01-01”
}
[1]=>
object(stdClass)#2 (3) {
[“id”]=>
∫(0)
[“name”]=>
&NULL
[“birthday”]=>
&NULL
}
}

PHP においての &(アンパサンド)って参照渡しのときに使う。
この場合はどう解釈すればいいんだろう。

Posted by muchag | Flash Builder 4 |
初回投稿:2010-07-10 (土) 19:27:26 | 最終更新:2010-08-04 (水) 1:03:31

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment