【PHP】質問スレッドpart31【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/11/27(日) 00:07:12ID:eBvjdczp【基本ルール】
・新規質問の方は上げてください。age進行でお願いします。
・質問者は2回目以降、最初のレス番号を名前欄に入れてください。
・回答者は質問者に対して>>(アンカー)をつけてください。
・煽り・荒らしは放置。荒らしに反応した香具師も荒(ry
・解決しなくてもこたえてもらったら礼を。
【質問テンプレ】
・マニュアルを調べたか、google検索したか(調べたキーワード)
・タイトル(禁:教えてください!etc) 例:requireとinclude
・内容 例:requireとincludeはどう違うのですか?
・質問する際には環境も明記。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・オブジェクト指向については良スレがないから本を買え
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
【PHP マニュアル】
http://www.php.net/manual/ja/
※マニュアル上部の「search for」から検索を活用すべし(便利)。
過去スレ、関連リンク、FAQ等>>2-10辺り
0048nobodyさん
2005/11/28(月) 02:07:56ID:???0049nobodyさん
2005/11/28(月) 02:25:52ID:???このスレではどれくらいの割合で、
「マニュアル読め」というレスがありますか?
0053nobodyさん
2005/11/28(月) 03:13:59ID:???前スレを対象にマニュアルでレスを絞り、
マニュアル嫁的なレスを数えてみたところ、18のレスがありました。
およそ2%ですね。ちなみにくだ質の前スレは20のマニュアル嫁的なレスがありました。
これからも頑張ってください^^
0054nobodyさん
2005/11/28(月) 04:04:34ID:???実際にはPHPには連想配列しかないと考えていいと思う。
マニュアルには
> 配列型は1つだ けで、整数または文字列のインデックスを使用することができます。
と表現されてるけど、実際にはインデックスには文字列しか使えないと言ったほうがベター。
PHPでは整数インデックスであってもハッシュ表を検索している。
つまり暗黙の型変換は'0'→0ではなく0→'0'の方向に行われる。
メモリ上のオフセットでアクセスする本物の整数インデックスと比べると計算理論上の計算量は等しいけど、実質的にはPHPで配列へのアクセスが大量にあると普段は高速なPHPもひどく速度落ちする。
ハッシュがらみ以外に余計な計算はしていないので、速度落ちの原因はそれ以外ないと思う。
「インデックスに整数も使える」と言っているのは、「Perlで言うハッシュしか使えない」という側面を隠蔽するためのPHP側の戦略。
ここに暗黙の型変換がうまい位置で役立っている。
まあ実用上は「整数も使える」とごまかしておいたほうがわかりやすいってのはあるけど。
0055nobodyさん
2005/11/28(月) 04:10:38ID:???0056nobodyさん
2005/11/28(月) 04:21:31ID:???PHPのハッシュは単純な見た目と操作感に反して、色々と工夫が面白い。
0057nobodyさん
2005/11/28(月) 04:33:09ID:???0059nobodyさん
2005/11/28(月) 04:54:44ID:a54yzRbD0061nobodyさん
2005/11/28(月) 04:57:41ID:???というかこいつレス読んでたんだなw
0062nobodyさん
2005/11/28(月) 06:31:41ID:???0063nobodyさん
2005/11/28(月) 06:38:05ID:???0064nobodyさん
2005/11/28(月) 07:47:10ID:???0066nobodyさん
2005/11/28(月) 11:36:21ID:ig9+vMm1function scan_directories($dir) {
$file_array = array();
if (is_dir($dir)) {
$dh = opendir($dir);
chdir($dir);
while (false !== ($filename = readdir($dh))) {
array_push($file_array, $filename);
}
closedir($dh);
foreach ($file_array as $file) {
if (is_dir($file) && !is_parent_or_current($file)) {
scan_directories($file);
} elseif (is_file($file)) {
//ファイルに関する処理
}
}
}
こういう関数を作ったんですが、ひとつのディレクトリを降りていくだけで、
ほかのディレクトリが無視されます。どうしたら全部のディレクトリとファイル
を見付けてくれるのでしょう?
006766
2005/11/28(月) 11:37:26ID:ig9+vMm10068nobodyさん
2005/11/28(月) 11:56:02ID:8B6mTUujまず、「is_parent_or_current」が何か教えてくれ(−−;
0069nobodyさん
2005/11/28(月) 12:06:34ID:y2JYG8tO$fileにディレクトリパスを含んでない
0070nobodyさん
2005/11/28(月) 12:18:27ID:???007266
2005/11/28(月) 13:42:01ID:ig9+vMm1ああ、すみません。指定ディレクトリが親ディレクトリか
カレントディレクトリの場合trueを返す関数です。
>>69
そのとおりでした。ありがとうございます。
とかいってまだ動いてないんですけどね。
回答くださってありがとうございました。
0075nobodyさん
2005/11/28(月) 14:39:51ID:???アホか。
・chdir一切せず、$fileには初期のカレントディレクトリから相対パス全体を保持
・chdirしながら$fileにはbasenameのみ保持、再帰呼び出し直後でchdir("..")
のどちらかだろ。
どーせ理解できてないんだろうがな。
0077nobodyさん
2005/11/28(月) 16:49:17ID:???Win2000Pro + Apache + (PostgreSQL or MySQL)
にて、LAN内のみにおいて、ブラウザベースでの簡易なデータベース操作(データ登録、削除、表示)を行いたいと思います。
当方、PHPはだいたい使え、SQLも問題ありません。(と思う)
ここで問題となるのが、ブラウザで表示した表の印刷に関してです。
通常テーブルタグにて適宜データを列挙するのがブラウザベースのやり方だと思いますが、
A3やA4縦などの所定の用紙に印刷するために、みなさんはどのような方法を取っていますか?
0078nobodyさん
2005/11/28(月) 17:08:50ID:???COMでね
0080nobodyさん
2005/11/28(月) 17:31:48ID:???まあPHPのPDF関数がどこまでできるのか知らんけど、PHP+SQLで普通のWebページ作るのに慣れてるんだったらCSSでなんとかするのも一つの方法ではないかと。
たしかCSSって元々は出版関係とかにも使えるような仕様だったと思うからそこそこ使える希ガス。
widthとかmarginとかはパーセントでもセンチでも指定できるし、page-break-*とか組み合わせればけっこういけると思う。
スレ違いだけど。
0081nobodyさん
2005/11/28(月) 17:36:42ID:???http://msugai.fc2web.com/web/CSS/media.html
0082nobodyさん
2005/11/28(月) 17:42:21ID:???その辺りのコスト考えるとCSSの方が手っ取り早いと思う。
無償のPDFライブラリがあるなら是非俺も知りたい。
0084nobodyさん
2005/11/28(月) 17:47:24ID:???http://fpdf.japansite.net/
008677
2005/11/28(月) 19:15:10ID:???スタイルシートが手軽そうですが、PDFだとカコイイですね。
とりあえずPDF関連は知識がないので、
CSSで作成後、随時PDFにチャレンジしていこうかとおもいます。
0087nobodyさん
2005/11/29(火) 07:03:16ID:???どうかご教授ください。
お願いします。
0089nobodyさん
2005/11/29(火) 07:48:29ID:gl3Jq/2LMySQLでやれよ(w
MySQLあるのにテキストファイルって。。。
0091nobodyさん
2005/11/29(火) 08:42:59ID:???MySQLは使ったことないけど、確かautoとかをカラム名の前に
つけるんじゃなかったっけ?
0093nobodyさん
2005/11/29(火) 08:46:50ID:???flock 後、ファイルを上書きモードで開き、
格納されてる数値を読み取った後、先頭にseekしてインクリメントした数値を書き入れる。
0094nobodyさん
2005/11/29(火) 08:49:05ID:???0096nobodyさん
2005/11/29(火) 09:03:09ID:gl3Jq/2Lテキストファイル読む方が遅いだろう。
SQL発行する方が速いし。
>>93
flockしたまま終了しちゃってるとか、seekできなかったとか、書けなかったとか、例外処理がいろいろ面倒だけどね。
0097nobodyさん
2005/11/29(火) 09:14:19ID:???番号をテキストファイルで管理するのは、シングルクライアントだと言い切れるならいいかもしれんが...
0098nobodyさん
2005/11/29(火) 09:16:00ID:???0099nobodyさん
2005/11/29(火) 09:30:46ID:???ディレクトリの中のファイル一覧を作成して、その中で最大数となるファイル名(数字)に
+1して行くしかないよ。仮にMySQLで発行されるIDと関連付けるならmysql_insert_id();
で新規追加されたIDを拾得してそれをファイル名に使えばOK。
0100nobodyさん
2005/11/29(火) 09:38:42ID:???同名ファイルでかち合ったりしないかと危惧しているのですよ
ファイルのまんまバイナリでDB放り込むってのもアリではないですかと
0102nobodyさん
2005/11/29(火) 11:07:17ID:???0103nobodyさん
2005/11/29(火) 11:18:43ID:???flockはプロセス終了で自動的に解除じゃないっけ?
>>100
flockだけの単純な構造でも、同時アクセスでもかちあったりはしないよ。
連続でflockを囲んで1000回ファイルをアクセスを繰り返すスクリプトを、複数ブラウザから同時に起動させても、
ちゃんとカウントは ブラウザ枚数×1000 になる。
0104nobodyさん
2005/11/29(火) 11:23:27ID:???うpされているファイルのレコードを作成しておくのが自然だから、
(うptime, REMOTE_ADDR、オリジナルファイル名、ファイルサイズ、ファイル種別、等)
それでもって極めて普通に1レコード作ればいいんじゃ。
IDはシーケンス。
0105104
2005/11/29(火) 11:39:40ID:???とりあえず、UNIQ_IDでファイル名を保存しておいて、MySQLにインサートした後IDを取り出し、
それでもってファイル名を変更する。
でいいんじゃないかな?
0106nobodyさん
2005/11/29(火) 12:11:28ID:???ファイル名をuniqidで振りなおしてから管理しとけばいいんじゃねぇの?
0107nobodyさん
2005/11/29(火) 12:14:13ID:???0108nobodyさん
2005/11/29(火) 14:38:43ID:???わたくし、PHP3国際化版にて日本語文字対応の掲示板を作成したことがあります。
さて、季節もうつろい、現在は国際化PHPというのではなく、JSTRINGというので日本語を対応していると聞きます。
ただ、JSTRINGという名詞しか知らないので、これからやろうとする私に、
よくわかるようにおしえていただけませんか?
0109nobodyさん
2005/11/29(火) 15:05:44ID:???0110nobodyさん
2005/11/29(火) 15:18:42ID:oXQKlnSf一度ファイルの内容を退避して、新データ+退避データを全部書き込まなければいけないんでしょうか?
それだと時間かかるし、ファイルの最後に追記すると、出力するときにデータを最後まで読まなければいけないんで、
なんかいい方法plz!
0111nobodyさん
2005/11/29(火) 15:19:39ID:???0114nobodyさん
2005/11/29(火) 15:36:05ID:???PHP4+でmbstring使ってください。
>>110
ファイルの先頭に挿入するには全体を書き換えるしかない
あ、末尾に追加する方で最後のデータの位置(ftellの返り値)だけ別のとこに保存しとく手もあるか。
サイトの規模や内容をよく吟味して決めてくれ。(読み込みが多いか書き込みが多いかとか)
多くの場合>>112の言うようにDB使えば無問題だけどね。
>>111
たしかにそうかも。
0115nobodyさん
2005/11/29(火) 16:14:09ID:???安全のため、別ファイルを新規作成しそれに書き込み、完了後前ファイルを消すなりRenameしてばくあっぷとるなりして、
新たに作成されたファイルをRename。
ここまで、最初にファイルを開く前からロックファイルを使うなりしておく。
0116nobodyさん
2005/11/29(火) 17:04:57ID:???0117nobodyさん
2005/11/29(火) 18:29:12ID:???0118nobodyさん
2005/11/29(火) 18:31:11ID:???0119nobodyさん
2005/11/29(火) 20:06:04ID:???0120nobodyさん
2005/11/29(火) 20:48:39ID:???0121nobodyさん
2005/11/30(水) 04:53:39ID:???ファイルの途中一行だけを書き換える場合も同じ方法になるんですよね?
ttp://ns1.php.gr.jp/pipermail/php-users/2004-February/020845.html
ここの
>修正対象行以外に用はないので、1行読み込んだらすぐに書き出し、
>修正対象行は修正後に書き出すようにすれば、バッファは 1行分で済みます。
って、どういうことなんでしょうか?
色々考えたんですが、さっぱり・・・
0122nobodyさん
2005/11/30(水) 05:40:48ID:???file()とかfile_get_contents()で全部一気に読まず、fgets()とかで一行ずつ読んですぐ書き出せってことでしょ。
その時に元のファイル(読み用)と書き出し先ファイルの名前をどちらか一時的に変えて、全てが終わったら一時ファイルを削除って形にしなきゃいかんわな。
まあfile()のほうが楽だし、よほど重大な問題(ファイルがデカすぎ→メモリ使いすぎ、とか)を引き起こさない限りは丸ごと読み込んだって大したことないと思うけどね。
さらに言えば、file()じゃまずいほどのデータを扱う規模ならDB使うべきだと思うし。
0123nobodyさん
2005/11/30(水) 07:10:29ID:???0124121
2005/11/30(水) 10:09:06ID:???何か気持ち悪いけど、file()で行きます。
0125nobodyさん
2005/11/30(水) 11:28:35ID:???0128nobodyさん
2005/11/30(水) 20:33:11ID:LTeKbaFs0129nobodyさん
2005/12/01(木) 09:52:22ID:r3P18a2Xするツールってあったら教えてもらえませんか?
あと、みなさん、開発時に便利だと思ってるツールがあれば
教えてください。<m(_)m>
テキストエディタだけで開発してますが、なんかいいのがあったら
使ってみたいのでー
0130nobodyさん
2005/12/01(木) 09:55:14ID:???0131nobodyさん
2005/12/01(木) 10:03:37ID:???マウス不要で手が疲れにくい。マジ最強!
0133nobodyさん
2005/12/01(木) 10:20:05ID:???おれはEclipse。
0134nobodyさん
2005/12/01(木) 10:23:56ID:???0135nobodyさん
2005/12/01(木) 10:26:05ID:???phpDocumentorじゃ力不足かな?
requireだと引数に変数渡せたり、include_pathがまちまちだったり、PHP5だと__autoloadとかあるからちと厳しそうだね。
引数が変数でないもの限定とかならCLIでささっと書けるんじゃないかな。
あとgrepでも(ツリー上にはできないけど)ある程度抽出できると思う。
0136nobodyさん
2005/12/01(木) 10:46:56ID:???んにゃ
ネットワークエンジニア→webPG→鯖管&ヘルプデスク→windowsappPG→webデザイン→何でも屋(泣
こうして何でも屋さんのできあがり
0137129
2005/12/01(木) 12:21:46ID:dlWTNPt6あ、ちょっとよさそうすね。
人のプログラムおっかけるのに、苦労してて、ツリー上に表示できるのが
あると便利だなーと思いまして。
Eclipseとかでできると楽なんですけどね。
0138nobodyさん
2005/12/01(木) 13:17:38ID:???0139nobodyさん
2005/12/01(木) 13:26:30ID:???0140nobodyさん
2005/12/01(木) 13:27:18ID:???明示的にphp5を使用する方法が無い場合は、共存してるって言わないと思うよ。
その共存環境を作った人に聞いてみ。
0141nobodyさん
2005/12/01(木) 13:43:00ID:???拡張子かスクリプトを置くディレクトリでキックするPHPを分ける。
CGI版の最初の1行目パスで切り替えてもいいけどね。
0142nobodyさん
2005/12/01(木) 13:44:20ID:???リクエストするポートで切り替える手もあるな。
運用テストに良く使う
0143nobodyさん
2005/12/01(木) 13:49:26ID:???拡張子だね。
私は昔、php3なら国際化PHP3、phpならphp4となるようにしてた。
たしか、Apacheのhttpd.confで設定したかもしれない。
0144138
2005/12/01(木) 13:54:14ID:???0145nobodyさん
2005/12/01(木) 15:07:47ID:iXMXSlHn$newfile = "./somefile.html";
$ddr = fopen("$newfile", 'w');
$adr = strtr($ddr, "夏 ", "冬");
fwrite($ddr, $adr);
これを実行するとsomefile.htmlの中には Resource id #3
という文字だけになって、元あった文字も無くなってしまいます。
特定の文字だけを置き換えて上書きするにはどうしたらよいでしょうか。
よろしくお願いします
0146nobodyさん
2005/12/01(木) 15:14:30ID:???> $adr = strtr($ddr, "夏 ", "冬");
この辺りの関数の使い方(つーより理解?)がおかしい。
スレの上の方でファイルの書き換えの話をやってるから、みてごらん。
0147nobodyさん
2005/12/01(木) 15:20:15ID:???マニュアル読んでーっ!!!!
$newfile = "./somefile.html";
$ddr = file_get_contents($newfile);
$adr = strtr($ddr, "夏 ", "冬");
file_put_contents($newfile, $adr);
■ このスレッドは過去ログ倉庫に格納されています