【PHP】下らねぇ質問はここに書き込みやがれpart15
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/01/14(土) 20:06:11ID:???ここなら本スレで回答のないお前の下らない質問に回答があるかも知れません。
次スレは流れを見て970/980/990の誰かが建てれ
まず読め【PHP マニュアル】
http://www.php.net/manual/ja/
本スレ【PHP】質問スレッドpart32【php】
http://pc8.2ch.net/test/read.cgi/php/1136276300/
前スレ【PHP】下らねぇ質問はここに書き込みやがれpart14
http://pc8.2ch.net/test/read.cgi/php/1134868212/
過去スレは>>2
FAQは>>3
0447445
2006/01/24(火) 22:12:26ID:???このやり方でなくても
ファイルにある数字と重複しないランダムな数字の
出し方があればお願いします。
0448nobodyさん
2006/01/24(火) 22:36:08ID:???最初にファイル読んでるときに連続していなければ間の番号、
最後まで連続してたら最終+1した番号を持つようにすれば
重複はしないだろう。
0450nobodyさん
2006/01/24(火) 23:13:35ID:???あい。
$logfile = "hoge.txt";
$num_max = 10;
$lines_e = @file($logfile);
$num = range(1, $num_max);
srand( (double)microtime()*1000000 );
foreach($line_e as $l) {
$n = split("\t", $l);
if(($pos = array_search($n[0], $num)) != FALSE) {
unset($num[$pos]);
}
}
shuffle($num);
print $num[0];
0451nobodyさん
2006/01/24(火) 23:41:23ID:???<?php
$fp = fopen('log.txt','r+');
while( $ary = fscanf($fp,"%d\t%s\n") ){
$log[$ary[0]] = $ary[1];
}
srand((microtime()*1000000));
do{
$a = round(rand(0,10));
}while(isset($log[$a]));
$str = $a."\t".'comment';
echo $str;
fputs($fp,$str."\n");
?>
このままだと、使い切ると無限ループになるがな。
0452nobodyさん
2006/01/25(水) 01:11:42ID:???b.php の中には関数が山ほど定義されています。
この関数の一部を c.php にコピーし、
b.php の先頭に include('c.php'); と書いたとき
これって同じ動作が保障されていますか?
ぱっと見良さそうなんですが
動作しなくなる特別な場合とかありますか?
0453nobodyさん
2006/01/25(水) 01:14:23ID:???コピーなの?移動じゃなくて?
同じ関数を複数のファイルで定義してまとめて読み込んじゃうと
関数の多重定義エラーで止まっちゃうよ。
定義を別ファイルに移動して多段階で読み込むだけなら無問題。
0456nobodyさん
2006/01/25(水) 02:00:07ID:???ページ2でバリデーションされるにはどうするのがいいですか?
つまり、ランダムに表示させた俳句番号が正しく送られてきているかチェックしたい。
しかしランダムの数値をサーバ側で持たなくてはいけないような気がするのですが、
session_idを使ったりするのでしょうか。
0457nobodyさん
2006/01/25(水) 02:07:25ID:???0458nobodyさん
2006/01/25(水) 02:11:56ID:???input name="point[表示させた俳句ID]" value="点数"
こんな感じで配列渡しで終わったりしないのか?
0459nobodyさん
2006/01/25(水) 02:14:39ID:???どのくらいの厳密性を要求してるのかにもよる気がするんだけど、
各採点ボタンの俳句No.+全No.順リスト1個の組み合わせにして
両者が合致してればOKにするとか、不安ならさらにリスト側をMD5で
暗号化しとくとかでも十分な気がする。
(それでも不安ならCRCでも付加しとけば良かろう)
個人的にはそういう一時的遷移情報の照合でセッションを使うのは
処理コストが高い+新規ウインドウを出すと矛盾しかねないので好かない。
0460nobodyさん
2006/01/25(水) 02:22:55ID:???0461nobodyさん
2006/01/25(水) 02:28:13ID:???0462nobodyさん
2006/01/25(水) 02:44:08ID:???そのIDが次のページでチェックする時に保持されないので困っている次第です。
>>459
ちょっと理解できなかったです…すみません。
全No.順リスト1個ってなんでしょうか?
厳密性は、
DB上のPRIKEYが俳句No.となっていて<input name="俳句No.(つまりPRIKEY)"... です。
これだと好きなものに適当に点数をつけられるのは嫌かなー位です。
0463451
2006/01/25(水) 02:48:59ID:???451の悪いところを挙げようか?
例えば0〜100億の範囲の内、1〜100億までを使い切っていたとすると
最後に残っている0に合致するまでランダムに値を生成しないとならないので
相当なロスがあるよ。1〜100億までを使い切るまでにも、
そういったロスが積み重なっている筈。
0464450
2006/01/25(水) 03:10:28ID:???そういう意味では450のは多くても少なくても処理時間は極端には差がないけど、
最初に「使用可能なNo.のリスト」を生成するのでメモリを食いやすく、初回から
それなりの処理時間を必要とするかもね。
多分、まだデータの少ないうちなら451の方が処理速度が速い。(希ガス)
処理速度的には最後のランダム要素抽出ってshuffle→[0]抜き出しよりも
randで抽出位置の決定をやった方が速いかもしんない。
(PHPのshuffleの速度ってベンチ取ったことないから分かんないけど分量増えると遅そう…)
0465459
2006/01/25(水) 03:22:27ID:???要するに
<input type=hidden name="俳句No[0]" value="3">
<input type=radio name="採点[0]" vakue="1">...<input type=radio name="採点[0]" vakue="5">
<input type=hidden name="俳句No[1]" value="5">
<input type=radio name="採点[1]" vakue="1">...<input type=radio name="採点[1]" vakue="5">
:
<input type=hidden name="俳句No[9]" value="2">
<input type=radio name="採点[9]" vakue="1">...<input type=radio name="採点[9]" vakue="5">
とかいう実際の10個の俳句フォームに加えて
<input type=hidden name="俳句list" value="3,5,〜,2">
という、[0]〜[9]にそれぞれ何番を入れたかを連結したデータも一緒に入れてやって、
submitされたら
if(implode(",", $俳句No) != $俳句list) { echo "データが不正です"; }
とかすればいいんじゃないの?ってこと。
で、このリストが丸見えだとそっちも操作されそうで怖いと言うのであれば
<input type=hidden name="俳句list" value="<?=md5("3,5,...,2")?>">
とmd5化してやって、
if(md5(implode(",", $俳句No)) != $俳句list) { echo "データが不正です"; }
としちゃえば、そうそう容易には改変できないでしょ、ということ。
0466nobodyさん
2006/01/25(水) 03:33:12ID:???451が最後に書いてる「全ての番号を使い切ってしまったかどうか」を判定させるなら
450の処理方法の方が格段にやりやすい。
多分、451はその処理を加えるだけで急激に速度が落ちる。
0467466
2006/01/25(水) 03:35:06ID:???単純に if(count($log) >= 11) とかで一発で判定できちゃうね。
すまそ
0468nobodyさん
2006/01/25(水) 04:05:39ID:???す、すごい技ですね。考えもつきませんでした。
ちょっと理解できなかったのは、俳句listには何が入るのですか?俳句No[]かな?
あれ?POSTで送られてくる値って前ページHTMLと同じ順番で来るんでしたっけ?
0469nobodyさん
2006/01/25(水) 04:17:23ID:???POST後に俳句Noをimplodeで連結して判定してんだから
当然listに入れるのも俳句Noをimplodeしたものだよ。
あとPOSTの送信順はnameを配列変数名にしてれば気にする必要なし。
name="俳句No[3]"はPOSTされると$_POST["俳句No"][3]に格納される。
0470nobodyさん
2006/01/25(水) 04:53:17ID:???やっと理解できたと思います。ありがとうございます。
上のソースだと valueのところを好きなようにいじって、md5(...)のとこも
好きなようにいじったように入れれば、任意の番号をいじれるじゃん!
って思ったけど、md5をsha1とか違うアルゴリズムにすればわからないわけですね…
POSTの送信順は、関係ないですね。俳句No[]は、0-10で並ぶわけですから。
非常に勉強になりました。
0471nobodyさん
2006/01/25(水) 05:04:59ID:???cryptとか、補助キーを使う暗号にすればいいね。
0472nobodyさん
2006/01/25(水) 05:16:44ID:???だから最初にどのくらいの厳密性を要求してんのか、って聞いたんじゃん。
そこの強度を上げる方策は色々あるんだから必要に応じて凝ればよろしい。
0473nobodyさん
2006/01/25(水) 09:08:44ID:???0474nobodyさん
2006/01/25(水) 10:00:12ID:???0476nobodyさん
2006/01/25(水) 12:21:33ID:???0477nobodyさん
2006/01/25(水) 12:48:25ID:???無くても処理は可能だけど、あった方が俳句listとの比較が容易になる上、表示の順番も含めてチェック可能になる。
0478nobodyさん
2006/01/25(水) 13:21:01ID:???$str = 'a';
$str++;
これで$strはbになるって知ってたか?
知らなかったぜフハハー
0479nobodyさん
2006/01/25(水) 13:48:37ID:???0480nobodyさん
2006/01/25(水) 14:06:33ID:???0482nobodyさん
2006/01/25(水) 14:43:57ID:???http://hogehoge.hoge/?aaa=5
などでURLを開くと
$aaaの値に5が入りますが
http://hogehoge.hoge/5
このようなURLで
$aaaに5を入れる事は出来ますか?
0483nobodyさん
2006/01/25(水) 14:47:25ID:???0484nobodyさん
2006/01/25(水) 14:48:15ID:???0485nobodyさん
2006/01/25(水) 14:53:03ID:???0487nobodyさん
2006/01/25(水) 15:47:06ID:???/5 ってのがくっついた時点で /5/{DirectoryIndex} にアクセスしない?
で、5 の部分がパラメータ値なら可変なんだろうからそんなディレクトリは存在しない→404かと
0488軟式PHP
2006/01/25(水) 16:10:34ID:???0491nobodyさん
2006/01/25(水) 16:57:41ID:???PATH_INFOでもindex.phpとかが省略されていたら無理
http://example.com/index.php/5 はOKだけど
http://example.com/5 は404not found
0492nobodyさん
2006/01/25(水) 17:17:08ID:???0493nobodyさん
2006/01/25(水) 17:20:08ID:???0494nobodyさん
2006/01/25(水) 17:24:07ID:???そこに自分のディレクトリ名を$aaaにセットするindex.phpを置けば
PHPだけでもできるな。
0495nobodyさん
2006/01/25(水) 17:33:01ID:P6kcSZ98class foo {
function execute() {
$sp =& fopen("huga.txt", "r");
$fp =& fopen("hoge.txt", "w"); flock($fp, LOCK_EX);
if ($fp == FALSE) {
$result = PEAR::raiseError("Can't Open File");
return $result;
}
while ($data = fgets($sp, 1024)) {
fputs($fp, $data);
}
fclose($sp);
flock($fp, LOCK_UN);
fclose($fp);
return TRUE;
}
}
例えばPHPUnitを利用して
正しく書き込まれているか。エラーが生成されるか。
をテストしたいのですが、どのようにテストすればいいのでしょうか。
0497nobodyさん
2006/01/25(水) 18:49:30ID:???作り方も考えつかねーよウボァー
0498nobodyさん
2006/01/25(水) 19:22:41ID:???0500nobodyさん
2006/01/25(水) 19:29:56ID:???1〜3はループ
1.置いた周囲に●があるか判定
↓YES
2.その方角をひとつづつ読み込み、○が最初に出た時点まで判定
↓YES
3.間を全て○にする
でいいんじゃないの
0501nobodyさん
2006/01/25(水) 20:28:10ID:???0502nobodyさん
2006/01/25(水) 21:00:06ID:???これはRubyだけど、ttp://www.railthello.com/
0503nobodyさん
2006/01/25(水) 21:04:12ID:???0504nobodyさん
2006/01/25(水) 21:20:18ID:???0505nobodyさん
2006/01/25(水) 22:49:14ID:???0506nobodyさん
2006/01/25(水) 22:55:02ID:???0508nobodyさん
2006/01/25(水) 23:06:06ID:???0509nobodyさん
2006/01/26(木) 01:58:35ID:???$id_point_map = array(1 => 4, 2 => 2, 3 => -2, 4 => -4); //idと点数
この場合以下のUPDATEをcount($id_point_map)分foreachでまわさないと
いけないでしょうか?一気にUPDATEする方法はあるでしょうか?
UPDATE date SET total_point=total_point+$point WHERE id = $id;
0510nobodyさん
2006/01/26(木) 02:43:25ID:oTQct+ILpreg_matchは該当する先頭の1個だけで、
preg_match_allは該当するモノ全部って事??
0513nobodyさん
2006/01/26(木) 11:19:34ID:???jcodeとかnkfみたいなのありませんか?
0515nobodyさん
2006/01/26(木) 11:38:00ID:???0516nobodyさん
2006/01/26(木) 11:43:35ID:???0517nobodyさん
2006/01/26(木) 12:22:26ID:???require_once "HTTP/Compress.php";
とやると
Warning: main(HTTP/Compress.php): failed to open stream: No such file or directory
と出てしまいます。
CGI版PHPにしても同様です。
0520nobodyさん
2006/01/26(木) 13:06:32ID:???globalでやってみても駄目でした。
<?
$a=10;
test();
function test(){
$b=20;
test2();
echo $b;
}
function test2(){
global $b;
$b++;
}
?>
↑では$bが21になるようにしたいんですけど・・。
0521nobodyさん
2006/01/26(木) 13:32:24ID:???変数$bはtest内ローカル変数だから、test2内からでは参照できない。
変数$bを、変数$a同様にグローバルの場所で宣言するか、test内で global $b; として宣言する。
0523nobodyさん
2006/01/26(木) 13:46:40ID:???これで普通って思うかも
>>520
関数っつーのは一般に y= f(x) の形で表されるもので、
「何か値を入れたら何かが返ってくるもの」と考えるのが
C系の言語の基本です。で、関数の中身のことは知らなくて
いいように作る。これ。
0524520
2006/01/26(木) 14:01:52ID:???>>522さんのやり方は当然わかっていたのですがどうせなら引数も
持たさないでいきたいなと思ったので・・。書いてなかったのですいません。
>>523さんの言いたいことはわかるのですが作るとなるとうーむ・・むつかしいところですね^^;
0525nobodyさん
2006/01/26(木) 14:06:28ID:???もしいくつかの関数で変数を共有したいというのであれば、
global 宣言使うよりも class 使った方が何かといいよ。
おれも引数は少ない方が好きだからその気持ちは分からなくもない。
0526nobodyさん
2006/01/26(木) 14:45:41ID:???classを活用出来ていない外野なんだけど、クラスでの解決方法をさらして欲しい・・
なんていうのは贅沢ですかそうですか
簡単にクラスを使った用例がホスイ
0527nobodyさん
2006/01/26(木) 14:54:48ID:???class Hoge
{
var $b;
function test(){
$this->b=20;
$this->test2();
echo $this->b;
}
function test2(){
$this->b++;
}
}
$a = new Hoge;
$a->test();
0528nobodyさん
2006/01/26(木) 15:01:11ID:???おぉ、サンクス。
>>526
メリットとしては共有しているものがはっきり違う形で
書かれているので関数の中だけ見ていてもぱっと見で影響
範囲が分かるってことと、共有する変数(PHP 的な正確な
用語は知らん)については最初に初期化しなければいけない
ので、これもあとで見たときに分かりやすくなるってこと
かな。使い捨てならどうだっていいことだけど。
0529520
2006/01/26(木) 16:48:46ID:???で、確かにクラスにしようかなとも考えたのですが
なんというかオブジェクト?(カート、動物)と言った物の処理とは
ちょっと違うように思えたのでそれならclassもおかしいのかなと思いました?
言葉ではちょっと表しにくいですね・・・。
簡潔に言えば労働スケジュールを組んでいます。(時間配分や機械等)
でこの日にはこの処理をこれだけの量やってって感じなんですが
ここである条件の場合の処理というのを関数に分けているのです。
で、さらにこの分けた関数処理の中でも条件分岐によって重複する処理がでたので
さらに分けたということなんです。
・・て感じなのでなんていうか、クラス的な考え方ってありなのでしょうか?
0530520
2006/01/26(木) 16:52:45ID:???俺の考え的には
if(){
処理A
処理C
}else{
処理B
処理C
}
↑の重複する処理Cの部分が多くなると関数として分けているのですが
こういう考え方についてはどう思われるのでしょうか?いろいろ教えてください^^;
0532520
2006/01/26(木) 17:07:37ID:???for(){
if(){
if(){
処理A
break 3
}else{
処理B
}else{
処理C
処理D
break 2
}
}else{
if(){
処理E
}else{
処理F
}else{
処理G
処理D
break 2
}
}
}
こんな感じでネストかけまくってるんです;;
処理Aとかも短くて同じ処理あるのですがいちいち関数で分けてたらややこしくなるしと思いまして・・
0533nobodyさん
2006/01/26(木) 17:08:17ID:???オブジェクトは単なる概念であって物理的なモノとは全然関係ないんで、
「1日」がオブジェクトだったり、「作業」がオブジェクトだったり、
処理しやすいように書けばいいと思うけど?
何か一つオブジェクト指向言語をやってみると目から鱗が落ちて、
なんでもかんでもオブジェクトとして扱えるようになるかもしんない。
でもそうなると PHP やめたくなるかもしんない。
0534nobodyさん
2006/01/26(木) 17:21:47ID:???オブジェクト=モノ、みたいな発想にとらわれることはないかと。
ただのスタティックな関数の寄せ集めをそれっぽい名前でカテゴライズしてクラス階層に落とし込んだりもするし。
0535nobodyさん
2006/01/26(木) 17:27:26ID:???脱皮が必要な時期にきてるかもね。
関数はくり返し使う処理を切り出すってより、「ロジックを書きやすく
読みやすいものにするためにブラックボックスを作る」という発想で
作っていくといいよ。まぁそのためにはデータ構造とかもいじらなきゃ
いけなくなるかもしんないけど。
例えば今回のスケジュールならたぶん作業や機械によって条件が
変わってくるでしょ? そういう条件をひっくるめてオブジェクトとして
くるんでしまう。そうするとおおもとのロジックで気にすべき条件は
見た目上だけど減るよね。オブジェクトの中に入っちゃうんで直接気に
する必要がなくなる。あとはロジックを書く際にいちばんほしい情報
だけをオブジェクトに教えてもらいながら書き進めていけばいい。
日本語だとえらく漠然としちゃうけど、オレの言いたいことは「ロジックを
気持ちよく書けるように工夫しろ」ってことだ。その結果、コード量が
増えてしまうことを恐れてはいけない。増えても読みやすければいいんだ。
0536nobodyさん
2006/01/26(木) 20:51:35ID:???Apacheってなんのためにあるんでしょ?
URLから「8080」のようなポート番号が必要なくなるだけ?
0537nobodyさん
2006/01/26(木) 20:55:49ID:???0538nobodyさん
2006/01/26(木) 21:19:04ID:???Apacheのほうがwebサーバとしての機能が十分に備わってるからでしょ。
TomcatはあくまでもApacheのプラグインと考えたほうがいいよ。
0539nobodyさん
2006/01/26(木) 23:06:17ID:???例えばfopenを使ってページや画像を保存する処理、つまり多重ダウンロードなどをしたい時は、
fopenでなくsocket系を使うべきでしょうか。
0540532
2006/01/27(金) 08:10:12ID:???ありがとうございます。
>>535さんまた難しそうですね^^;
確かに実際にオブジェクト指向組んだことないし勉強しなければ・・
俺は癖でつい読みやすさよりコード量減らしてしまふ・・orz
>>533 やめたくなるってのはオブジェクト指向には適していないから??
0541nobodyさん
2006/01/27(金) 08:44:08ID:???短くすること自体は良い習慣だけどね
全体量が小さくなることよりもブロックが小さくなることの優先度が
高いかな。おれはね。長いブロックを読み書きする体力がないもんで。
PHP はオブジェクト指向には「あまり」向いてないと思うよ。
5 はだいぶマシっぽいけど。
まぁそれは今から気にする必要ないんじゃない?
0542nobodyさん
2006/01/27(金) 10:09:24ID:???かなり見通しも良くなるし、変数のスコープも明確になる。
ひとまず、クラスなんて使ってみれば「どうということはない」。
オブジェクト指向はその後でもいいんじゃね?
0543nobodyさん
2006/01/27(金) 11:43:37ID:???MVCとかも以前JSPサーブレットとか使ったときちょっとやったけど
量が少ないと分けない方が楽なんですよね。
もはや人に見せることは考えてないですが・・^^;
・・とこんなこと書いてると俺のひよこレベルがw
0544nobodyさん
2006/01/27(金) 15:02:56ID:???後のメンテナンス性、拡張性考えると自然とオブジェクト指向になっていくお^^
0545nobodyさん
2006/01/27(金) 15:42:53ID:???とりあえず全てclassに入れればいいのかな?
■ このスレッドは過去ログ倉庫に格納されています