【PHP】下らねぇ質問はID出して書き込みやがれ 90at PHP
【PHP】下らねぇ質問はID出して書き込みやがれ 90 - 暇つぶし2ch5:nobodyさん
09/11/14 17:32:22
10. そもそもインストールの時点でうまくいかない
 → 確認すべきはPHPのconfigureの引数、php.iniの内容と置き場所、
  Webサーバの設定(Apacheならhttpd.conf)、起動&再起動あたり
11. SQLの質問はどこで?
 → データベース板に誘導されるのが嫌ならPHPにうまく関連させて質問する
12. 文字列のなかに、英字のみとか数字のみとか記号が入っちゃいやんとかはどうしたらいいの?
 → ctype_~()が手軽。複雑なパターンはpreg_~()あたりで正規表現を使う。
13. $a1, $a2, $a3 ... のような変数名をうまく扱いたい
 → 可変変数で実現できるけど、むしろ配列を使って$a[1], $a[2], $a[3]等とするのがベター
14. echoとprintってどう違うの?
 → よく議論される話題であるが基本的に両者とも同じ。 以下ちょっとした議論。
  URLリンク(www.faqts.com)
15. クッキーの情報をユーザから隠したい
 → セッション使え。ただしクッキーとセッションは仕組みが違うから同じように扱うな
16. strip_tags()で削除しないタグを複数指定したい
 → strip_tags($html, '<a><p><font>'); // htmlspecialchars()も検討すべし
17. CSVやTSVのファイルをスマートに扱いたい
 → まずはfgetcsv()。ただし日本語を含むと正常に動作しない場合があるので注意だ。
18. 値渡しと参照渡し(「&」を使う)のパフォーマンスの違い
 → C言語じゃないので、パフォーマンス目的で使いわけたらダメ。参照渡しにすると逆に遅くなったりする
  参照渡しは引数に戻り値を設定したり引数を関数内で変更するなど、正しい目的に使うこと
19. ファイル入出力関数(fopen等)でリモートファイル(http://~とか)を扱う際の限界
 → fsockopen()でソケット通信 or PEARのHTTP系 or CURLで解決
  必要ならHTTPをはじめとする各種プロトコル(どんなデータを送受信するか)はRFCなどで調べる
20. PHPからPOSTリクエストしたい
 →19.を参照
21. 画像処理一般 or GDの限界
 → ImageMagick(PECLのやつ or シェルから実行)
22. 画像・音・動画はファイルで保存?DBに保存?
 → 好きにしてください


6:nobodyさん
09/11/15 16:44:09
>>1

7:nobodyさん
09/11/16 11:03:50 bvqRdc2u
ソフトバンクの「基礎からのMySQL」のP450のコードなのですが、
<?php
/* データベースへ接続、データベース選択 */
$s=mysql_connect("localhost","root","1234") or die("失敗です");
mysql_select_db("db1",$s);

/* NAMEがhのVALUEを変数$h_dに代入 */
$h_d=$_POST["h"];

/* $h_dがsel、ins、del、serのどれかで条件分岐 */
switch("$h_d"){
case "sel":
$re=mysql_query("SELECT * FROM tbk ORDER BY bang");
break;
case "ins":
$a1_d=$_POST["a1"];
$a2_d= $_POST["a2"];
mysql_query("INSERT INTO tbk (nama,mess) VALUES ('$a1_d','$a2_d')");
$re=mysql_query("SELECT * FROM tbk ORDER BY bang");
break;
case "del":
$b1_d=$_POST["b1"];
mysql_query("DELETE FROM tbk WHERE bang=$b1_d");
$re=mysql_query("SELECT * FROM tbk ORDER BY bang");
break;
case "ser":
$c1_d=$_POST["c1"];
$re=mysql_query("SELECT * FROM tbk WHERE mess LIKE '%$c1_d%' ORDER BY bang");
break;
}



8:nobodyさん
09/11/16 11:04:58 bvqRdc2u
/* クエリの結果を表示 */
while($kekka=mysql_fetch_array($re)){
print $kekka[0];
print " : ";
print $kekka[1];
print " : ";
print $kekka[2];
print "<BR>";
}

/* データベース切断 */
mysql_close($s);

/* トップページへのリンク */
print "<BR><A HREF='kantan2.html'>トップメニューに戻ります</A>";
?>

を実行すると、上手く動作しないだけか、
「 "; } /* データベース切断 */ mysql_close($s); /* トップページへのリンク */ print "
トップメニューに戻ります"; ?> 」
とブラウザ上にphpファイルの内容が表示されてしまいます
コレは何がおかしいのでしょうか?
printの部分がおかしいのではないかと思うのですが・・・
自分でも一応色々と書き直してみたのですが、改善されません

9:nobodyさん
09/11/16 11:39:37
PHPが動いてないような。 多分ブラウザでソースみるとまるまる見えてると思います。

10:nobodyさん
09/11/16 11:44:45
phpは動いてるけどapacheに関連付けられてないのかも

11:8
09/11/16 11:56:21
>>9

他のサンプルコードは動いていました
似たようなコードを実行したときには、このようにphpの内容がブラウザに出力されていませんでした

>>9さんの言われているように、今FireBugでスクリプトを開いて見てみたところ、ソースが(<?php~?>の中が)表示されていました
URLリンク(localhost)から出力したからなのか、自分には知識が乏しいので分かりませんが、こういう場合はどのようにすれば解消するのでしょうか?


>>10

そうなのでしょうか
よく分からないのですが、一応他のサンプルなどは動いています
ただし、それらが動作するからといってApacheに関連付けられているのかは自分には分かっていないのですが・・・



12:8
09/11/16 12:05:29
ごめんなさい、書き忘れました

結局この場合、上記のサンプルコードが間違っているのではなく、自分のPHP又はApacheの設定がおかしいという事なのでしょうか?
一応単純に
<? php
print "山田";
?>
と打つと、ブラウザには(localhostから出力していますが)山田と表示されます


13:nobodyさん
09/11/16 13:17:29
>>1

14:8
09/11/16 13:18:33
再びごめんなさい・・・。ありがとうございます、問題が解決しました。お騒がせしました

15:nobodyさん
09/11/16 13:20:55
はい?

16:nobodyさん
09/11/16 13:32:47
せめて何だったのか書いてくれるとあなたの書き込みが無駄にならずにすむ。

17:8
09/11/16 14:11:11 bvqRdc2u
すみません、>>14は自分ではありません・・・

18:8
09/11/16 14:29:25 bvqRdc2u
今コマンドプロンプトから構文エラーチェックをしてみたのですが、構文エラーなしと書かれていました
う~ん、なんでブラウザにprint後のコードが出力されるのでしょうか・・・?

19:nobodyさん
09/11/16 14:56:43 +MFbLdTc
phpスクリプトをシンボリックリンクで置くのはダメなんでしょうか?
hoge.php はちゃんと動くんですが,
他の場所に hoge.php を置いてシンボリックリンクで参照すると
403 Forbidden になります.
CentOS + lighttpd + php-cgi です.

20:nobodyさん
09/11/16 15:14:29
>>19
シンボリックリンク使える。
webサーバの設定でシンボリックリンクの許可をしておかないと駄目
lighttpdは使った事無いけど、
ググったらでてきた↓↓の設定はしてある?

server.follow-symlink = "enable"

21:nobodyさん
09/11/16 17:02:14
>>18
ソースうp

22:8
09/11/16 17:32:02 bvqRdc2u
>>21

>>7-8にコードは書いております
構文チェックはphp -lで行いました


23:nobodyさん
09/11/16 18:18:13
データベースに「"」を含む項目あるか?

24:nobodyさん
09/11/16 18:40:26
いやだから.phpファイルがPHPに関連付けられてないからでしょ

25:nobodyさん
09/11/16 18:55:01
php そのファイル で動きますか?

apacheとかIISは分かります?



26:nobodyさん
09/11/16 20:34:49 HkdbmVie
javascriptで、テキストボックスに文字列を追加していきたいんですがどうやったらいいでしょうか。
 
具体的には、1ページ内に、
”明日””今日””昨日”のように複数の文字列の下に、追加ボタンをおいて、
押された順番に、例えば、
明日昨日今日と押したら、
明日
昨日
今日
となるように、
テキストボックスに改行しながら文字列を追加していくような感じのを作りたいんです。

よろしくお願いします<m(__)m>

27:nobodyさん
09/11/16 20:45:41 HkdbmVie
すいませんこちらPHP専用のようでした
取り消してこちらに移動させてもらいます<m(__)m>

△▲ WebProg 初心者の質問 Part21 ▼▽
スレリンク(php板)

28:nobodyさん
09/11/16 22:35:06
>>8
<?からBRの後の>がタグと解釈されてるだけ、だな。
ブラウザのソースの表示で見たら、全部見えるかも。

29:nobodyさん
09/11/16 23:19:35
cli版はモジュールとして動かすのと挙動が同じだと思ってるksな8

30:nobodyさん
09/11/16 23:40:57 DxyMrPHB
$a['test']['a1'] = 1;
$a['test']['a2'] = 2;

$b['test']['b3'] = 3;
$b['test']['b4'] = 4;

上記のような配列があり、array_merge()的な手法で下記のように結合したいのですがどうすればいいでしょうか?

$ab = array {
 ["test"]=>
  array {
   ["a1"] => 1
   ["a2"] => 2
   ["b3"] => 3
   ["b4"] => 4
 }
}

ちなみに、array_merge()では["test"]キーで上書きされてしまいます。
よろしくお願いします。

31:nobodyさん
09/11/16 23:55:57
>>30
惜しい
array_merge_recursive()

32:nobodyさん
09/11/17 00:02:14 149D2nEE
>>31
うぉぉおおぉ!
ありがとうございます!!

33:nobodyさん
09/11/17 00:07:29
$c = array_merge_recursive($a,$b);

34:nobodyさん
09/11/17 10:32:58
それphp5.3からじゃん
ほんと使えねえksだな

35:nobodyさん
09/11/17 11:03:39
どこの誤爆かな?

36:nobodyさん
09/11/18 03:36:08 /HH3qrl4
PHP5.3の開発環境でデータベース接続に関してですが
PEAR::DBとPEAR::MDB2とPDOの3つでテストしているのですが
MySQLとPostgreSQLに関しては上記の3種類で問題なくselectを発行して結果が返ってくるのですが
SQLite2のデータベースファイルに関してですがPDOでは問題ないのですが
PEAR::DBとPEAR::MDB2で問題が発生しました。
それぞれ接続
$db = DB::connect('sqlite:///ファイル名');
$db = MDB2::connect('sqlite:///ファイル名');
って感じで書いています。

PEAR::DB用
$result = $db->query(SELECT文);
while($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){
 print_r($row);
 echo "<br>";
}

PEAR::MDB2用
$result = $db->query(SELECT文);
while($row = $result->fetchRow(MDB2_FETCHMODE_ASSOC)){
 print_r($row);
 echo "<br>";
}
としてそれぞれ処理しているのですがループに一回も入らず終了してしまいます。
同じソースをPHP5.2.1の環境で使う場合は問題なく動きました。

MDB2のバージョンは2.4.1
MDB2_Driver_sqliteのバージョンは1.4.1を利用しています。
なにか対処の方法ってありますか?


37:nobodyさん
09/11/18 03:49:00
とりあえず変数の中身やPHPのエラーを表示させてみたら?

38:nobodyさん
09/11/18 04:13:07 /HH3qrl4
>>37
どうもです。とりあえず書き込みした後テストしてわかったのですが
キモはdisconnectみたいです。
>>36で書いた処理は大まかな処理で実際にはDB接続&SQL発行部分はクラス化していて
大まかな処理は(下記はPEAR::DB用でPEAR::MDB2利用時にはDBの部分をMDB2にしてある)
$sql_UTF8 = "SET NAMES utf8";
$db = DB::connect($this->DB_connect);
if (DB::isError( $db )) {
die($db->getMessage());
}
$res = $db->query($sql_UTF8);
$result = $db->query($sql);
if (DB::isError( $result )) {
die($result->getMessage());
}
$db->disconnect();
return $result;
って感じの処理です。
PHP5.3環境においてSQLite利用時のみ$db->disconnect()の段階で取得していたSQLの結果を破棄してしまっているようです。
$db->disconnect();をコメントアウトしておくと取得できました。
PostgreSQLとMySQLは保持したまま。

また、PHP5.2.1環境下ではSQLite環境下でも$db->disconnect();しても値は残ったままのようです。

なにかしら対策の方法ってありますか?
それとも俺の書き方自身に問題があるでしょうか?


39:nobodyさん
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
継承を覚えろ。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch