【PHP】下らねぇ質問はここに書き込みやがれ 45
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/04/27(金) 10:02:42ID:H9gF1SfBPHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り
◆前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 44
http://pc11.2ch.net/test/read.cgi/php/1176364487/
◆質問する時の注意
・ 自分のIDを表示させること。(メール欄に何も記述しないこと。空白も入力しちゃダメ)
・ サーバーのOS(Linux、Windows他)、WebサーバーとPHPの種類やバージョン等を明記すること。
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・偽者防止に必ずIDを表示させること。(メール欄に何も記述しない)
・2回目以降は最初に質問した際のレス番号を名前欄に入れること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
0692nobodyさん
2007/05/08(火) 22:31:43ID:aq8SRoA20693nobodyさん
2007/05/08(火) 22:33:51ID:???0694nobodyさん
2007/05/08(火) 22:36:30ID:???http://bugs.php.net/
0695nobodyさん
2007/05/08(火) 22:36:39ID:j3fFuUxd値をうにょうにょ変えていく存在という感じがする。
initVarとかsetVarとか汎用で作ってさ。
不動なものはもっとdefineみたいにどっしり構えてほしかったのさ。
0696nobodyさん
2007/05/08(火) 22:42:52ID:???勝手なイメージで開発て
0697nobodyさん
2007/05/08(火) 22:49:32ID:???なんていうか無理してクラス使う必要ないんじゃね?
0698nobodyさん
2007/05/08(火) 22:50:05ID:j3fFuUxd固定された値のくせにオブジェクトの数だけメモリにのっちまうだろ?
やっぱり設計としてどーかと思う。
0699nobodyさん
2007/05/08(火) 22:55:13ID:???お勧めしない
ID:j3fFuUxdの気持ちはわかる
匿名関数がカスでアクティベーションできないから、処理を小分けにしにくい
0700nobodyさん
2007/05/08(火) 23:15:53ID:j3fFuUxd以下のうちどの設計が最善でしょうか?
1.arrayぐらい毎回書く
2.毎回メモリにのるけど大した量じゃないしメンバで。
3.$GLOBALSにいれる。めんどくささは1と大差ない気がする。
ちなみにオブジェクト30個ぐらい扱って計算させてます
0701nobodyさん
2007/05/08(火) 23:25:11ID:???0702nobodyさん
2007/05/08(火) 23:27:08ID:j3fFuUxd3次元座標系の粒子の処理を得意だったPHPで書こうかなーと。
0703nobodyさん
2007/05/08(火) 23:29:35ID:???どういうオブジェクト設計になってるのかも教えてくれたほうが適切なアドバイスができる気がする
0704nobodyさん
2007/05/08(火) 23:36:46ID:j3fFuUxdデザインパターンとかはわからないんで、長々とありのままを書くと、
とりあえず最上位には二つのクラス。
objectクラスとobjecthandlerクラス。handlerは複数のオブジェクトの処理や、
データファイルから読みだすときに使うクラス。
objectクラスの下にcoordinateクラスがあり、座標の処理をしている。
スカラー倍とか。
複数データの座標処理にはcoordinatehandlerていうクラスもある。
二点の距離や三点の角度などはここ。
で、それらの下にatomクラスとatomhandlerクラスがあって、
粒子の各プロパティもメンバ変数に入る、という設計。
見当違いだったらごめん。
0705nobodyさん
2007/05/09(水) 00:42:20ID:???0706nobodyさん
2007/05/09(水) 01:41:53ID:???>1から100までの数をプリントするプログラムを書け。
>ただし3の倍数のときは数の代わりに「Fizz」と、
>5の倍数のときは「Buzz」とプリントし、
>3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
どうしてプログラマに・・・プログラムが書けないのか?
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
0707nobodyさん
2007/05/09(水) 01:53:48ID:???foreach(range(1,100) as $i) {
$p = '';
if(! ($i % 3)) $p .= "Fizz";
if(! ($i % 5)) $p .= "Buzz";
print (($p)? $p: $i) . "\n";
}
0708nobodyさん
2007/05/09(水) 01:58:17ID:???if ($a = $i % 3 == 0) echo 'Fizz';
if ($b = $i % 5 == 0) echo 'Buzz';
if (!$a && !$b) echo $i;
echo '<br/>';
}
最後のやつが厄介だね
0709nobodyさん
2007/05/09(水) 02:01:52ID:???$str = $i;
if($i % 3 == 0) $str = "Fizz";
if($i % 5 == 0) $str = "Buzz";
if($i % 3 == 0 && $i % 5 == 0) $str = "FizzBuzz";
echo "$str<br>\n";
}
0710nobodyさん
2007/05/09(水) 02:21:31ID:???もっとシンプルにできると思うのだが
0711nobodyさん
2007/05/09(水) 02:26:42ID:???0712nobodyさん
2007/05/09(水) 02:28:08ID:???明日答えをかいてやる
0713nobodyさん
2007/05/09(水) 02:28:27ID:???0714nobodyさん
2007/05/09(水) 02:28:56ID:???0716nobodyさん
2007/05/09(水) 02:29:37ID:???0717nobodyさん
2007/05/09(水) 02:30:47ID:???0718nobodyさん
2007/05/09(水) 02:31:53ID:???0719nobodyさん
2007/05/09(水) 02:33:33ID:???要領悪いな
0720nobodyさん
2007/05/09(水) 02:38:40ID:???foreachでもいいけど
0721nobodyさん
2007/05/09(水) 02:44:36ID:???for ($i = 1; $i <= 100; $i++) {
 if ($i % 3 == 0 && $i % 5 == 0) {
   echo 'FizzBuzz';
 } elseif ($i % 3 == 0) {
   echo 'Fizz';
 } elseif ($i % 5 == 0) {
   echo 'Buzz';
 } else {
   echo $i;
 }
}
0722nobodyさん
2007/05/09(水) 02:48:31ID:???可読性やスピードに注意を向ければよろし
0723nobodyさん
2007/05/09(水) 02:50:23ID:???そもそも「プログラムが全く書けない応募者」をフィルタするための問題だから
そこに高度さは必要ないだろ…
何で無駄ハック大会みたいになってんだよ
0724nobodyさん
2007/05/09(水) 02:51:40ID:???3と5の倍数判定でそれぞれフラグをセットして、両方がtrueならFizzBuzz
0725nobodyさん
2007/05/09(水) 02:51:42ID:???というかそもそも本当の話なのか…?
日本でもそんなもんなん?
0728nobodyさん
2007/05/09(水) 03:02:31ID:???日本では英文科出ても英語はなせない、技術系の専攻でもプログラム書けないなんてよく聞くけど。
卒業の厳しいアメリカではそんなことないのかと思っていたが違うんだな。
0729nobodyさん
2007/05/09(水) 03:05:12ID:???0731nobodyさん
2007/05/09(水) 03:18:09ID:???もし書ける人いたら今後の参考に使いたいからよろしゅう。
0732nobodyさん
2007/05/09(水) 03:20:33ID:???オナニープログラマーはいらん
0733nobodyさん
2007/05/09(水) 03:22:33ID:???0734nobodyさん
2007/05/09(水) 03:23:28ID:???ほい
$nums = range(1,1000);
if ($a = $nums[0] % 3 == 0) echo 'Fizz';
if ($b = $nums[0] % 5 == 0) echo 'Buzz';
if (!$a && !$b) echo $nums[0];
echo '<br/>';
if ($a = $nums[1] % 3 == 0) echo 'Fizz';
if ($b = $nums[1] % 5 == 0) echo 'Buzz';
if (!$a && !$b) echo $nums[1];
echo '<br/>';
if ($a = $nums[2] % 3 == 0) echo 'Fizz';
if ($b = $nums[2] % 5 == 0) echo 'Buzz';
if (!$a && !$b) echo $nums[2];
echo '<br/>';
:
:
以下$num[999]までやればおk
0735nobodyさん
2007/05/09(水) 03:25:52ID:???0736nobodyさん
2007/05/09(水) 03:28:09ID:???素直になれよ
そして四つんばいになれよ
0737nobodyさん
2007/05/09(水) 03:31:23ID:???カウンタを何種類か持たせて0判定の方が速そう
0738nobodyさん
2007/05/09(水) 03:34:25ID:???速いかとか効率いいかは分からんけど違う手法でやってみるのも面白そうね
0739nobodyさん
2007/05/09(水) 03:50:10ID:???$expr = '';
for ($i = 1; $i <= 100; $i++) {
$expr .= <<< TEXT
if (¥$a = $i % 3 == 0) echo 'Fizz';
if (¥$b = $i % 5 == 0) echo 'Buzz';
if (!¥$a && !¥$b) echo $i;
echo '<br/>';
TEXT;
}
eval($expr);
0740nobodyさん
2007/05/09(水) 03:51:09ID:???0741nobodyさん
2007/05/09(水) 05:43:07ID:???for ($i = 1; $i <= 100; $i++, $s = ($i % 3 == 0) ? "Fizz" : "", $s .= ($i % 5 == 0) ? "Buzz" : "", $s = ($s != "") ? $s : $i) echo $s."<br>\n";
0742nobodyさん
2007/05/09(水) 05:45:53ID:???ああ、なるほど。こういう人が>>706のリンク先で書かれてる
> 自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。
という現場で使い物にならないバカちんなんだ。
まさかそんな人が…と思ったが実によく理解できた。
0746nobodyさん
2007/05/09(水) 06:25:39ID:???0747nobodyさん
2007/05/09(水) 06:43:56ID:6zAvWwo5いい方法ないですか?
0749nobodyさん
2007/05/09(水) 06:58:24ID:???カウントするだけのために配列作ること自体がセンスない
0750nobodyさん
2007/05/09(水) 07:34:19ID:???0751nobodyさん
2007/05/09(水) 08:54:57ID:MkwX/1Mg現在はまた関数をチェックしてテストしてる段階なのですが、例えば、
1 簡単なスクリプトでヘッダ一覧を取得してみる→既読フラグは0
2 別のスクリプトで本文を取得してみる→オプションを指定しない場合既読フラグがつくはず
3 もう一度ヘッダ取得→既読フラグは0のまま
4 意図的にフラグをつけてみる→imap_setflag_full前後で既読フラグは0→1に変わったのを確認
5 もう一度ヘッダ取得→既読フラグは0のまま(0に戻ってる?)
ブラウザからの操作なので履歴が表示されているのかとも疑ったのですが、そうではないようです。
メールボックスがある鯖の設定も関係してるのか・・・一応複数のメールボックスで試したのですが。
上記のような手順でつけたフラグって固定しないもんなんでしょうか。。
0753nobodyさん
2007/05/09(水) 09:06:58ID:izHSsw10htmlspecialchars($str, ENT_QUOTES)かけると
< → &lt; → &amp;lt;
って当然なっちゃうんだけどサニタイズ済みの時は弄らないにはどうすればいいの?
0754751
2007/05/09(水) 09:40:37ID:MkwX/1Mg明示的な更新はしていません。
オプションで「更新しない」を指定できるのを確認してるので
特に指定しなければ更新されるはずだと思っているのですが・・
>>753
自前で処理するしかないんじゃないですかね。
&で分割して、各要素にhtmlspecialchars()をかけ、&をつけて文字列に戻す、みたいな。
0755nobodyさん
2007/05/09(水) 09:45:30ID:???PHPの処理をPOP3のコマンドの対応を考えてみる。
なにか不足してないか?
まあ、ソースを晒さずにどこまで進むか試してみようw
0756nobodyさん
2007/05/09(水) 10:15:42ID:???エスケープされたログとされていないログが混在しているのなら、
ログにエスケープするという、仕様を変えたほうが
良いと思う
0757虚弱PHP
2007/05/09(水) 10:51:14ID:???一番の問題は「もとのログがサニタイズされたりされなかったりしてるデータ」があるってことだね。
教科書通り、高木氏からサニタイズいうなって言われる状態。
htmlspecialchars_decode を使って一度サニタイズ前のデータに戻してから、
htmlspecialcharsすればいいんじゃあるまいか。
0758nobodyさん
2007/05/09(水) 12:00:42ID:QoYhDnaMURLに直接アクセスしたらメールが送信されるわけで
いたずらなどされないか心配です。
この場合、連続送信の対応はどうしたらいいのでしょうか?
クッキーを発行して制御する方法で良いのでしょうか?
0759751
2007/05/09(水) 12:09:45ID:MkwX/1Mgありがとうございます。レス遅れてすみません。
しばらく調べていたのですがやはり・・
ソースはあまりに単純なんでアレですが以下です。
お手数おかけしますm(_ _)m
no=1のメールに既読フラグをつけるスクリプト(部分)
$mb = imap_open(MAILBOX, USER, PASS); #接続
imap_setflag_full($mb, 1, "\\Seen"); #1番目のメールに既読フラグ
$ov = imap_fetch_overview($mb, 1); #1番目のメールヘッダ取得
echo $ov[0]->seen; #既読フラグの有無を表示
imap_close($mb); #クローズ
表示は「1」(既読フラグがつけられた)
次にヘッダ一覧取得のスクリプト(部分)
$mb = imap_open(MAILBOX, USER, PASS); #接続
$ov = imap_fetch_overview($mb, 1); #1番目のメールヘッダ取得
foreach($ov as $key => $value)
echo $key . ":" . $value . "\n";
一覧が表示されるが既読フラグ部分は「seen:0」になっている。
これだけです・・
ヘッダやフラグの取得以外に、メールの削除などはうまくできています。
あと今更ですが環境はphp5とwindowsですm(_ _)m
0762nobodyさん
2007/05/09(水) 12:33:07ID:???スパム業者の方ですか?
ローカルからのアクセスかどうかをチェックする機能を付け加えるべし。
>>761
どの場所においてもcronなんて使えるわけだが。
0763nobodyさん
2007/05/09(水) 12:57:38ID:???0764nobodyさん
2007/05/09(水) 13:31:14ID:???unlink使うと、Permission deniedエラーがでます。
htdocsに直接ファイルおいて、読み取り専用のチェックも外してるのですが、なぜ解決できないのかわかりません。
0766764です
2007/05/09(水) 13:43:38ID:5TpInCe7$filepointertmp = fopen("php_dailylog.tmp","w");
flock($filepointer, LOCK_SH);
flock($filepointertmp,LOCK_EX);
fputs($filepointertmp,$time.$dailylog. "\n");
while($row=fgets($filepointer)){
fputs($filepointertmp,$row);
}
flock($filepointer, LOCK_UN);
flock($filepointertmp, LOCK_UN);
unlink("php_dailylog.dat");
rename("php_dailylog.tmp","php_dailylog.dat");
fclose("php_dailylog.dat");
こんなかんじです。
0767nobodyさん
2007/05/09(水) 13:48:20ID:???unlink(ry
0768764です
2007/05/09(水) 14:04:07ID:???ありがとう御座います。
unlinkのエラーは消えたのですが、以降のエラーがでて、鯖が固まってしまいました(ノ_-;)
修行してきます
0769nobodyさん
2007/05/09(水) 14:26:01ID:???mb_language("Japanese");
mb_internal_encoding("SJIS");
$name = $_POST["name"];
$mail = $_POST["mail"];
$message = $_POST["message"];
$from = "From: " . $name . "<" . $mail . ">";
mb_send_mail($mailto, $subject, $message, $from);
これでいいと思うのですが、送信する前に print $from; をしてみると
<$mail>が表示されないのです。
送信されたメールの送信元は<$mail>になってるいるのですがそういう仕様なのでしょうか?
それと、半角のみの投稿をさせない場合に文字数とバイト数を比較する方法というのを見たのですが
if(strlen($message) == mb_strlen($message)){ exit; }
とすれば大丈夫でしょうか?
0770nobodyさん
2007/05/09(水) 14:48:16ID:???print $from;で表示されないのはわかりませんが
送信されたメールで$nameが表示されないのは
日本語に対してMIMEエンコーディングしてないからじゃない?
$name = mb_encode_mimeheader($name);
半角チェックはただexit()ってのも冷たい気がするけど
構文的にはそれでもよいのでは。
0771761
2007/05/09(水) 15:05:57ID:???いやいや
cron使ってわざわざhttpサーバにアクセスするのも変じゃない
普通素直にスクリプト起動するだけだからなぜURLにと思ったの
0772nobodyさん
2007/05/09(水) 15:25:38ID:???レンタルサーバならそういう事情もあるでしょ。
public_html以下しか接続許可していないサーバも存在するだろうし。
cronが使えるようなサーバがそんな気の利かない設定するわけないけど。
0773nobodyさん
2007/05/09(水) 16:27:05ID:???エンコードすると中身はISOなんたらかんたらとなって
人が理解できないようなものになるのはこれで正しいですか?
後、exit()だけなのは手っ取り早く1行で抑えたかったのでこの書き方になりました。
0774nobodyさん
2007/05/09(水) 16:32:08ID:???むりですか?
0775774
2007/05/09(水) 16:32:49ID:D8ftPzG/やっぱりlinux上できかできないのかな\\\
0777nobodyさん
2007/05/09(水) 16:45:11ID:???0778nobodyさん
2007/05/09(水) 16:51:54ID:D8ftPzG/XPのOS再インストールがおわったらためしてみます
0779nobodyさん
2007/05/09(水) 16:55:58ID:???0780爆音で名前が聞こえません
2007/05/09(水) 17:20:39ID:xxzAywl/$name[1] = "satou tarou";
$name[2] = "tanaka zirou";
とします
それぞれにログインネーム(氏を使用、同じ苗字は数字で区別)を作成したくて
以下の関数を作成しました
function mk_login_name($name){ //forで人数分回す、引数は$name[$i]
$split_name = explode(" ", $name);
$login_name = $split_name[0]; //スペースで分割して一つ目(氏)をログインネーム候補に
$count[$login_name]++; //連想配列でログインネーム候補をカウント
echo $count[$login_name]; //カウントのテスト表示
if($count[$login_name] >= 2) //2回目以降のカウントがあった場合には氏の後にカウント数を付ける
$login_name = "$login_name"."$count[$login_name]";
return($login_name);
}
$name[2]が入った時は$count[$login_name]が2になってログイン名がtanaka2になると思ったら
カウントテストは全て1でした
どこがおかしいのでしょうか?
0781753
2007/05/09(水) 17:30:07ID:izHSsw10ログ読む時に全部デコードして表示時にエンコードするっていう一番の基本線が
確実ですね そうすることにします
ありがとうございました
0782nobodyさん
2007/05/09(水) 17:33:00ID:???1回のリクエストの中でそのカウント方式が完結するなら、関数内の初めの部分に
static $counter = array();
をして、$count[$login_name]++;の部分を
if (isset($count[$login_name])) {
$count[$login_name] = 0;
} else {
$count[$login_name]++;
}
に変える。
0783nobodyさん
2007/05/09(水) 18:02:24ID:???>これでいいと思うのですが、送信する前に print $from; をしてみると
><$mail>が表示されないのです。
単に、HTMLの要素カッコとしてブラウザが認識してるだけでしょ。
0785爆音で名前が聞こえません
2007/05/09(水) 18:30:18ID:xxzAywl/試してみましたがログインネームはtanaka, satou, tanakaでした
for($i = 0; $i <= 2; $i++){
$login_name[$i] = mk_login_name($name[$i]);
}
↑のように人数分関数を動かしてその間中カウントしたいのですが
1回のリクエストの中でそのカウント方式が完結してよいのでしょうか…?
0786爆音で名前が聞こえません
2007/05/09(水) 18:36:00ID:xxzAywl/すいません、解決しました
カウント部分は未変更で意図した結果になりました
0787782
2007/05/09(水) 18:38:25ID:???×static $counter
○static $count
つーか、1回のリクエストの中でカウント方式が完結したら、普通はダメだわな。
どんな仕様・設計にしてるか知らんが。
0788nobodyさん
2007/05/09(水) 19:07:52ID:???<?php
function showString($value, $num, $delim){
for($i=1;$i<=$num;$i++){
print($value.$delim);
}
}
showString('だるまさんが転んだ!',5,<br />');
?>
と入力したら真っ白(エラーなんたらも無し)になったけど
Why?
0789nobodyさん
2007/05/09(水) 19:13:30ID:???0790nobodyさん
2007/05/09(水) 19:15:26ID:???つか<br />'の前に'が無いんだが
これが原因だったら2chに書き込む前に5分考えろ
0792nobodyさん
2007/05/09(水) 19:32:36ID:???■ このスレッドは過去ログ倉庫に格納されています