【PHP】質問スレッドpart20【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/08/06 15:44ID:paJ4kjjQ・新規質問の方は上げてください。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
抜けているものがあったら補足願います
0367nobodyさん
04/08/14 16:18ID:???現ディレクトリ以下の下位ディレクトリのファイルの取得は
どうすればいいんでしょうか。
0369364
04/08/14 17:11ID:???要するに、要素名を得たかっただけなのですが……SimpleXMLには、そういった関数が用意
されていないみたいです。じゃあ、どうやって要素名を得ればいいのか――が、今回の質問で
あります。
0370nobodyさん
04/08/14 18:38ID:???XML分かんないんでやっつけだけど、これで一応子ノード一覧取れるよ
<?php
function child_list($xml, $nest=0) {
foreach ($xml->children() as $key => $element) {
echo str_repeat(" ", $nest) . "$key\n";
child_list($element, $nest+1);
}
}
$xml = simplexml_load_string(
'<son>
<taro></taro>
<jiro></jiro>
<sab></sab>
<white></white>
</son>');
child_list($xml);
?>
0372nobodyさん
04/08/14 19:41ID:???{
array_push($array,"test");
}
$a = array();
test($a);
print count($a);
このようなスクリプトを書いたのですが、$aに値が代入されず、最後の行で0と出力されてしまいます。
どのようにすれば$aに値が代入されるようになりますか。
0373nobodyさん
04/08/14 20:19ID:???function test(&$array)
{
array_push($array,"test");
}
もしくは
function test(&$array)
{
return array_push($array,"test");
}
にして戻り値を使う
0375nobodyさん
04/08/14 21:21ID:???0376nobodyさん
04/08/14 22:17ID:???値渡し意識してるなら、普通にreturnで返すだろうし、
参照渡しを意識してるなら&ぐらい気づくだろうと思うのだが、
なぜ、 >>372 は それで値の変更ができると思ったのかなぁ。
0377Imo ◆.jC7ANgFY.
04/08/14 22:23ID:???# VBは省略すると参照渡しになる
0378nobodyさん
04/08/14 22:28ID:8vlh+W98$timestamp = 年/月/01 という時間を入れた変数を
$timestamp = 年/月-1/31 というようにしたいのですが、
(つまり1日前日にずらす)
どのようにすればいいのでしょうか?
ご教授おながいしますm(_ _)m
0379nobodyさん
04/08/14 22:31ID:???0381nobodyさん
04/08/14 22:36ID:8vlh+W98レスありがとうございます。
つまり、エポック秒に直して、ひいてまた
もとの形に戻すってことですね。
ついでで恐縮ですが、エポック病になおしかた、
戻し方も教えてもらえないでしょうか?
調べたのですが、エポックってぐぐってもあんまりでてこないようなので・・・
0382nobodyさん
04/08/14 22:39ID:???全部マニュアルに書いてあったよ
http://www.php.net/manual/ja/ref.datetime.php
0384nobodyさん
04/08/14 22:56ID:8vlh+W98にしてもあれですね、1日戻すだけでも結構だるいもんですね。
0385Imo ◆.jC7ANgFY.
04/08/14 23:01ID:???strtotimeもいろいろ使えるよ。一度見ておくといいかもしれない。
04/08/14とあったら解釈が違ったりするけどね。
(外国は年月日の順番が違うから
2004/08/14ならちゃんと解釈してくれる。
0386nobodyさん
04/08/14 23:03ID:???勉強になった
0388nobodyさん
04/08/14 23:10ID:???エポック秒で格納しておいて
date()で書式変えて表示すればいい
0389nobodyさん
04/08/14 23:10ID:???これでOKじゃね??
0390nobodyさん
04/08/14 23:20ID:???echo date("Y/m/d H:i:s",$timestamp);
$timestamp = mktime(0,0,0,08,date("d",$timestamp)-1,2004);
echo date("Y/m/d H:i:s",$timestamp).;
0391nobodyさん
04/08/15 00:02ID:???変数に何入れても空白なわけだが・・・
0392nobodyさん
04/08/15 00:12ID:ThpZR4Ya投稿データチェック(未選択不可)を行いたいのですが、
どうすればいいのですか?
下記のところに、新しく追加したら大丈夫だと思うのですが..
チェックの仕方がわかりません。
#── メールアドレスをチェック
length($::FORM{'email'})
&& ($::FORM{'email'} !~ /^[!-?A-~]+@[!-?A-~]+\.[!-?A-~]+$/)
&& push(@error, 'メールアドレスが不正です。');
#── パスワードをチェック
($::FORM{'key'} =~ /[<>&"]/)
&& &::error(\('パスワードに「<, >, &, "」は'
. '使えません。'));
0394392
04/08/15 00:16ID:ThpZR4Ya申し訳ないです....
0395nobodyさん
04/08/15 00:37ID:nLnvBjde本家 http://phplib.netuse.de/index.php3
ファイル名 phplib-7.2c.tar.gz
0396395
04/08/15 00:37ID:nLnvBjde0397394
04/08/15 00:42ID:nLnvBjdehttps://sourceforge.net/project/showfiles.php?group_id=31885&release_id=44737
0398391
04/08/15 00:52ID:???0400nobodyさん
04/08/15 01:07ID:???上のURLの上体で
〜〜〜〜〜〜〜
</TBODY>
</TABLE>
</TD>
<TD bgcolor="#5788b5" valign="top">
<?php
if ($mode != ""){
include "./page/$mode.php";
}else{
include "./page/main.php";
}
?>
</TD>
</TR>
</TBODY>
</TABLE>
</TD>
〜〜〜〜〜〜
にしてあるんだが
表示されるのはhttp://〜/page/main.php デツ
0402軟式PHP
04/08/15 01:15ID:???のあとに
$mode = $_REQUEST["mode"];
をいれてみ。
0403軟式PHP
04/08/15 01:17ID:???しかしお盆どうすっかなぁ( ´-`)
0404カポコン
04/08/15 01:30ID:???0406nobodyさん
04/08/15 01:50ID:???0408nobodyさん
04/08/15 01:54ID:???0409nobodyさん
04/08/15 04:03ID:???BBSのログ等を表示する際の処理は
for foreach while
どれが効率良いでしょうか。
ご教授願います。
0410nobodyさん
04/08/15 04:25ID:???その時の結論は忘れたけど
俺はあんまり気にせず、状況に合わせてソースがきれいに書けるやつを選ぶ
0411nobodyさん
04/08/15 04:38ID:???そうなんですか。
速さよりもどれが負荷が少ないかなと思いまして。
でもそんなには変わらないのですかねー。
有難うです!
0412nobodyさん
04/08/15 09:01ID:???なんか、namespaceとかprivateとかの新機能が使えないんですけど、なぜですか?
心当たりがあれば教えてください。
0414nobodyさん
04/08/15 09:51ID:???具体的にはinclude_pathに追加したい。
0415nobodyさん
04/08/15 10:02ID:???0416軟式PHP
04/08/15 11:53ID:???俺も410のように保守性を重視するよ。
0417nobodyさん
04/08/15 12:11ID:???<SELECT name="sex">
<OPTION value="女" selected>女</OPTION>
<OPTION value="男">男</OPTION>
</SELECT>
<INPUT type="submit" name="action" value="送信">
</FORM>
としてるんだが、変数が格納サレマセン。なぜでつか?
0418nobodyさん
04/08/15 12:16ID:???action="info.php"として info.phpの中身はphpinfo();のみ。
表示されたhtmlの中でセックルを探してみ
0419nobodyさん
04/08/15 12:23ID:???0421軟式PHP
04/08/15 12:44ID:???いやそのままと思うけど。既にヘッダーが出力されているから
header()は使えないってことだよ。header()周り見てみ。
何か出力してるところがあるはず。
0423419
04/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");
?>
0425412
04/08/15 13:18ID:???「private var $x;」と書いていたためでした。ばかです。
namespaceのほうはやっぱりエラーになります。
namespace Foo {
class Bar {
}
}
これだけなんだけどな。
0426nobodyさん
04/08/15 13:44ID:???RC2で消えたんじゃなかったん?
0429Imo ◆.jC7ANgFY.
04/08/15 15:10ID:???実際は「1.while 2.foreach 3.for」っぽい。
後半の二つはファイルを全部読み込むのはいいけど配列にするため
(explode&配列アクセス)の処理で時間を食っている様子。
forとforeachが違うのは、forが$i++や$i < count($data)とかを
毎回通しているためのロスみたい。
とはいってもテキトーにしか調べてない(というか差が誤差の範囲で
しかでない)から正確にはよくわからない。
whileはファイルを1回だけ読むのなら適当。
ただ、私は何度チェックしても無限ループが怖い。
forは添え字を自分で管理でき、
前とか後とかをすぐに参照できるという点で良い。
foreachは添え字が数値でなくても、
ちゃんとすべて処理できるという点で良い。
こんなところ。ただし、これは私の考えなだけ。
0430nobodyさん
04/08/15 15:43ID:???>>337のやり方で拡張子無しのファイルをPHPとして認識させるにはどうしたらいいですか?
または、別のやり方でできるのでしょうか?
0431nobodyさん
04/08/15 16:17ID:???$mode = $_REQUEST["mode"];
if ($mode != ""){
include "./page/$mode.php";
}else{
include "./page/main.php";
}
?>
もし、modeに「aiueo」が格納されているとして
「./page/aiueo.php」がない場合に他の処理を行いたいんだが・・・
どうすればよい?
0434nobodyさん
04/08/15 17:43ID:???<Files ~ "^[^\.]+$">
ForceType application/x-httpd-php
</Files>
0435nobodyさん
04/08/15 17:45ID:???$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:???よく見直した方がいい
0437nobodyさん
04/08/15 19:04ID:???is_fileの「filenameが存在して、かつそれが 通常ファイルであればTRUEを返します。」と
ありますが、この通常ファイルとはCGI以外という意味なのでしょうか?。
0438435
04/08/15 19:31ID:???0442nobodyさん
04/08/15 21:18ID:???parse error, unexpected '}' in
0444444
04/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);
0445444
04/08/15 21:38ID:???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>";
?>
0446444
04/08/15 21:39ID:???これをincludeでページに貼ったのですが、
ページを表示して実行するとカウントされずに
ttynt.cgiというプログラムができます;;
なぜでしょうか?
0447nobodyさん
04/08/15 22:03ID:???0448nobodyさん
04/08/15 22:04ID:???なんかこう、、、夏真っ盛りだな・・・
このスレはクエリをそのまま変数に勝手に入ると思ってるのもいるし(?mode=xx→echo $mode)
もうね、アホかと
0451Imo ◆.jC7ANgFY.
04/08/15 22:21ID:???どっかのPHPのセキュリティーに関する書籍で
$mode = str_replace('../', '', $_GET['mode']);
にすればいい、とかかいてるダメなやつがあったな。
〜.php?mode=....//....//
ってどうなるんですかと問いたい。問い詰めたい。小一時間(ry
# と、愚痴をもらしてみる。
# そもそもそういうクエリを送ってくるやつははじくべきなんだよ。
0452軟式PHP
04/08/15 22:21ID:???まぁ、マルチはいくないな。
0453nobodyさん
04/08/15 22:23ID:???ああ、>>400 以降ね。
どうでもいいが、これから PHP やるヤシは何故そんな実装になってるのかよく考えてみれ。
特に変数のスコープや register_globals 関係。
例文だから考慮してないだけかも知れないが、ちょっと安易杉。
>>400 だって、ある機能に対して認証を飛ばしてアクセスが可能になるかも知れないワケで。
例えばユーザーのパスワード変更を chpasswd.inc.php に切り出して認証されたページ内から呼び出していたら
?mode=../../chpasswd.inc&new_passwd=hogehoge
とか突っ込まれる可能性もある。
>>443 も言いたいのはそれだろ。
0454nobodyさん
04/08/15 22:31ID:???> # そもそもそういうクエリを送ってくるやつははじくべきなんだよ。
ちょっと興味深い。
手軽な方法ある?
クラック目的で突っ込まれたコードが効果的に検知出来るなら、勉強のためにトラップしてログっときたい。
セキュリティを意識して欲しいだけで。バッドノウハウはびこりすぎなんで。
しっかりしたアプリケーションが書ければどこから何突っ込まれようと大体は大丈夫だ。
取り敢えず変数を区別しないのはマズい。
一つの変数を二つの意味で使うとか、由来を考えずに使うとか、ユーザーからの入力値を深度の限界無しに受け付けてるとか。
0455444,445,446
04/08/15 22:31ID:???0456nobodyさん
04/08/15 22:36ID:???0459Imo ◆.jC7ANgFY.
04/08/15 23:03ID:???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:???0461nobodyさん
04/08/15 23:48ID:???参照先ディレクトリの制御に限った話でつか。
それは誤動作誘発に通じるルートを叩き潰すって発想で付加的な話。
基本はルートを掘られて利用されるような脆弱性をつくらない事なのでは。
という話も出しておきまつ。初心者が佃煮状態みたいなんで。
- safe_mode を使う
- ライブラリ単体で動作させない (require/include で結果を返すような書き方をしない)
- 外部ライブラリはそれ自体をセキュアな作りにする
とか。定石と普段からの意識とバッドノウハウの排除。
0462カポコン
04/08/16 00:33ID:???0463nobodyさん
04/08/16 02:30ID:vS77LDZvえと。
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:???まぬあるにヒントが!
http://jp2.php.net/manual/ja/function.mkdir.php
0466nobodyさん
04/08/16 02:47ID:???今ファイルをアップする部分をつくってて
POSTされたアップロード先のアドレスが毎回違うだろうし、ってことです。
すでに作られたディレクトリー内に、1階層だけディレクトリーを作るのなら
mkdirを1度すればいいんだけど。。。
ヒントページみてみます〜〜
また分からなかったらまたきますw
よろしく!
■ このスレッドは過去ログ倉庫に格納されています