1 名前:● mailto:sage [2009/11/14(土) 17:31:22 ID:???] 質問者はまず>>1 を良く読むこと(必須!) 過去スレ、関連スレ、FAQなどは>>2-10 辺り 次スレは>>980 が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。 ◆前スレ 【PHP】下らねぇ質問はID出して書き込みやがれ 89 pc11.2ch.net/test/read.cgi/php/1255263534/ ◆質問用テンプレ 【OS名】vine linux 【PHPのバージョン】php5.26 【連携ソフトウェア】mysql 【質問内容】 ◆質問する時の注意 ・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す) ・ 己の行った操作、変更などを詳しく明記すること。 ・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。 ・ 質問者として、態度をわきまえること。 ・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。 (PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。) ◆質問後の注意 ・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。 ・解決しなくても回答をもらった場合はお礼を言うこと。 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。) ◆回答者への注意 ・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。 【その他諸注意】 ・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
48 名前:nobodyさん mailto:sage [2009/11/18(水) 13:23:33 ID:???] なんでSQL文生成クラスがバッファリングw DB駆動クラス(他から見れば、そいつがDBと言ってもいい)がやるならともかく。
49 名前:nobodyさん mailto:sage [2009/11/18(水) 13:38:27 ID:???] >>47 急に偉そうになったな ルールも守ってないし
50 名前:nobodyさん [2009/11/18(水) 13:45:40 ID:/HH3qrl4] >>48 SQL生成クラスって書き方したが 実際には ・SQLの生成 ・DB送信/管理クラスにSQLを送る ・結果セットからwhile($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){でループさせて配列に格納。 ・配列をメイン処理に返す って感じの処理です。 さらにこの「SQL生成クラス」に関してですが一つだけではなくて2つあります。 一つはselect専用のDB検索用 もう一つはInsert/Update/Deleteを発行するDB操作用。 分けた理由は管理者画面においては両方を使うが 一般ユーザ利用の部分に必要なのはDB検索用の方だけだから ユーザ利用の方でバクなどでのセキュリティー対策として 一つにしておいてDB操作の処理のメソッドが万が一呼ばれることの内容にするため (自分がソース間違えて呼び出したりなどに対する自己防衛と) や一般ユーザ利用部分の軽量化のため。 >>49 >ルールも守ってないし 2chビューワでいつもの癖でsageのチェックボックスつけて送信してしまいました。
51 名前:nobodyさん mailto:sage [2009/11/18(水) 13:47:55 ID:???] >>50 >だからその処理は2.のクラスでやっている。 などと言ってるけどその設計から見直したら?っていう話なのでは? アドバイスしても「俺のクラスではこうなんだ」としか言われなかったら はいそうですかどうぞご自由にと何も言うことなくなる。
52 名前:nobodyさん [2009/11/18(水) 14:01:36 ID:/HH3qrl4] >>51 現状できあがったシステムで(今まではPEAR::DB+PostgreSQLの環境) PEAR::DB、PEAR::MDB2、PDOやMySQL、PostgreSQL、SQLiteなマルチな環境下で動くようにバージョンアップ作業していたときに ついでに5.3での挙動もチェックしちゃえってテストしていたときに発生した問題で 根本的な設計をし直したらシステム全体も書き換えになってしまうので最低限の変更でなんとかならないかと今回の質問をしたのです。 って内情まで説明しないとダメですか?
53 名前:nobodyさん mailto:sage [2009/11/18(水) 14:07:58 ID:???] あのね、自分の思ってることが言葉で説明しなくても自動的に他人に伝わることはありえないんだよ?
54 名前:nobodyさん mailto:sage [2009/11/18(水) 14:20:43 ID:???] ふむふむ、クラスの内部でちょこっとデータ保持するようにすると、 システム全体も書き換えになってしまう、と。 どんな作りやねんw まあそれでも、他者が作ったそういうものでも何とかしなきゃならん仕事での立場だとしたら、 もしそうならちょこっと同情はする。
55 名前:nobodyさん mailto:sage [2009/11/18(水) 14:22:49 ID:???] >>49 お前みたいな知識も無い素人PHP外野専門はROMってろ
56 名前:nobodyさん [2009/11/18(水) 14:38:02 ID:/HH3qrl4] >>54 >システム全体も書き換えになってしまう、と。 ごめん。書き方が変だった。 このシステム全体はSQL周りのクラスって事。 本来はSQL送信/管理しているクラスだけですませたかった。 SQL生成や取得した結果セット用のクラスは極力いじりたくなかった。 自分でも「SQL生成や取得した結果セット用」クラスまでいじるなら 「SQL送信/管理クラス」に今まで一つだったメソッドを ・接続メソッド ・SQL送信メソッド ・接続解除メソッド にわけて 「SQL生成や取得した結果セット用」内からは今までは一回だけメソッドを呼び出していたのを それぞれ上記のメソッドを順番で呼び出せば済むって事はわかってているんですよね。 それかPHP5.3利用時にはSQLite利用時はPDO限定にするかって事ですね。 後、今環境が無いのですが試せてないのですが 5.2.1ではsqlite_close()後も結果セットは保持されていますけど sqlite_close()の挙動ですがPHPも5.2.1ではテストしているけど5.2.1以降の5.2系では挙動って変わっていますか?
57 名前:nobodyさん [2009/11/18(水) 14:46:27 ID:xi1WciP2] GDを使って画像のサイズを取得しようとしています。 $images = getimagesize("localhost/images/logo.gif "); というURLだと取得できないのですが、 $images = getimagesize("www.google.co.jp/intl/ja_jp/images/logo.gif "); というGoogleのロゴのサイズを取得しようとしたら出来ました。 getimagesizeを使う場合、localhostからは取得できないのでしょうか? もし出来ない場合、どうやってローカルサーバの画像を参照すればいいのか 方法を教えていただければと思います。
58 名前:nobodyさん mailto:sage [2009/11/18(水) 14:49:42 ID:???] とりあえず、 ローカルPC上のブラウザから"localhost/images/logo.gif "が見えてるよね?
59 名前:57 [2009/11/18(水) 14:52:09 ID:xi1WciP2] はい。見えてます。
60 名前:nobodyさん [2009/11/18(水) 14:57:17 ID:/HH3qrl4] >>59 そのローカル環境のファイル壊れてないよね? 一応、>>57 のソースを元に $images = getimagesize("www.google.co.jp/intl/ja_jp/images/logo.gif "); print_r($images); echo "<br>\n"; $images2 = getimagesize("localhost/work/GD/logo.gif "); print_r($images2); ってソースを書いてテストしたけど問題なく取得できた。 ローカルでのlogo.gifはgoogleのロゴをそのまま保存して利用。 ちなみに $images = getimagesize("./logo.gif"); の様に相対パスで書いた場合はどうなる?
61 名前:nobodyさん mailto:sage [2009/11/18(水) 15:01:07 ID:???] なんか見落としてる予感だわな エラーメッセージは出ないのか
62 名前:57 [2009/11/18(水) 15:04:24 ID:xi1WciP2] >>60 相対パスや絶対パスだと普通に表示されます。 なぜかURLにするとずっと読み込み状態で、 停止してもエラーメッセージなどは出ません。 ローカルサーバがWindowsXPのApacheだからでしょうか?PHPは5.2.5です
63 名前:nobodyさん mailto:sage [2009/11/18(水) 15:15:31 ID:???] >>62 max_execution_timeやdefault_socket_timeoutの値を変えてエラーがどうなるか試してみたら?
64 名前:nobodyさん mailto:sage [2009/11/18(水) 15:18:25 ID:???] >>61 その場合、php.iniの中身も確認しないとダメかもね。 display_errorsやerror_reportingまわりがどうなっているか確認しないとダメかも。下手したら非表示になっていたりして (以前どこだったかな。レンタルサーバでこれのレベルが下げてあってエラーも警告も出なかったことある。) >>62 後、 header("Content-type: image/gif"); $filename = "localhost/work/GD/logo.gif "; $f = fopen($filename, "rb"); $buf = stream_get_contents($f); fclose($f); echo $buf; なソースを書いてphp側で画像取得できるのか? これすらNGだとPHPよりapache側の根本的な設定に問題がありそう。 >>60 は俺だけど今度は回答側に回ったのにsage付け忘れました。すみませんでした。
65 名前:57 [2009/11/18(水) 15:24:10 ID:xi1WciP2] みなさんありがとうございます。たぶん、サーバの設定の問題かも知れません。 先ほどサブのPCで同じ事をしたらサイズが取得できました。 php.iniの設定や>>64 さんが書かれている内容も参考にしてみます。
66 名前:nobodyさん [2009/11/18(水) 15:55:00 ID:jaz8gdLl] data.txtから最終行を読み込んで表示した後、 <br> その最終行をdata.txtから削除するにはどんな方法でやれば良いでしょうか?
67 名前:nobodyさん mailto:sage [2009/11/18(水) 16:00:18 ID:???] fileでよみこんでend使ってunsetして書き込み
68 名前:nobodyさん [2009/11/18(水) 16:29:22 ID:jaz8gdLl] >>67 ありがとうございます。
69 名前:39 mailto:sage [2009/11/18(水) 19:57:24 ID:???] >>56 確かに5.3で挙動が変わってるナー バッファリングした結果セットをでっちあげちまえばいいんだ class BufferedResult { private $buffer; public function __construct($result) { while ($row = $result->fetchRow()) { $this->buffer[] = $row; }} public function fetchRow($mode) { return array_shift($this->buffer); } public function fetchAll() { return array_splice($this->buffer, 0); } } こんなクラスを作ってこうだ + if (SQLite使用時 && version_compair(PHP_VERSION, '5.3') >= 0) { + $result = BufferedResult($result); + } $db->disconnect(); return $result;
70 名前:nobodyさん mailto:sage [2009/11/18(水) 20:36:09 ID:???] $resultは参照になってると思うが大丈夫かい?
71 名前:nobodyさん mailto:sage [2009/11/18(水) 20:36:48 ID:???] >>69 訳してくだはい
72 名前:nobodyさん mailto:sage [2009/11/18(水) 20:37:46 ID:???] >>71 え、何を?
73 名前:nobodyさん [2009/11/18(水) 21:20:51 ID:nmLyX5fb] HTML4.01とXHTML1.0のタイプ別にDTDから要素と属性を取得するプログラムって探してもなかったのですが需要がないのでしょうか? 自分も書いてみたもののスマートな感じではないので勉強のためにソースを探しています どなたかご存知の方いらっしゃいましたら教えてください
74 名前:nobodyさん mailto:sage [2009/11/18(水) 21:23:06 ID:???] 誰得?
75 名前:nobodyさん mailto:sage [2009/11/18(水) 21:35:27 ID:???] 何のためにそんなの作るの? IDEのコード補完で勝手にやってくれるでしょ
76 名前:nobodyさん [2009/11/18(水) 21:40:40 ID:/HH3qrl4] >>69 ありがとうございます。 書いていただいてソースを元に public function __construct($result,$Lib_Kind){ if($Lib_Kind==1){ while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) { $this->buffer[DB_FETCHMODE_ASSOC][] = $row; } while ($row = $result->fetchRow(DB_FETCHMODE_ORDERED)) { $this->buffer[DB_FETCHMODE_ORDERED][] = $row; } while ($row = $result->fetchRow(DB_FETCHMODE_OBJECT)) { $this->buffer[DB_FETCHMODE_OBJECT][] = $row; } }elseif($Lib_Kind==2){ while ($row = $result->fetchRow(MDB2_FETCHMODE_ASSOC)) { $this->buffer[MDB2_FETCHMODE_ASSOC][] = $row; } while ($row = $result->fetchRow(MDB2_FETCHMODE_ORDERED)) { $this->buffer[MDB2_FETCHMODE_ORDERED][] = $row; } while ($row = $result->fetchRow(MDB2_FETCHMODE_OBJECT)) { $this->buffer[MDB2_FETCHMODE_OBJECT][] = $row; } } } public function fetchRow($mode){ return array_shift($this->buffer[$mode]);} $Lib_Kindが1だったらPEAR::DB、2だったらPEAR::MDB2使用 とソース書き直してみました。
77 名前:nobodyさん [2009/11/18(水) 21:43:23 ID:/HH3qrl4] >>69 >確かに5.3で挙動が変わってるナー どうせやるなら他のDB系関数の挙動も変更すればいいのに それにしてもなんでこんな中途半端(SQLiteのみ)な仕様変更したんだろう?
78 名前:nobodyさん mailto:sage [2009/11/18(水) 21:47:22 ID:???] >>76 なんで全部fetchしてんの? あとfetchAllがあるよ
79 名前:nobodyさん mailto:sage [2009/11/18(水) 22:10:31 ID:???] >>78 とりあえずMDB2で説明すると pear.php.net/manual/ja/package.database.mdb2.intro-fetch.php while ($row = $result->fetchRow()) { だった場合拾う値はデフォルトである MDB2_FETCHMODE_ORDEREDのみの型。 MDB2_FETCHMODE_ASSOCやMDB2_FETCHMODE_OBJECT の値も別途取得する処理を書いておく必要がある。 ただしMDB2_FETCHMODE_OBJECTの書き方はオブジェクトとして取得するのでなんか変な気がする。
80 名前:nobodyさん mailto:sage [2009/11/18(水) 22:22:48 ID:???] >>75 >勝手にやってくれる? kwsk
81 名前:nobodyさん mailto:sage [2009/11/18(水) 23:08:03 ID:???] >>76 こういうコードがサーバー落とすんだなw
82 名前:nobodyさん mailto:sage [2009/11/18(水) 23:22:39 ID:???] >>81 だったら君はどんなコード書く? 元々SQLiteは大規模開発にはむかないDB。 そんなSQLite限定で利用すると考えればそんなに負荷がかかるかな?
83 名前:nobodyさん [2009/11/18(水) 23:27:05 ID:nmLyX5fb] >>75 strictで使える要素と属性、framesetで使える要素と属性・・・のように必要なものだけを取得するようなことをしてます 目的はdoctype別補完辞書作成の為なんです IDEは全て試したわけではありませんがaptanaとDreamweaverを試した限りではあるdoctyleに対応しない属性が出てきますし足りない属性も出てきます 反応良かったらコード公開するつもりでした 質問は締め切りROMに戻ります ますありがとうございました
84 名前:nobodyさん mailto:sage [2009/11/18(水) 23:44:48 ID:???] >$Lib_Kindが1だったらPEAR::DB、2だったらPEAR::MDB2使用 クラス使う意味が半分かそれ以上消えとるな。
85 名前:nobodyさん mailto:sage [2009/11/19(木) 00:01:54 ID:???] >>84 kwsk
86 名前:nobodyさん mailto:sage [2009/11/19(木) 00:29:52 ID:???] 20年ほど前の、プログラミング言語C++でもしっかり明記されとるわな。 switch〜caseは止めれって。(if〜elseifの羅列も同じこと) C++には相変わらずinterfaceは導入されて無い(よね?)けど、 それ以降出てきた言語たちにはinterfaceなんて有りがたいものが あるんだから、よりその言葉に従うのが楽だわな。
87 名前:nobodyさん mailto:sage [2009/11/19(木) 00:48:25 ID:???] >>86 でも、それってPHP5だけを考慮に入れた場合は良いけど、PHP4まで考慮に入れたシステムの場合NGでは? PHP4が、サポート終了ってなっているがPHP4系がいまだに使われているサーバなんて大量にまだあるからPHP4に対するプログラムの サポートってなかなか切れないよ。
88 名前:87 mailto:sage [2009/11/19(木) 01:03:22 ID:???] 追加。 今回のようなマルチな環境に対応させるくらいのシステムなんだから古いシステムも考慮した上での作りだと思うよ。 そもそも、新しいのだけを考慮しているシステムならPHP4どころかPEAR::DBもシステムから外すべき物。 pear.php.net/package/DB >This package has been superseded, but is still maintained for bugs and security fixes. Use MDB2 instead. ぶっちゃけな訳しかたすると「バグとセキュリティーのためにサポートは続くがMDB2って言う後継出ているからそっち使えよ。」 PEARはPHPで書かれたライブラリだから必ずしもpearコマンドでインストール必要もなく インストールされてないレンタルサーバでもアーカイブDLしてきてプログラムから呼び出すパスを、通せばいくらでも使える。 と言うわけで、プログラムの更新作業するのにDBは、「いらない子」。 MDB2とPDOをサポートするだけのプログラムにした方が良い。 PEAR::DB,PEAR::MDB2,PDOとサポートさせるプログラムを書いている奴が、PHP4のサポートをごっそりと打ち切ったプログラム書くのか?
89 名前:87 mailto:sage [2009/11/19(木) 01:27:04 ID:???] >>87 ,>88書いて気になったけどここ見ている人たちってDB関連は、 ・PEAR::DB ・PEAR::MDB2 ・PDO ・そんなものラッパ使わない。各DB関数直接使う どれが多い? それと ・必須環境はPHP5以降。PHP4は切り捨てた。 ・必須環境はPHP4以降。PHP4もサポートし続ける。 に関してもどうしている?
90 名前:nobodyさん mailto:sage [2009/11/19(木) 01:39:54 ID:???] ・PHP5or4のみでサポートされている関数は使わない ・せっかく専用の関数が有るのだからそれらを纏めて抽象化
91 名前:nobodyさん mailto:sage [2009/11/19(木) 01:57:50 ID:???] >>89 IDと元質問のレス番号出しなさい。
92 名前:nobodyさん mailto:sage [2009/11/19(木) 01:59:56 ID:???] >>79 >別途取得する処理を書いておく必要がある それがアホ設計だと言ってるんだがw デザインパターンとか知らんのかね
93 名前:nobodyさん [2009/11/19(木) 02:00:09 ID:7S9/ReIJ] >>86 教科書通りのお手本を書く場合ならそれでいいけど、interfaceの実装はPHP5から。 さて私はPHP4の動作を対象外にしてまでinterfaceを使うべきですか? PHP4を対象外にするならPHP5もPHP5.1から動作対象としてDBもPEAR::DBとPEAR::MDB2も切り捨ててより速度が出るPDOだけにしますよww
94 名前:nobodyさん mailto:sage [2009/11/19(木) 02:03:51 ID:???] そうしろよ
95 名前:nobodyさん [2009/11/19(木) 02:32:52 ID:7S9/ReIJ] >>92 デザインパターンの有効性って再利用時などに使いやすくなどだよね。 一時しのぎようのクラスにまでそのものが必要かどうかの天秤にかけると別にデザインパターンに 沿った作りにしないでもごり押しでソース書いておけばとりあえずはいいや。って結論になったアホな俺。 >>94 単純に切り捨てができれば苦労しない。
96 名前:nobodyさん mailto:sage [2009/11/19(木) 03:12:12 ID:???] 再利用だのそんな問題ではなく >>76 を見て何とも思わないん? まぁ書いた本人だから思わないんだろうけど、今後もプログラム書いていくなら もうちょっとここの人達の意見にも耳を傾けてみたほうが幸せになれるんじゃないかなと思う次第
97 名前:nobodyさん mailto:sage [2009/11/19(木) 03:41:33 ID:???] >>76 継承を覚えろ。