09/11/18 07:17:47
>>38
sqlite_close()の中で結果セットまで削除する仕様が原因だね
MySQLではmysql_close()が呼ばれていても
"mysql result"リソースのデストラクタが働くまでは参照可能
嘘言ってたら許してくれ
まぁ実装に左右されたくなかったら
結果セットが必要なくなってから切断する設計にするべき
40:nobodyさん
09/11/18 10:00:16 xkg9vx1z
mysqlのpdoを使いたいのですがwindowsではどのようにしてインストールと設定を行うのでしょうか?
php5.2.10です
41:nobodyさん
09/11/18 10:52:23
URLリンク(php.net)
書いてあるよ
42:nobodyさん
09/11/18 12:27:53 /HH3qrl4
>>39
ありがとうございました。
>sqlite_close()の中で結果セットまで削除する仕様が原因だね
PEAR::DBにしてもPEAR::MDB2にしても各DB関数のラッパーと考えると
PHPのバージョンで>sqlite_close()の挙動が変わったと言うことですね。
>結果セットが必要なくなってから切断する設計にするべき
さてこれどう実装したものか。
俺の実装の仕方が
1.PHPメイン
↓
2.SQL文生成クラス
↓
3.SQL送信クラス(>>38はその一部)
ってやり方やっているんだよね。
2.でメインのPHPから渡された引数を元にSQL文を生成して
3.で2.で生成されたSQL文をDBに接続してSQL発行してDB切断
で処理が2.に戻ってwhile($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){でループさせて結果を取得
って一連の流れをどうにかしないとダメって事か?さてどう作り直したらいい事か?なんかアイディアありませんか?
43:nobodyさん
09/11/18 12:29:21
普通はSQL発行するたびに接続と切断を繰り返したりしないかと
44:nobodyさん
09/11/18 12:38:39 /HH3qrl4
>>43
一回の処理でSQLが発行されるのは1回がほとんどだからこの様な実装方式にしています。
45:nobodyさん
09/11/18 12:38:54
そうですか
46:nobodyさん
09/11/18 12:55:03
DBから結果が返ったら、さっさと自分の側に取り込まないか?
取り込んどきゃ、ライブラリ側管理のデータがどうなろうが影響無いと思うんだが。
まあ、大抵ちょー大量に返ってくるというのなら、また違うかもしれん。
47:nobodyさん
09/11/18 13:18:45
>>46
だからその処理は2.のクラスでやっている。
で取得したDBのデータそのものを使うのは1.の部分。
ちなみに3.のクラスはSQL送信だけではなくて
PEAR::DB、PEAR:MDB2、PDOのラッパー(実行環境によって使えるライブラリが変わったときにソースの修正をせずに済むようにするため)
としてさらにはMySQL、PostgreSQL、SQLiteのラッパーとしての
役割を持たせた物。
だから下手に2.の部分と統合されられない。
48:nobodyさん
09/11/18 13:23:33
なんでSQL文生成クラスがバッファリングw
DB駆動クラス(他から見れば、そいつがDBと言ってもいい)がやるならともかく。
49:nobodyさん
09/11/18 13:38:27
>>47
急に偉そうになったな
ルールも守ってないし
50:nobodyさん
09/11/18 13:45:40 /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さん
09/11/18 13:47:55
>>50
>だからその処理は2.のクラスでやっている。
などと言ってるけどその設計から見直したら?っていう話なのでは?
アドバイスしても「俺のクラスではこうなんだ」としか言われなかったら
はいそうですかどうぞご自由にと何も言うことなくなる。
52:nobodyさん
09/11/18 14:01:36 /HH3qrl4
>>51
現状できあがったシステムで(今まではPEAR::DB+PostgreSQLの環境)
PEAR::DB、PEAR::MDB2、PDOやMySQL、PostgreSQL、SQLiteなマルチな環境下で動くようにバージョンアップ作業していたときに
ついでに5.3での挙動もチェックしちゃえってテストしていたときに発生した問題で
根本的な設計をし直したらシステム全体も書き換えになってしまうので最低限の変更でなんとかならないかと今回の質問をしたのです。
って内情まで説明しないとダメですか?
53:nobodyさん
09/11/18 14:07:58
あのね、自分の思ってることが言葉で説明しなくても自動的に他人に伝わることはありえないんだよ?
54:nobodyさん
09/11/18 14:20:43
ふむふむ、クラスの内部でちょこっとデータ保持するようにすると、
システム全体も書き換えになってしまう、と。
どんな作りやねんw
まあそれでも、他者が作ったそういうものでも何とかしなきゃならん仕事での立場だとしたら、
もしそうならちょこっと同情はする。
55:nobodyさん
09/11/18 14:22:49
>>49
お前みたいな知識も無い素人PHP外野専門はROMってろ
56:nobodyさん
09/11/18 14:38:02 /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さん
09/11/18 14:46:27 xi1WciP2
GDを使って画像のサイズを取得しようとしています。
$images = getimagesize("URLリンク(localhost)");
というURLだと取得できないのですが、
$images = getimagesize("URLリンク(www.google.co.jp)");
というGoogleのロゴのサイズを取得しようとしたら出来ました。
getimagesizeを使う場合、localhostからは取得できないのでしょうか?
もし出来ない場合、どうやってローカルサーバの画像を参照すればいいのか
方法を教えていただければと思います。
58:nobodyさん
09/11/18 14:49:42
とりあえず、
ローカルPC上のブラウザから"URLリンク(localhost)"が見えてるよね?
59:57
09/11/18 14:52:09 xi1WciP2
はい。見えてます。
60:nobodyさん
09/11/18 14:57:17 /HH3qrl4
>>59
そのローカル環境のファイル壊れてないよね?
一応、>>57のソースを元に
$images = getimagesize("URLリンク(www.google.co.jp)");
print_r($images);
echo "<br>\n";
$images2 = getimagesize("URLリンク(localhost)");
print_r($images2);
ってソースを書いてテストしたけど問題なく取得できた。
ローカルでのlogo.gifはgoogleのロゴをそのまま保存して利用。
ちなみに
$images = getimagesize("./logo.gif");
の様に相対パスで書いた場合はどうなる?
61:nobodyさん
09/11/18 15:01:07
なんか見落としてる予感だわな
エラーメッセージは出ないのか
62:57
09/11/18 15:04:24 xi1WciP2
>>60
相対パスや絶対パスだと普通に表示されます。
なぜかURLにするとずっと読み込み状態で、
停止してもエラーメッセージなどは出ません。
ローカルサーバがWindowsXPのApacheだからでしょうか?PHPは5.2.5です
63:nobodyさん
09/11/18 15:15:31
>>62
max_execution_timeやdefault_socket_timeoutの値を変えてエラーがどうなるか試してみたら?
64:nobodyさん
09/11/18 15:18:25
>>61
その場合、php.iniの中身も確認しないとダメかもね。
display_errorsやerror_reportingまわりがどうなっているか確認しないとダメかも。下手したら非表示になっていたりして
(以前どこだったかな。レンタルサーバでこれのレベルが下げてあってエラーも警告も出なかったことある。)
>>62
後、
header("Content-type: image/gif");
$filename = "URLリンク(localhost)";
$f = fopen($filename, "rb");
$buf = stream_get_contents($f);
fclose($f);
echo $buf;
なソースを書いてphp側で画像取得できるのか?
これすらNGだとPHPよりapache側の根本的な設定に問題がありそう。
>>60は俺だけど今度は回答側に回ったのにsage付け忘れました。すみませんでした。
65:57
09/11/18 15:24:10 xi1WciP2
みなさんありがとうございます。たぶん、サーバの設定の問題かも知れません。
先ほどサブのPCで同じ事をしたらサイズが取得できました。
php.iniの設定や>>64さんが書かれている内容も参考にしてみます。
66:nobodyさん
09/11/18 15:55:00 jaz8gdLl
data.txtから最終行を読み込んで表示した後、 <br> その最終行をdata.txtから削除するにはどんな方法でやれば良いでしょうか?
67:nobodyさん
09/11/18 16:00:18
fileでよみこんでend使ってunsetして書き込み
68:nobodyさん
09/11/18 16:29:22 jaz8gdLl
>>67
ありがとうございます。
69:39
09/11/18 19:57:24
>>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さん
09/11/18 20:36:09
$resultは参照になってると思うが大丈夫かい?
71:nobodyさん
09/11/18 20:36:48
>>69
訳してくだはい
72:nobodyさん
09/11/18 20:37:46
>>71
え、何を?
73:nobodyさん
09/11/18 21:20:51 nmLyX5fb
HTML4.01とXHTML1.0のタイプ別にDTDから要素と属性を取得するプログラムって探してもなかったのですが需要がないのでしょうか?
自分も書いてみたもののスマートな感じではないので勉強のためにソースを探しています
どなたかご存知の方いらっしゃいましたら教えてください
74:nobodyさん
09/11/18 21:23:06
誰得?
75:nobodyさん
09/11/18 21:35:27
何のためにそんなの作るの?
IDEのコード補完で勝手にやってくれるでしょ
76:nobodyさん
09/11/18 21:40:40 /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さん
09/11/18 21:43:23 /HH3qrl4
>>69
>確かに5.3で挙動が変わってるナー
どうせやるなら他のDB系関数の挙動も変更すればいいのに
それにしてもなんでこんな中途半端(SQLiteのみ)な仕様変更したんだろう?
78:nobodyさん
09/11/18 21:47:22
>>76
なんで全部fetchしてんの?
あとfetchAllがあるよ
79:nobodyさん
09/11/18 22:10:31
>>78
とりあえずMDB2で説明すると
URLリンク(pear.php.net)
while ($row = $result->fetchRow()) {
だった場合拾う値はデフォルトである
MDB2_FETCHMODE_ORDEREDのみの型。
MDB2_FETCHMODE_ASSOCやMDB2_FETCHMODE_OBJECT の値も別途取得する処理を書いておく必要がある。
ただしMDB2_FETCHMODE_OBJECTの書き方はオブジェクトとして取得するのでなんか変な気がする。
80:nobodyさん
09/11/18 22:22:48
>>75
>勝手にやってくれる?
kwsk
81:nobodyさん
09/11/18 23:08:03
>>76
こういうコードがサーバー落とすんだなw
82:nobodyさん
09/11/18 23:22:39
>>81
だったら君はどんなコード書く?
元々SQLiteは大規模開発にはむかないDB。
そんなSQLite限定で利用すると考えればそんなに負荷がかかるかな?
83:nobodyさん
09/11/18 23:27:05 nmLyX5fb
>>75
strictで使える要素と属性、framesetで使える要素と属性・・・のように必要なものだけを取得するようなことをしてます
目的はdoctype別補完辞書作成の為なんです
IDEは全て試したわけではありませんがaptanaとDreamweaverを試した限りではあるdoctyleに対応しない属性が出てきますし足りない属性も出てきます
反応良かったらコード公開するつもりでした
質問は締め切りROMに戻ります
ますありがとうございました
84:nobodyさん
09/11/18 23:44:48
>$Lib_Kindが1だったらPEAR::DB、2だったらPEAR::MDB2使用
クラス使う意味が半分かそれ以上消えとるな。
85:nobodyさん
09/11/19 00:01:54
>>84
kwsk
86:nobodyさん
09/11/19 00:29:52
20年ほど前の、プログラミング言語C++でもしっかり明記されとるわな。
switch~caseは止めれって。(if~elseifの羅列も同じこと)
C++には相変わらずinterfaceは導入されて無い(よね?)けど、
それ以降出てきた言語たちにはinterfaceなんて有りがたいものが
あるんだから、よりその言葉に従うのが楽だわな。
87:nobodyさん
09/11/19 00:48:25
>>86
でも、それってPHP5だけを考慮に入れた場合は良いけど、PHP4まで考慮に入れたシステムの場合NGでは?
PHP4が、サポート終了ってなっているがPHP4系がいまだに使われているサーバなんて大量にまだあるからPHP4に対するプログラムの
サポートってなかなか切れないよ。
88:87
09/11/19 01:03:22
追加。
今回のようなマルチな環境に対応させるくらいのシステムなんだから古いシステムも考慮した上での作りだと思うよ。
そもそも、新しいのだけを考慮しているシステムならPHP4どころかPEAR::DBもシステムから外すべき物。
URLリンク(pear.php.net)
>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
09/11/19 01:27:04
>>87,>88書いて気になったけどここ見ている人たちってDB関連は、
・PEAR::DB
・PEAR::MDB2
・PDO
・そんなものラッパ使わない。各DB関数直接使う
どれが多い?
それと
・必須環境はPHP5以降。PHP4は切り捨てた。
・必須環境はPHP4以降。PHP4もサポートし続ける。
に関してもどうしている?
90:nobodyさん
09/11/19 01:39:54
・PHP5or4のみでサポートされている関数は使わない
・せっかく専用の関数が有るのだからそれらを纏めて抽象化
91:nobodyさん
09/11/19 01:57:50
>>89
IDと元質問のレス番号出しなさい。
92:nobodyさん
09/11/19 01:59:56
>>79
>別途取得する処理を書いておく必要がある
それがアホ設計だと言ってるんだがw
デザインパターンとか知らんのかね
93:nobodyさん
09/11/19 02:00:09 7S9/ReIJ
>>86
教科書通りのお手本を書く場合ならそれでいいけど、interfaceの実装はPHP5から。
さて私はPHP4の動作を対象外にしてまでinterfaceを使うべきですか?
PHP4を対象外にするならPHP5もPHP5.1から動作対象としてDBもPEAR::DBとPEAR::MDB2も切り捨ててより速度が出るPDOだけにしますよww
94:nobodyさん
09/11/19 02:03:51
そうしろよ
95:nobodyさん
09/11/19 02:32:52 7S9/ReIJ
>>92
デザインパターンの有効性って再利用時などに使いやすくなどだよね。
一時しのぎようのクラスにまでそのものが必要かどうかの天秤にかけると別にデザインパターンに
沿った作りにしないでもごり押しでソース書いておけばとりあえずはいいや。って結論になったアホな俺。
>>94
単純に切り捨てができれば苦労しない。
96:nobodyさん
09/11/19 03:12:12
再利用だのそんな問題ではなく
>>76を見て何とも思わないん?
まぁ書いた本人だから思わないんだろうけど、今後もプログラム書いていくなら
もうちょっとここの人達の意見にも耳を傾けてみたほうが幸せになれるんじゃないかなと思う次第
97:nobodyさん
09/11/19 03:41:33
>>76
継承を覚えろ。