トップページ⇒php
1001コメント314KB

【PHP】質問スレッドpart21【php】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/08/27 18:00ID:???
・PHP全般の質問スレです。
・新規質問の方は上げてください。age進行でお願いします。
・質問する際には環境も明記。
・正しい日本語で分かりやすく。
・レスがつかないからって逆切れする厨お断り。
・解決しなくてもこたえてもらったら礼を。


■本家
 http://www.php.net/

■日本 PHP ユーザ会
 http://www.php.gr.jp/

■PHP マニュアル
 http://www.php.net/manual/ja/

■PEAR マニュアル
 http://pear.php.net/manual/ja/

過去スレ, 関連スレ等>>2-4
0052nobodyさん04/08/28 13:04ID:???
真性厨房かと思ったら仕事かよ。
世も末だ。
0053nobodyさん04/08/28 13:06ID:???
えー?こんなレベルでも仕事ってできるんだあ
0054nobodyさん04/08/28 13:19ID:???
>>53
えー?できるよ。おれショッピングカート作れないほど低レベルだけど、月50近くあるよ。
00553904/08/28 13:24ID:imkrnG7F
>>51
できたーー!!こんな単純なことだったのか!
あなたたちはほんとにすごいね〜
みんなの知恵が重なったときに力って発揮されるもんだね
本当にありがとう!

>>53
どの部分かが長けてれば仕事にはなるよ
0056nobodyさん04/08/28 13:27ID:???
重なってない
分かってなかったのはあんただけだから
0057nobodyさん04/08/28 13:30ID:bA6FLPcw
この前ショッピングカート作った。
0058nobodyさん04/08/28 13:31ID:imkrnG7F
>>56
そっか|Д`)
まあ良いじゃんわからないときは助け合いで!
すごい良いスレだよね〜
0059nobodyさん04/08/28 13:34ID:???
>>54-55
お前らな、500円やるから他職逝けと
プログラマってのはな、もっと神聖としてるべきなんだよ
得意げな顔して何が、「どの部分かが長けてれば仕事にはなるよ」だ
お前、プログラマを絶対舐めとるちゃうんかと

まあお前らド素人は、せいぜい今のうちに余生を楽しみなさいってこった
0060>>5904/08/28 13:47ID:imkrnG7F
俺は専門のプログラマじゃないよ
営業、マーケティング、製作とマルチにやってる
そしてプログラマを舐めてるつもりもない

ここはわからない部分を質問して教えてもらうスレじゃないのか?
>>51さんが教えてくれて俺は救われた
2ちゃんという掲示板の存在意義はここにもあるのでは?
0061nobodyさん04/08/28 13:52ID:Mb7EMv7r
漏れはアマグラマでつが、この板に来てもよろしいでつか?
0062nobodyさん04/08/28 13:57ID:v9ahrS8w
CGIを探してくれるスレが見つからんので・・・

http://wa-ka.net/mash/sozai/yakumo/index.html

↑のような、シンプルな一言掲示板をインラインフレームを使わずに
htmlページに貼り付けたいのですが。
そんなCGI無いですか?
0063nobodyさん04/08/28 14:03ID:bA6FLPcw
> 2ちゃんという掲示板の存在意義はここにもあるのでは?

煽られるのも叩かれるのも2ch
0064nobodyさん04/08/28 14:06ID:???
>>60
答えられるような聞き方をしろってこった
0065nobodyさん04/08/28 14:09ID:???
>>62
>CGIを探してくれるスレが見つからんので・・・
検索かけたら直ぐ見つかったが?

【CGI】こんなCGI探してますver.14
http://pc5.2ch.net/test/read.cgi/hp/1087986364/
0066nobodyさん04/08/28 14:20ID:v9ahrS8w
>>65
アリガトウゴザイマシタ。サッソクケンサクスレイッテキマス。
0067nobodyさん04/08/28 15:25ID:B6xIg3wk
clearstatcache について質問です。

file_exists でファイルの存在確認をして、存在しなかったら exec によりそのファイル生成を行うコマンドを実行し、
再び file_exists でファイルの存在確認をしています。

if(!file_exists('test.txt')) {
 exec('make_test');
 if(file_exists('test.txt')) {
  echo 'ファイルがある';
 }
 else {
  echo 'ファイルが無い';
 }
}
else {
 echo 'ファイルがある';
}

上記のようにしたところ、exec が成功して目的のファイルの生成が完了しているにもかかわらず、
ファイルが無いと出てきます。
調べたところ file_exists は、その結果をキャッシュするため、続けて実行するときには clearstatcache が
必要なる記述を見つけました。

続く
00686704/08/28 15:27ID:B6xIg3wk
そこでスクリプトを以下のように書き換えて実行しました。

clearstatcache(); // ←追加
if(!file_exists('test.txt')) {
 exec('make_test');
 clearstatcache(); // ←追加
 if(file_exists('test.txt')) {
  echo 'ファイルがある';
 }
 else {
  echo 'ファイルが無い';
 }
}
else {
 echo 'ファイルがある';
}

でも結果は変わりません。
webで調べてみたところ、
http://ns1.php.gr.jp/php-jp/archives/msg05496.html
のような症状を発見し、これと同様のことが起きているものと思われます。
しかしこのMLは、結論が出ることなく話題が終わっています。

PHPのバージョンは 4.3.7 です。

解決策をご存知の方、ぜひ教えてください。

006967=6804/08/28 15:35ID:???
あ、このスクリプトを続けて実行すると、二度目は ファイルがある と返してきます。
0070nobodyさん04/08/28 15:52ID:???
exec('make_test');
この辺りの詳細が欲しい
00716704/08/28 16:05ID:???
>>70
DBにアクセスして、その内容を編集したファイルを出力するものです。
出力ファイル名は、上記スクリプト内でチェックしているものと一致しています。
さらに、各 file_exists の前に、デバッグ用に system('ls') を追加してみたところ、その出力には目的ファイル名の
存在が見て取れます。
にもかかわらず、file_exists は false を返すのです。

また >>69 にもあるように、2度目の実行では file_exists は true を返しているようです。
0072 ◆.jC7ANgFY. 04/08/28 16:29ID:???
手がないと思ったらこんな関数とか作ってみればいかが。

function file_exists2($filename) {
return (boolean)glob($filename);
}

安全を考えるなら検索するファイル名を制限しなければならない。
globは"*"とかに対応した関数だから。

function file_exists2($filename) {
return !preg_match('/[\*\{\}\?]/', $filename)
and (boolean)glob($filename);
}

00736704/08/28 16:30ID:???
あー、すみません。
ええと、実は上記スクリプトは、もっと大きなスクリプトの一部分なんですが、ここに公開した部分だけで
動かすとうまくいくみたいです・・・
ごめんなさい。

ただ、元のスクリプトでも、該当部分でやってることは上記スクリプトと全く同じなんですけどね。
>>71 で書いたexec('ls') を挿入した話は、元のスクリプトの方でやってます。
exec('ls') で存在確認できるファイルが、file_exsits では false になってしまうという問題は
依然として解決できません。

とにかく、これからもくもくと実験します。
スレ汚しすみませんでした。

ところで、コマンドラインから実行する場合と apache から実行される場合とで、挙動が違ったりするってことは
ありますか?


>>72
実はこの部分はわりと頻繁に実行されるところなので、できるだけシンプルな処理にしたいです。
でも、どうにもならなくなったらそのアイディア頂戴します。
ありがとうございます。
0074 ◆.jC7ANgFY. 04/08/28 16:39ID:???
apacheから実行されると、というよりかセーフモードで実行されると
パーミッションとしては許可されていても開けない場合があるから注意。
0075nobodyさん04/08/28 16:41ID:???
>>60
おまいの言ってる事は概ね正しい。

で、おまいは何のスペシャリストなのよ。
自分でコード書いてるようだが、納品とか言って人様に収める仕事をやってるようだが、
ちゃんと責任の持てる品質に仕上がったか?
言ってることと行動が重なってないぞ。
00767304/08/28 16:41ID:???
たびたびすみませんが、紛らわしい書き方を修正します。

>>73
>exec('ls') で存在確認できるファイルが、file_exsits では false になってしまうという問題は
>依然として解決できません。

これは、>>68 スクリプトの最初の if の前に挿入したものでは、exec('ls') の結果には目的ファイルは
含まれておらず、file_exists が false を返すという正しい動作をしています。

その if の中に入って、exec('make_test') が実行された後に挿入した exec('ls') では、その結果に
目的ファイルが含まれていることを確認できますが、その後の if の file_exsits では false を
返します(ファイルは存在するのに false が返る)。

最初は、1つめの if で実行した file_exists の結果がキャッシュされ、2つめの if では現実を即していない
そのキャッシュが結果として返っているらしいという考えから clearstatchahe() を追加したのですが、
それでも上記問題が解決しないのです。
00777304/08/28 16:44ID:???
>>74
apache からの実行時に、ファイルを開いたり作成したりを問題なく行えることは、スクリプトのほかの部分で
実績があるので問題ないと思います。
ありがとうございます。
0078nobodyさん04/08/28 17:28ID:???
規模が大きくなりそうなので
オブジェクト指向で書こうと思います。
まだ出たばっかりのPHP5を使うのがいいか、
PHP4で書くのがいいのか、どっちでしょう。
またPHP4で構築→PHP5用に後から書き直し、
なんてことにならないでしょうか?
0079nobodyさん04/08/28 18:11ID:bA6FLPcw
PHP4→PHP5は、書き直し必須です。
オブジェクト指向で書くならなおさら。
0080nobodyさん04/08/28 18:26ID:???
すいません、PHP関連ライブラリのインストールについてなんですが、
phpizeというコマンドを使うらしいのですが、
コマンドを打つと、

cp: `mkdep.awk' を stat(2) できません: そのようなファイルやディレクトリはありません
cp: `scan_makefile_in.awk' を stat(2) できません: そのようなファイルやディレクトリはありません
cp: `shtool' を stat(2) できません: そのようなファイルやディレクトリはありません
cp: `acinclude.m4' を stat(2) できません: そのようなファイルやディレクトリはありません
cp: `Makefile.global' を stat(2) できません: そのようなファイルやディレクトリはありません
/usr/local/bin/phpize: line 52: /usr/local/lib/php/build/phpize.m4: そのようなファイルやディレクトリはありません
aclocal: `configure.ac' or `configure.in' is required

なんてエラーが出ます。
これらのファイルはPHPインストール時に入るものじゃないんでしょうか?

phpizeについて全くわからないので、
質問も的をはずしているかもしれませんが、
教えていただけないでしょうか?
00818004/08/28 18:38ID:???
PHPは4.3.8でソースからインストールしています。
0082軟式PHP04/08/28 18:38ID:???
PHP Screwでもインスコしようとしてるんかな。
0083nobodyさん04/08/28 20:26ID:jL6OGaFR
正規表現で$enameに格納されてる者の語尾が「たん」「ちゃん」「くん」「さん」の場合と
それ以外の場合とを振り分けたいのですが、以下の通りソースを書いたところ
うまく作動しません。どのように直したらよいですか?

if (preg_match( "/.たん/|/.ちゃん/|/.くん/|/さん./", $ename ) ) {   
 print "OKです"; // 一致した場合
}else{
 print "呼び捨てはやめてください";
}
0084カポコン04/08/28 20:35ID:???
>>78:
 PHP5の予約語もおさえてから、取り掛かる事オススメ。
>>80:
 aclocal: `configure.ac' or `configure.in' is required
  install-shを探し、
  Makefile.inをautomakeで作れた?
0085nobodyさん04/08/28 20:45ID:???
>>83
ひどいな。。。
patternの書き方が致命的におかしい。
マニュアルのパターン構文を熟読されたし。
0086nobodyさん04/08/28 20:51ID:PMoKUUmE
>>83
"/(たん|ちゃん|くん|さん)$/"
0087カポコン04/08/28 20:59ID:???
>>78:
 PHP5の予約語もおさえてから、取り掛かる事オススメ。
>>80:
 aclocal: `configure.ac' or `configure.in' is required
  install-shを探し、
  Makefile.inをautomakeで作れた?
0088nobodyさん04/08/28 22:52ID:vl2m4F3+
ttp://php.s3.to/data/dl.php?dl=chskin
ここの掲示板に2chみたいにスレ一覧をつけるには、どこをどうしたらいいのでしょうか?
教えてください。お願いします。
0089nobodyさん04/08/28 23:10ID:???
>88
知るか
0090nobodyさん04/08/28 23:17ID:???
>>88
機能を付け加えるのって結構面倒な作業なのよ。
で、そういうのが好きな人たちが集まってそうなスレがあるから
そっちの方がいいんじゃないかな?
オイラは見てないし、今でも機能してるかどうか分からないけど
「丸投げ」でこの板を検索すれば見つかるんじゃないかな。
0091nobodyさん04/08/29 00:03ID:???
>>88
おまえの頭をとっかえる。
てか、自分でやろうとして行き詰ってから質問しにこいよ
0092nobodyさん04/08/29 00:05ID:AyQVtsJd
$ename = preg_replace( "/.(さん|君|殿)$|.()$/" , "様", $ename );

$enameの語尾に「さん」「君」「殿」がついている場合は「様」に置換。
それ以外は語尾に「様」つけて、必ず「○○様」という様に変換するように
したいのですが、↑のソースですとうまくいきません。
どのように変えたらよいですか?



>>86
ありがとうです。でも、質問の仕方を間違ってました。
のでもう再び質問です。丁寧に回答なさってくれたのにすいません。
0093nobodyさん04/08/29 00:16ID:???
>>92
$ename = preg_replace( "/(さん|君|殿|様)$/" , "", $ename )."様";
0094nobodyさん04/08/29 01:20ID:AyQVtsJd
>>93
なるほど、ありがとうございます。助かります。

$ename = preg_replace( "/(さん|君|殿|様)$/" , "", $ename )."様";
この場合ですと、$enameに格納されているものが「さん」「君」「殿」「様」
だった場合でも「様」に変換されてしまいますよね・・・
例えば$enameに格納されているものが「さん」だった場合、「さん様」
となるようにするにはどうしたらよいですか。

何度もすいませんがよろしくお願いします。。
0095nobodyさん04/08/29 01:25ID:???
>>94
プログラミングセンス無さ杉
$ename = preg_replace( "/(君|殿|様)$/" , "", $ename )."様";
0096nobodyさん04/08/29 01:30ID:???
>>94
ああ、"さん"って名前の人が居た場合か
それならこっちだな
if($ename != 'さん') {
$ename = preg_replace( "/(さん|君|殿|様)$/" , "", $ename );
}
$ename .='様'
0097nobodyさん04/08/29 01:42ID:???
正規表現についてはスレ違いだと思うが。
後方参照使えばええやん。
$ename = preg_replace("/(.*)(さん|君|殿|様)$/", "$1様", $ename);
00989704/08/29 01:46ID:???
シクジッタ。
00999704/08/29 01:46ID:???
更にしくじった_| ̄|○
$ename = preg_replace('/(.*)(さん|君|殿|様)$/', '$1様', $ename);
0100nobodyさん04/08/29 02:00ID:???
>>97
(.*)とか$1付けんでも普通に
$ename = preg_replace('/(さん|君|殿|様)$/', '様', $ename);
でええやん?
0101nobodyさん04/08/29 02:08ID:???
>>100
バカは黙ってろって
01029204/08/29 02:36ID:???
>>99
なんか怪しくねぇか、それ。

$enameが「さん」のみ「殿」のみとかだったら、後ろに「様」をつけて「さん様」「殿様」にして
「Aさん」「B殿」だったら「A様」「B様」にするんだろ。

$ename = preg_replace( "/(.+?)(さん|君|殿|様)?$/" , '$1様', $ename);
0103nobodyさん04/08/29 02:56ID:???
ヨン様
0104nobodyさん04/08/29 03:00ID:???
ヨン殿
01059704/08/29 03:04ID:???
>>102
_| ̄|○
010610204/08/29 03:13ID:???
しまった。102の92は93の間違いですた。
0107nobodyさん04/08/29 03:14ID:AyQVtsJd
みなさんありがとうございました。
>>102さんので出来ました。
本当にありがとうございました
0108nobodyさん04/08/29 04:22ID:???
ぬるぽ
0109nobodyさん04/08/29 04:25ID:???
>>108 ぷちゅ
0110nobodyさん04/08/29 05:41ID:???
数種ページがある場合
1ページにつき1つのPHPファイルで表示するのと、
全ページを1つのPHPファイルで処理するのではどちらが負荷が軽いですか?
掲示板で言うとTOP,書き込みページ,ログを別々のPHPファイルで処理するみたいな
0111nobodyさん04/08/29 06:24ID:???
>>110
負荷よりメンテナンス性で考えろ。
分かりやすい、変化に強いコードを書いてそれで重くなったのなら後からチューニングすればいい。
0112nobodyさん04/08/29 06:37ID:???
>>110
フレーム切ってブラウザから多重で呼ぶ作りではなく、
メイン1つとメインから複数のサブを関数的にコールする作り
の話なら負荷の差云々は気にするな。
0113nobodyさん04/08/29 07:00ID:???
>>111 >>112
ありがとうございます
これで安心して作れます
011411204/08/29 08:05ID:???
112は、
「TOP,書き込みページ,ログを別々のPHPファイルで処理する」
に対応する内容ではなかったな…

素のPHPだけの場合だと、分割の方がメモリ占有の部分で
若干負荷が高い。CPU負過の部分では同等。
しかし、そんなもんは微々たる瑣末なこと。
111の言うとおりメンテナンス性を優先

本当に負荷を気にするほどのレベルなら、
PHPでもプリコンパイルされたバイナリの利用、
全体/部分的にPHP以外の採用も検討。
011511204/08/29 08:06ID:???
>>114
分割の方がメモリ占有の部分で若干負荷が"低い"。の間違い
0116nobodyさん04/08/29 09:28ID:Kc1bBELS
日曜php歴2週目のおじさんです
phpで "->"って演算子ですか?
$tmp = $row->tmp;

自力で調べてみましたがよくわかりません。




0117nobodyさん04/08/29 09:40ID:???
クラスを勉強してみてください
0118nobodyさん04/08/29 10:54ID:???
->は構造体のポインタ変数からメンバを参照するときに使います。
0119nobodyさん04/08/29 10:54ID:W8RVkldu
ありがとうございます
調べる対象すら判らなかったので助かりました。
01208004/08/29 13:30ID:???
>>84
すいません。どうすればいいか分かりません。
install-sh が phpのソースのところにあったり、
インストールしたいPecl APCのところにあるのはわかりますが。
0121nobodyさん04/08/29 13:39ID:???
みんな詳しいな〜
毎週うちにきて、隣で教えてくれると助かるんだけどね。
もと風俗譲の27歳でした。
01228004/08/29 14:12ID:???
自己解決しました。
意を決してphpizeをviで開いてみる。
「あ、これshなんだ・・・と気付く」

なんか、インストールのときに変なことをやったらしく、
/..../php/build
になるべきところが
/..../php/php/build
になってました・・・。

viでそのままパスを書き換えたらうまくいきました。
こんな対応でいいのか、いまいち不安ですが、一応解決です。
0123nobodyさん04/08/29 14:21ID:???
>>121
きもい
0124nobodyさん04/08/29 14:24ID:???
>>123
まだ使えますよ。
0125nobodyさん04/08/29 14:25ID:???
>>122
変な位置に入ったなw
入れ直してスッキリすればいいのに。
0126nobodyさん04/08/29 14:28ID:???
>>121
ごめん、おれロリコン。
0127nobodyさん04/08/29 14:29ID:???
>>124
生涯現役だもんで(AA略

>>122
fileコマンドを使えばドキドキしながらviで開かなくて済むよ
0128nobodyさん04/08/29 14:36ID:???
すごい初歩的な質問ですいません。

$_POSTのデータは、中身に数値以外の情報が入ってることが
確定だった場合、何でもかんでもhtmlspecialcharsでエンコードすべきですか?
0129nobodyさん04/08/29 14:44ID:???
数値や文字とか考えずになんでもかんでも htmlspecialchars してよし。
0130nobodyさん04/08/29 14:46ID:???
>>129
よーし。パパもスクリプト書き換えちゃうぞ〜〜
0131nobodyさん04/08/29 15:12ID:???
>>129
ありがとうございます。今まで全部つけてたんだけど
ふと、無駄なことしてるような気がして聞いてみました。
0132nobodyさん04/08/29 15:14ID:cCH4wkwY
とか言ってるんです。
もうね、馬鹿かど(ry
0133nobodyさん04/08/29 15:34ID:???

 あ ふ ぉ か 

だからおまいらのアプリケーションは後からコードを観てもエスケープ処理が分散してて完全な対策が保証されなかったり、
最初に全入力値に対してエスケープ処理かけた結果が入力データの同一保持が壊れたりするんだよ。
出力対象に合わせて直前でエスケープ処理しる!

HTML に出力するんなら、直前 (出来ればテンプレート内部) でかけるんだよ。
Smarty なら escape 演算子使え。Flexy ならもっとスマートだ。
0134nobodyさん04/08/29 15:37ID:???
>>133
休日に熱弁おつかれ。
分かったので、休んでて。
013513304/08/29 15:46ID:???
いやもう勘弁してよ。
PHP アプリケーションの質下がり杉。その手の相談も去年より増えた。
最近 PHP でやるって言うと顧客が不安な顔するし。
0136nobodyさん04/08/29 15:53ID:???
>>135
君はあれだね。
出る杭は打つ。主義の人だね。
新しい人を拒む。
そんな事では将来暗いですよ。
0137nobodyさん04/08/29 15:55ID:???
>>135
顧客が不安な顔をするのは君を見て、不安に思ってるので、
全体は下がっていないから安心しろ。
0138nobodyさん04/08/29 16:05ID:???
>>135
しょぼ
013913304/08/29 16:14ID:???
もうこねーよ!・゜・(ノД`)・゚・。 ウワーン
0140軟式PHP04/08/29 16:17ID:???
>>137
WAROTA
0141nobodyさん04/08/29 17:13ID:???
>139
まぁ人によりけりだろ。
0142nobodyさん04/08/29 17:38ID:nmd5+dtj
まともなことを言っても叩かれるのもまた2ch
0143nobodyさん04/08/29 18:34ID:???
前スレでPHP Acceleratorが入らないと嘆いていた者です。

その後、Pecl APC と TurckMMCacheを入れて、
比較してみたので参考まで。
ベンチは手軽さ優先で ApacheBenchです。
(ab -n 500 -c 10)
ソースはそんなに大きくないですが、連想配列使いまくり。
Smarty使用です。

無し: 10.3 #/sec
Pecl APC: 26.3 #/sec
Turck MMCache: 28.2 #/sec

Zendより良いかは分かりませんが、
Turck の webページの比較はホントっぽい。
ttp://turck-mmcache.sourceforge.net/index_old.html
0144nobodyさん04/08/29 19:28ID:???
FORMからの書き込みでDBに挿入するとき、文字化けしないようにする対策方法ってありますか?
0145nobodyさん04/08/29 19:42ID:???
>>144
mb_convert_encoding
0146軟式PHP04/08/29 19:43ID:???
同じ文字コードで入れる。
0147nobodyさん04/08/29 20:20ID:???
それでも文字化けするときあるんです
原因がわからず、こまってます^^;
0148軟式PHP04/08/29 20:36ID:???
どんな文字化けか分からずこちらが困ってます。
0149nobodyさん04/08/29 20:49ID:???
V l f [タ

↑こんな文字化けです
0150nobodyさん04/08/29 20:53ID:???
釣りに見えてきた
0151nobodyさん04/08/29 20:58ID:???
METAタグで文字コード指定してる?
■ このスレッドは過去ログ倉庫に格納されています