- PR -

PHP4+postgres で $result->close()すると結果が消える

投稿者投稿内容
kalze
ぬし
会議室デビュー日: 2003/10/23
投稿数: 406
お住まい・勤務地: 東京・東京
投稿日時: 2007-12-26 21:59
引用:

$result->close()、ですが安易に@ITのDAOのサンプルを真似しておりました。
もう少し調べてみたいと思います。



@ITのDAOのサンプルってこれ?
http://www.atmarkit.co.jp/flinux/rensai/mysql5_06/mysql5_06d.html
ソースコード的にはそっくりだけど。

以下、もしそうなら。

引用:

tohero0987さんが示されているソース
$result = pg_query($this->con, "select * from Item");



引用:

上記URLのソース
$result = $this->mysqli->query("SELECT * FROM item");



これで、$resultに入っているのが何か調べてみればわかるかも。

現状は、$result->close()で冬寂さんが書かれているようにエラー起こしてる気がします。

shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-12-26 22:30
あぁ、なるほど。元ソースはmysqliですか・・。mysqliはmysqliクラスが定義済みで、mysqli->queryの戻り値は「結果オブジェクト」ですね。マニュアルにも$result->close()の記述があります。

http://www.php.net/manual/ja/ref.mysqli.php
http://www.php.net/manual/ja/function.mysqli-query.php

残念ながらPostgreSQL関数はそういうわけにはいきません(mysql関数も同様です)。

http://www.php.net/manual/ja/ref.pgsql.php
http://www.php.net/manual/ja/ref.mysql.php
tohero0987
常連さん
会議室デビュー日: 2007/05/28
投稿数: 39
投稿日時: 2007-12-27 09:09
kalze様、shimix様

アドバイス有難うございます。
returnの前にエラーを起こしていてreturnまで進まなかったのですね。
javaのようにtry chatchが使えるといいと思いました。
mysqliクラス固有のものだったのですね。何とも当たり前のようなコードでしたので何も疑わずに書いてしまっておりました。

色々と勉強になりました。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2007-12-27 09:47
引用:

tohero0987さんの書き込み (2007-12-26 20:27) より:
そういえばPHPの変数コピーの保持の仕方は、特殊らしく(詳細説明のあるHPを見ました。zvalとか)このケースではバグでコピーしたものも一緒に削除されてしまっている?などとも思ったりします。


javaを勉強されていたなら知っているかもしれませんが、深いコピー&浅いコピー(deep copy & shallow copy)について調べておくとよいかもしれません。
php4の時には明示しない限り深いコピーが使われていて、下手に作られたライブラリを使うと、深い&浅いコピーがごっちゃになって訳が分からなくなる事がありました。
(返す側と呼び出す側で参照を明示しておかないと訳が分からなくなる。)
php5からは、objectは全て浅いコピー、という事になっているので混乱は無くなった(と思います)。
(明示的に深いコピーを使うには、cloneを使う。)

引用:

tohero0987さんの書き込み (2007-12-27 09:09) より:
javaのようにtry chatchが使えるといいと思いました。


だからphp5を使え(ry
(まぁ、使えない理由があるのは見ましたが。)

あと、何かを参照した場合は、それを書いておいていただけると答える時に楽になる事があります。
tohero0987
常連さん
会議室デビュー日: 2007/05/28
投稿数: 39
投稿日時: 2007-12-27 13:14
冬寂様

毎度アドバイス有難うございます。
deep copy & shallow copy 勉強になります。
オブジェクトが参照渡しになるのはPHP5からのようですね。
なので今回の場合は参照渡しになっていた訳ではなく、かつ$result->close();っていうのでエラーが発生していたという事ですね。
エラーをつかまえたかったらPHP5で、という事で良く理解できました。

スキルアップ/キャリアアップ(JOB@IT)