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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/08/06 15:44ID:paJ4kjjQ
・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


抜けているものがあったら補足願います
0413nobodyさん04/08/15 09:41ID:???
>>409
1.while 2.for 3.foreach と予測してみる
0414nobodyさん04/08/15 09:51ID:???
設定ファイルで設定した内容をプログラムのほうで変更することはできますか。
具体的にはinclude_pathに追加したい。
0415nobodyさん04/08/15 10:02ID:???
ini_setかな?そのあたり
0416軟式PHP04/08/15 11:53ID:???
確かにforeachは一番遅そうだなw
俺も410のように保守性を重視するよ。
0417nobodyさん04/08/15 12:11ID:???
<FORM method="POST" action="other/anq/index.php">
<SELECT name="sex">
<OPTION value="女" selected>女</OPTION>
<OPTION value="男">男</OPTION>
</SELECT>
<INPUT type="submit" name="action" value="送信">
</FORM>
としてるんだが、変数が格納サレマセン。なぜでつか?
0418nobodyさん04/08/15 12:16ID:???
>>417
action="info.php"として info.phpの中身はphpinfo();のみ。
表示されたhtmlの中でセックルを探してみ
0419nobodyさん04/08/15 12:23ID:???
Warning: Cannot modify header information - headers already sent byって何ぽ?
042041704/08/15 12:23ID:???
>>418
Request使えば変数が入るんだが・・・なぜだ?
0421軟式PHP04/08/15 12:44ID:???
>>419
いやそのままと思うけど。既にヘッダーが出力されているから
header()は使えないってことだよ。header()周り見てみ。
何か出力してるところがあるはず。
0422nobodyさん04/08/15 12:53ID:???
>>415
さんくす。
042341904/08/15 12:55ID:???
ちなみにこれだけでつ;;
<?php
$action = $_REQUEST["action"];
$age1 = $_REQUEST["age1"];
$age2 = $_REQUEST["age2"];
$Region = $_REQUEST["Region"];
$sex = $_REQUEST["sex"];
$server = $_REQUEST["server"];
$cls = $_REQUEST["cls"];
$monster = $_REQUEST["monster"];
if ($action == "送信"){
$data = 'data.cgi';
$age = $age1.$age2;

$input = implode(",", array($age,$Region,$sex,$server,$cls,$monster));
$fp = fopen($data,"a");
flock($fp,LOCK_EX);
rewind($fp);
fputs($fp, "$input\n");
flock($fp,LOCK_UN);
fclose($fp);
$ok = 1;
}
header("Location:http://**********/index.php");
?>
0424nobodyさん04/08/15 12:59ID:???
>>423
ヘッダー出力できない警告の前にほかのエラーか警告が出てるんじゃないの?
042541204/08/15 13:18ID:???
privateがエラーになったのは、「private $x;」と書かなければならないところを
「private var $x;」と書いていたためでした。ばかです。

namespaceのほうはやっぱりエラーになります。
namespace Foo {
 class Bar {
 }
}
これだけなんだけどな。
0426nobodyさん04/08/15 13:44ID:???
てか、PHP5のRelease版ってnamespaceサポートしてんの?
RC2で消えたんじゃなかったん?
0427nobodyさん04/08/15 14:11ID:???
>>426
もれもそうおもう
0428Imo ◆.jC7ANgFY. 04/08/15 15:00ID:???
>>423
Unicodeで作っているとか?
0429Imo ◆.jC7ANgFY. 04/08/15 15:10ID:???
>>413
実際は「1.while 2.foreach 3.for」っぽい。
後半の二つはファイルを全部読み込むのはいいけど配列にするため
(explode&配列アクセス)の処理で時間を食っている様子。
forとforeachが違うのは、forが$i++や$i < count($data)とかを
毎回通しているためのロスみたい。
とはいってもテキトーにしか調べてない(というか差が誤差の範囲で
しかでない)から正確にはよくわからない。

whileはファイルを1回だけ読むのなら適当。
ただ、私は何度チェックしても無限ループが怖い。
forは添え字を自分で管理でき、
前とか後とかをすぐに参照できるという点で良い。
foreachは添え字が数値でなくても、
ちゃんとすべて処理できるという点で良い。

こんなところ。ただし、これは私の考えなだけ。
0430nobodyさん04/08/15 15:43ID:???
>>336の続き
>>337のやり方で拡張子無しのファイルをPHPとして認識させるにはどうしたらいいですか?
または、別のやり方でできるのでしょうか?
0431nobodyさん04/08/15 16:17ID:???
<?php
$mode = $_REQUEST["mode"];
if ($mode != ""){
include "./page/$mode.php";
}else{
include "./page/main.php";
}
?>

もし、modeに「aiueo」が格納されているとして
「./page/aiueo.php」がない場合に他の処理を行いたいんだが・・・
どうすればよい?
0432nobodyさん04/08/15 17:09ID:???
>>431
あきらめることをお勧めします。
0433nobodyさん04/08/15 17:20ID:???
>>431
file_existsじゃ不満なのか
0434nobodyさん04/08/15 17:43ID:???
>430
<Files ~ "^[^\.]+$">
ForceType application/x-httpd-php
</Files>
0435nobodyさん04/08/15 17:45ID:???
<?php
$mode = $_REQUEST["mode"];
if ($mode != ""){
if (! file_exists(./page/$mode.php){
include "./page/$mode.php";
}else{
include "./page/404.php";
}

}else{
include "./page/main.php";
}
?>

これでいいのかな・・・・
0436nobodyさん04/08/15 17:58ID:???
>435
よく見直した方がいい
0437nobodyさん04/08/15 19:04ID:???
is_fileよりfile_existsを使った方が良いのですか?
is_fileの「filenameが存在して、かつそれが 通常ファイルであればTRUEを返します。」と
ありますが、この通常ファイルとはCGI以外という意味なのでしょうか?。
043843504/08/15 19:31ID:???
全然ワカンネ
0439nobodyさん04/08/15 19:42ID:???
>>438
エラーはログになって画面表示にしてないのかなぁ
どちらにしろ1からマニュアルを読むなり、ぐぐるなりした方が良いよ^^;
0440Imo ◆.jC7ANgFY. 04/08/15 20:29ID:???
>>437
ファイルを読めるかを調べるのにはis_readableを使うことをすすめます。
0441nobodyさん04/08/15 20:58ID:???
>>440
userIDの事まで考えるとis_readableが良さそうですね^^
これからはこちらを使う事にします。
0442nobodyさん04/08/15 21:18ID:???
{}数あってるのに
parse error, unexpected '}' in
0443nobodyさん04/08/15 21:19ID:???
>>435.php?mode=../../../../../../etc/passwd

お約束。
044444404/08/15 21:37ID:???
<?
$data = 'count.cgi';
$file = file($data);

$date = date(Ymd);
$host = getenv("REMOTE_HOST");
$addr = getenv("REMOTE_ADDR");
if($host == "" || $host ==$addr){
$host = gethostbyaddr($addr);
}

list($date1,$scount,$host2) = split( ",", $file[0]);
list($date2,$tcount,$tdate) = split( ",", $file[1]);
list($date3,$ycount,$ydate) = split( ",", $file[2]);
if ($host != $host2){
$scount++;
if ($date != $tdate){
$ydate = tdate;
$tdate = date;
$ycount = $tcount;
}
$tcount++;
$host2 = $host;
//書き込み
$data[0] = implode(",", array($date1,$scount,$host2));
$data[1] = implode(",", array($date2,$tcount,$tdate));
$data[2] = implode(",", array($date3,$ycount,$ydate));
$fp = fopen($data, "w");
flock($fp,LOCK_EX);
044544404/08/15 21:38ID:???
for ($i=0;$i<=3;$i++){
rewind($fp);
fputs($fp, "$data[$i]\n");
}
flock($fp,LOCK_UN);
fclose($fp);
}else{}
print " <TABLE cellpadding=0 cellspacing=0>";
print " <TBODY>";
print " <TR>";
print " <TD align=right><FONT size=2>Total:</FONT></TD>";
print " <TD><FONT size=2>$scount</FONT></TD>";
print " </TR>";
print " <TR>";
print " <TD align=right><FONT size=2>To:</FONT></TD>";
print " <TD><FONT size=2>$tcount</FONT></TD>";
print " </TR>";
print " <TR>";
print " <TD align=right><FONT size=2>Yes:</FONT></TD>";
print " <TD><FONT size=2>$ycount</FONT></TD>";
print " </TR>";
print " </TBODY>";
print " </TABLE>";
?>
044644404/08/15 21:39ID:???
上記のプログラムcounter.php
これをincludeでページに貼ったのですが、
ページを表示して実行するとカウントされずに
ttynt.cgiというプログラムができます;;
なぜでしょうか?
0447nobodyさん04/08/15 22:03ID:???
include する前にこれは動くのか?
0448nobodyさん04/08/15 22:04ID:???
php,perl両質問スレ
なんかこう、、、夏真っ盛りだな・・・
このスレはクエリをそのまま変数に勝手に入ると思ってるのもいるし(?mode=xx→echo $mode)
もうね、アホかと
0449nobodyさん04/08/15 22:06ID:???
>>448
> $mode = $_REQUEST["mode"];
0450nobodyさん04/08/15 22:14ID:???
>>449
いやそれは分かってるけど
${クエリでの名前}に勝手に入ると思ってる奴が居るってこと
0451Imo ◆.jC7ANgFY. 04/08/15 22:21ID:???
>>443
どっかのPHPのセキュリティーに関する書籍で
$mode = str_replace('../', '', $_GET['mode']);
にすればいい、とかかいてるダメなやつがあったな。
〜.php?mode=....//....//
ってどうなるんですかと問いたい。問い詰めたい。小一時間(ry
# と、愚痴をもらしてみる。
# そもそもそういうクエリを送ってくるやつははじくべきなんだよ。
0452軟式PHP04/08/15 22:21ID:???
global_registerをONにすれば入るよ( ´▽`)ノ
まぁ、マルチはいくないな。
0453nobodyさん04/08/15 22:23ID:???
>>450
ああ、>>400 以降ね。

どうでもいいが、これから PHP やるヤシは何故そんな実装になってるのかよく考えてみれ。
特に変数のスコープや register_globals 関係。
例文だから考慮してないだけかも知れないが、ちょっと安易杉。

>>400 だって、ある機能に対して認証を飛ばしてアクセスが可能になるかも知れないワケで。
例えばユーザーのパスワード変更を chpasswd.inc.php に切り出して認証されたページ内から呼び出していたら
?mode=../../chpasswd.inc&new_passwd=hogehoge
とか突っ込まれる可能性もある。

>>443 も言いたいのはそれだろ。
0454nobodyさん04/08/15 22:31ID:???
>>451
> # そもそもそういうクエリを送ってくるやつははじくべきなんだよ。
ちょっと興味深い。
手軽な方法ある?
クラック目的で突っ込まれたコードが効果的に検知出来るなら、勉強のためにトラップしてログっときたい。


セキュリティを意識して欲しいだけで。バッドノウハウはびこりすぎなんで。
しっかりしたアプリケーションが書ければどこから何突っ込まれようと大体は大丈夫だ。
取り敢えず変数を区別しないのはマズい。
一つの変数を二つの意味で使うとか、由来を考えずに使うとか、ユーザーからの入力値を深度の限界無しに受け付けてるとか。
0455444,445,44604/08/15 22:31ID:???
なんで勝手にファイルが作られるかねぇ・・・
0456nobodyさん04/08/15 22:36ID:???
PHPでperlのサブルーチンと同じような機能ってやっぱりfunctionでしょうか?
0457nobodyさん04/08/15 22:44ID:???
>>456
でつ。
045845604/08/15 22:52ID:???
>>457
レスありがとうございます。
0459Imo ◆.jC7ANgFY. 04/08/15 23:03ID:???
>>454
preg_match('/[^\w]/', $_GET['mode']) and die('不正クエリ');
これくらいの勢いでもいいんじゃないかってこと。

どうしても"/"や"."がいるのだったら
strpos('../', $_GET['mode']) === false or die('不正クエリ');
$_GET['mode']{0} == '/' and die('不正クエリ');
とかいろいろ試してみるとよろし。その場その場にあった処理が必要だと。
# 上の例は上位ディレクトリを参照させないようにする処理
# 下の例は直接変数と使う場合以外はいらないが、絶対パスを防ぐ処理

それと、いろいろとやっかいなのが"\x00"の処理。
phpでは大丈夫(なはず)だけど気になるので、
$_GET = array_map(create_function('$a',
'return str_replace("\x00", "", $a);'), $_GET);
こんな感じであらかじめ省いておくと安全かもしれない。
# $_POSTや$_COOKIEの時も同様にしておくといい
# 場合によれば改行系列も省いた方がよい場合がある
0460nobodyさん04/08/15 23:08ID:???
preg_match('/[^\w]/', $_GET['mode']) and die('不正クエリ');
0461nobodyさん04/08/15 23:48ID:???
>>459
参照先ディレクトリの制御に限った話でつか。

それは誤動作誘発に通じるルートを叩き潰すって発想で付加的な話。
基本はルートを掘られて利用されるような脆弱性をつくらない事なのでは。
という話も出しておきまつ。初心者が佃煮状態みたいなんで。

- safe_mode を使う
- ライブラリ単体で動作させない (require/include で結果を返すような書き方をしない)
- 外部ライブラリはそれ自体をセキュアな作りにする

とか。定石と普段からの意識とバッドノウハウの排除。
0462カポコン04/08/16 00:33ID:???
色々、試すのはいいけど、試されないように・・・。
0463nobodyさん04/08/16 02:30ID:vS77LDZv
お盆もおわっちゃいましたけど、いかがお過ごしですかw

えと。
127.0.0.1/hoge/ で「hoge」ディレクトリーを作るのなら
mkdir(hoge,0777);で作れるけど、
例えば、127.0.0.1/hoge/hogehoge/hohoge/
でこの「hohoge」を作るにはまず上層の「hoge」と「hogehoge」を作らないといけないわけですが、
この作業を行うにはどんな書き方になるんですか?
毎回階層が決まっていれば問題はないけど、
決まってない場合がわからなくて。
よろしくお願いすます。
0464nobodyさん04/08/16 02:38ID:???
>毎回階層が決まっていれば問題はないけど、
>決まってない場合がわからなくて。

↑がよく解らないんだけど、
必要なディレクトリ名を配列に入れて、その数だけループさせたら?
0465nobodyさん04/08/16 02:40ID:???
>>463
まぬあるにヒントが!
http://jp2.php.net/manual/ja/function.mkdir.php
0466nobodyさん04/08/16 02:47ID:???
>>464さん>>465さんありがとー

今ファイルをアップする部分をつくってて
POSTされたアップロード先のアドレスが毎回違うだろうし、ってことです。
すでに作られたディレクトリー内に、1階層だけディレクトリーを作るのなら
mkdirを1度すればいいんだけど。。。
ヒントページみてみます〜〜

また分からなかったらまたきますw
よろしく!
046746604/08/16 04:38ID:???
自己レス

できました。
丸写しだけど・・・

$dir=split("/", $up_dir);
for ($i=0;$i<count($dir);$i++){
$path.=$dir[$i]."/";
if (!is_dir($path))
@mkdir($path,0777);
@chmod($path,0777);
}
if (is_dir($up_dir))
return 1;

間にいくつかif入れて目的の事は完成です。
お世話になりました!
0468nobodyさん04/08/16 05:54ID:gbbwkQJr
ローカルのファイルのパーミッションを変更するにはどうすればいいでしょうか
0469nobodyさん04/08/16 06:33ID:???
chmod

いや、まてよ・・・まさかと思うが、サーバに置いたPHPスクリプトから、
クライアント側の何かのファイルのパーミションを変更したいってわけじゃないよな?
047046804/08/16 06:49ID:???
>>469
いえ、全てローカルにあります

できました ありがとう
0471nobodyさん04/08/16 08:13ID:???
>>466
つーかmkpathは?
047246604/08/16 08:18ID:???
>>471
どもー
mkpathってphpで使えるんですかね?
perlのだって聞いたことあったんだけど。ちと試してみます〜
0473nobodyさん04/08/16 08:30ID:???
>>472
popen使ってやってみ
0474nobodyさん04/08/16 09:38ID:2LXrMV/7
助けて下さい。質問です。
phpでラップ関数って作れるんでしょうか?
0475軟式PHP04/08/16 09:42ID:???
うん
0476nobodyさん04/08/16 10:25ID:???
abcdef @ hijklmp @ aiueos.
という文字列があって1つ目の@を(1)、2つ目の@を(2)という風に
置換したいのですが、良い方法があれば教えてもらえると助かります。
0477nobodyさん04/08/16 10:37ID:go59Ftbg
>>476
正規表現使えば?
0478nobodyさん04/08/16 10:57ID:???
レスありがとうございます。正規表現でやれるんですねー。
何番目の@か取得する方法が分からないため、正規表現スレで聞いてこようと思います。
$1,$2の数値の部分を取る方法があるのだろうか…。
0479Imo ◆.jC7ANgFY. 04/08/16 11:03ID:???
>>478
とりあえず、こんなこともできたりする。

$data = 'abcdef @ hijklmp @ aiueos.';
echo preg_replace_callback('/@/', create_function
('', 'static $a;$a++;return "($a)";'), $data);
0480nobodyさん04/08/16 11:09ID:???
>>479
まさにそれがやりたかったんです!ありがとうございます。
匿名関数を作って静的変数を使ってるあたりがテクニカルでいいっすね(>_<)
本当参考になりました。謝謝。
0481nobodyさん04/08/16 12:11ID:???
>>480
こんな感じでもいけそう。

$i = 0;
echo preg_replace('/@/e', '"(" . ++$i . ")"', $data);
0482nobodyさん04/08/16 12:55ID:???
>475
その「うん」は >474  に対しての「うん」であるならば、
できれば具体的な内容を教えて頂きたいのですが・・・・
0483軟式PHP04/08/16 13:12ID:???
つーか、何のラッパー作りたいんでしょか。
あなたの考えてる「ラップ」とは違うかもしれませんが↓教えておきます。
http://nx.eth.jp/php/manual/function.stream-wrapper-register.html
0484nobodyさん04/08/16 14:56ID:???
>>460
/[^\w]/ って /\W/ じゃダメなの?

create_functionって何回(というより何千回)も使うと遅くならね?
0485Imo ◆.jC7ANgFY. 04/08/16 15:22ID:???
>>484
それでもいい、というよりかそっちのほうがいい。

create_functionは関数をつくっちゃってるからねぇ、
何回も使うのならば>481のようなものを使ったほうがいい。
そうしないと、なにをするにも遅いプログラムになってくる。
048646604/08/16 15:28ID:???
>>473
お〜またまたレスありがと!
popenもやってみます!

mkpathの方は書き方が悪いのかうまく動かなかったです。

うむ。難しいですねー
0487nobodyさん04/08/16 17:33ID:???
配列に対して htmlspecialchars を適用したいのでつが、適当な関数はありませんか。
array_filter を試してみましたが htmlspecialchars は使えない模様でつ。
0488nobodyさん04/08/16 17:42ID:???
>>487
array_map
0489nobodyさん04/08/16 17:51ID:???
webspaceのレンタル(実際にはしないと思いますが^^;)をする上
でWebからの登録で自動的にディレクトリを割り当てたいと考えて
おります。
ディレクトリを作成すると所有者がapacheになりますが、その
ファイルの所有者を変更したいのです。chownはスーパーユーザで
ないと実行出来ませんとありますが、http://hoge.co.jp/でアクセスさせて
スーパーユーザーで動作させる事は可能なのでしょうか?。
apacheはapache権限です。
0490nobodyさん04/08/16 17:53ID:???
>>488
出来ました、ありがとうございまつ。
0491nobodyさん04/08/16 19:39ID:???
でつまつ厨も出たか・・・夏だな
0492nobodyさん04/08/16 20:07ID:???
スネちゃま!そんなこと言っちゃだめざまつ
0493nobodyさん04/08/16 20:29ID:???
本家サイトからインストーラーがダウンロードできないー
どうしたらいいんだー
マニュアルインストールなんて難しいことはわかりません。
ヘルプミーぷりーず orz
0494nobodyさん04/08/16 21:00ID:???
たまにいるんだよな
でつまつ使っただけで「厨だ」とかぬかすアホが。
0495nobodyさん04/08/16 21:17ID:???
488だか私は別に「まつ$」でも気にしない
そもそも、2ちゃんで礼儀などは期待していない
礼儀知らずが厨かどうかは知らないが、それに食いついてる
494が厨だとしか思えん

>>493
Windows?
049649304/08/16 21:21ID:???
>495
そうです。
0497nobodyさん04/08/16 21:22ID:???
>だけで
条件を満たしていると思われ(厨)
0498nobodyさん04/08/16 21:30ID:???
>>496
ぐぐれば置いてある所もあるけど本家が復旧するのを待ってた方が
良いと思うよ
0499nobodyさん04/08/16 22:17ID:???
DLできるじゃん
0500nobodyさん04/08/16 22:21ID:???
http://www.php.net/downloads.php
installerはむりぽ
0501nobodyさん04/08/16 22:29ID:???
サイトでエラーが出てるからDL出来ないんだよ
ミラーもダメだね
0502nobodyさん04/08/16 22:34ID:???
http://public.www.planetmirror.com/pub/php/distributions/
0503nobodyさん04/08/16 23:01ID:???
>>493
んじゃ、RingServerのミラーからでも。
http://www.dnsbalance.ring.gr.jp/archives/net/www/php/distributions/
php-4.x.x-installer.exe
050449304/08/16 23:08ID:???
>>502>>503
復旧するまであきらめるしかないのかと思ってたら・・・
ありがとうございます。m(_ _)m
0505nobodyさん04/08/16 23:15ID:???
>>493
インストーラパッケージは、ZIPパッケージに同梱されてる
各種DLL(mysql関数だとか、確かmbstring絡みも)が入ってない(足りない)から
殆どの場合、あとでZIPパッケージから足す必要があるよ。気をつけて

それとSJISでPHPのスクリプトを書くなら、
http://www.geocities.jp/rui_hirokawa/php/
じゃないと駄目。
0506nobodyさん04/08/16 23:19ID:???
https://www.stackasterisk.jp/tech/php/phpMvc01_02.jsp
って使えますか?
0507nobodyさん04/08/17 00:28ID:???
>>506
何に?
0508軟式PHP04/08/17 00:35ID:???
 _, ._ ∩
( ゚д゚)彡 サァ!!
 ⊂彡
0509nobodyさん04/08/17 00:46ID:???
おっぱいには使えないね
0510nobodyさん04/08/17 03:43ID:???

PHPとjavascript間で値のやり取りをしたいのですがどうすればよいですか?
0511nobodyさん04/08/17 05:54ID:???
>>510
PHPが外部から受け取る変数は $_GET $_POST $_COOKIE である以上、
javascriptからそれらを操作するものを使う他あるまい?
0512軟式PHP04/08/17 14:07ID:???
 _, ._ ∩
( ゚д゚)彡 サァ!!
 ⊂彡
何か面白いもんつくりてーな。
0513nobodyさん04/08/17 17:09ID:???
どもです (_ _)
ある PHP スクリプトが include/require 等で呼んでいるファイルを全部引っ張る方法って無いでしょうか。

fileA
include('fileB');

fileB
include('fileC'); include('fileD');

とあった場合、fileA が fileB, fileC, fileD を読み込んでいる事を fileA 側から確認出来ないか、といった具合です。
■ このスレッドは過去ログ倉庫に格納されています