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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/10/25(火) 06:50:06ID:Q4oGlTH3
PHP全般の質問スレです。
【基本ルール】
・新規質問の方は上げてください。age進行でお願いします。
・質問者は2回目以降、最初のレス番号を名前欄に入れてください。
・回答者は質問者に対して>>(アンカー)をつけてください。
・煽り・荒らしは放置。荒らしに反応した香具師も荒(ry
・解決しなくてもこたえてもらったら礼を。
【質問テンプレ】
・マニュアルを調べたか、google検索したか(調べたキーワード)
・タイトル(禁:教えてください!etc) 例:requireとinclude
・内容 例:requireとincludeはどう違うのですか?
・質問する際には環境も明記。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・オブジェクト指向については良スレがないから本を買え
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
【PHP マニュアル】
http://www.php.net/manual/ja/
※マニュアル上部の「search for」から検索を活用すべし(便利)。

過去スレ、関連リンク、FAQ等>>2-10辺り
0352340,3502005/11/11(金) 15:42:16ID:???
>>351
布団をパタパタされたので急いでいた。
エスケープならなんでも良かった。
今は"\\"の方が良かったと後悔している。
0353nobodyさん2005/11/12(土) 18:23:07ID:???
URLにセッション名とセッションIDを埋めてページ間のデータのやりとりを
しているんだけどOperaだと問題なくセッションを共有できるのにFireFoxだと
うまく共有できない(セッションIDが変わっている)

両方のphpファイルではちゃんと先頭で
session_start();
しているしなにがいけないんだろう?

OperaとFireFoxでプログラムの組み方変えなきゃならないの?
03543532005/11/12(土) 19:29:46ID:???
徐々に状況が判明してきた。
PHPの設定パラメータ「session.use_trans_sid」が0に指定されていると想定し、

/* index.php */
session_start();
print "session_id = " . session_id();

<a href="session.php?<?=SID?>">リンクA</a>
<a href="no_session.php">リンクB</a>
/* index.php */


/* session.php */
session_start();
print "session_id = " . session_id();
/* session.php */


/* no_session.php */
session_start();
print "session_id = " . session_id();
/* no_session.php */

上記の3つのファイルを用意する。
index.phpにて「リンクA」をクリックすると表示されるセッションIDは同じである。(当然)
そのあとブラウザの戻るボタンを押しindex.phpに戻ってきてから次に「リンクB」を
クリックする。するとなぜかURLでセッションを引き渡してないにもかかわらず同じ
セッションIDが表示されるのである。

次に順番を変える。indexphpにて先に「リンクB」をクリックして(当然セッションIDは違う)、
それから「戻る」ボタンをおして戻ってきて、次に「リンクA」をクリックするとなぜかindex.php
で表示されたセッションIDと違うのである。URLでセッションを引き渡しているにもかかわらず。
0355nobodyさん2005/11/12(土) 19:30:37ID:???
バカはさっさと死ね
03563532005/11/12(土) 19:31:59ID:???
以上がOperaとFireFoxで生じた現象である。

そこで問題なんだが先に「リンクB」を押してしまったとしても、
ブラウザの戻るボタンを押してindex.phpに戻ってきてから「リンクA」をクリックしたとき、
セッションIDがindex.phpのそれと等しくするよう(セッションが引き継がれるよう)にする
方法は無いだろうか?
0357nobodyさん2005/11/12(土) 19:39:21ID:???
セッションIDなんて飾りです。エロイ人にはそれが分からんのです。
問題はデータが渡せているかいないかだべ。
03583532005/11/12(土) 19:44:43ID:???
エロイんですか、そうですか('A`)・・・
0359nobodyさん2005/11/12(土) 20:38:02ID:???
>>297

>>294,>>295どこが2分?
目が腐っちゃったのかな?
0360nobodyさん2005/11/12(土) 20:45:50ID:???
>>353
>するとなぜかURLでセッションを引き渡してないにもかかわらず同じ
>セッションIDが表示されるのである。

実はクッキーで渡してたりして
0361nobodyさん2005/11/12(土) 22:43:06ID:???
use_trans_sidを1にすりゃすむのに。
03623532005/11/13(日) 01:08:33ID:???
>>360
クッキーがオンのときでもURLでセッションを引き渡していなければ
引き渡されないようにする方法って無いんだっけ?

index.phpが表示されるたびにsession_idをrenewできればいいのかな?

>>361
レンタル鯖('A`)・・・
0363nobodyさん2005/11/13(日) 02:31:35ID:???
$str = "hogehogehogehoge";
foreach ($str as $ch) {
switch ($ch) {
case ...
}
}
のように、文字列を一文字ずつ処理したいのですが、どういうふうにしたら良いですか?
上記のように書くとInvalid argument supplied for foreach()と言われてしまいます。
03643632005/11/13(日) 02:33:28ID:AK9WWUo7
あ、ageなきゃいけなかったんですね。すみません。
0365nobodyさん2005/11/13(日) 02:39:31ID:???
>>363
アルファベットだけでいいのなら、$str[] で個々にアクセスできるから、for文を使うとか。
マルチバイトならmb_substr()をクルクル回す。
0366nobodyさん2005/11/13(日) 03:01:28ID:???
>>363
もしforeachが使いたいなら、str_split(PHP5)やpreg_splitなどで配列にしてしまう手もあるね。
マルチバイトの場合mb_splitでは一文字ずつに区切れないので365のようにmb_substr使うのが最善かな。
03673632005/11/13(日) 03:06:15ID:AK9WWUo7
>>365-366
どうもありがとうございます!
foreachに直接文字列は使えないんですね。
参考になりました。
0368nobodyさん2005/11/13(日) 03:12:09ID:???
>>363
ちなみにPHPでは文字列の部分文字に角カッコ[]でアクセスするのは非推奨らしい。
中カッコ{}を使うべし。$str{$i}みたいに。
C系やJavaなんかに慣れてると[]でアクセスできた方が気持ちいいけどね。
Zend的には文字列と配列は混同すべきでない、って立場らしい。
363のようなforeachに対する混同をなくすためっていう意味あいもあるのかな。
個人的にはforeachで文字列も回せたほうが気持ちいいんだが。
(需要の有無は別として)
03693632005/11/13(日) 03:31:27ID:AK9WWUo7
>>368
参考になります。

すみません、もう一つ質問なんですが、PHPでクロージャのようなものは実現できませんか?
0370nobodyさん2005/11/13(日) 03:52:48ID:???
>>369
関数を無名で定義したいという意味ならPHPでは無理。
ただ、可変関数を使えば関数へのアクセスを変数に格納したり引数で渡したり別の関数の返り値にするなどの模倣はできる。
$f = "strlen";
echo $f($f); // 6を表示
このとき関数名を文字列で持ちまわす必要があるので、匿名の関数という考えがPHPにはない。
0371nobodyさん2005/11/13(日) 03:59:57ID:???
>>370
嘘イクナイ。
http://jp.php.net/manual/ja/function.create-function.php
まあ、使いづらいというか書きづらいものではありますが。
03723702005/11/13(日) 04:19:17ID:???
>>371
本当だ。こいつぁ知らなんだ。�d
確かにリテラルとして書けないので使いづらそうではあるなw
0373nobodyさん2005/11/13(日) 04:28:06ID:???
つーかよく見たら無名じゃないんだな。_lambda_1みたいな名前がつくのね。関数名を文字列として記憶しておく意味では可変関数と一緒か。
evalに近い保守性の低下を招きそうなところが難点だね。
利点は関数の名前を自分で考えなくていいってことくらい?
03743632005/11/13(日) 04:49:35ID:AK9WWUo7
>>370-373
ありがとうございます。本当に勉強になります。
まだまだ自分の勉強不足を思い知らされました。
色々と奥が深そうですね。どうもありがとうございました!
0375nobodyさん2005/11/13(日) 05:37:38ID:rUB5/Vi+
phpの新バージョンっていつでる?mbstring関連のバグが非常にうざい
0376nobodyさん2005/11/13(日) 05:44:07ID:???
function shori()
{
$a1["data"] = 大きなデータ1
$a2["data"] = 大きなデータ2
$a1["ref"] =& $a2;
$a2["ref"] =& $a1;
unset($a1);
unset($a2);
}

shori(); // 1回目
shori(); // 2回目

このようなコードで1回目の処理が終わったところで占有されていたメモリは解放されます?
解放されないとしたらどう対処すべき?
$a["ref"]は実際には別の関数で隠蔽してたりして、解放時にアクセスするのは避けたい場合もあるのでunset($a["ref"])ができるとは限らない状況なんです。
0377nobodyさん2005/11/13(日) 07:32:49ID:???
PHPを始めてみようと思うのですが。
2chを見ているとPHPはプログラミング初心者向けのような印象です。
PHPのプロフェッショナルの方々から見るとどのような見解ですか?(得られるものはどれくらいありますか?)
一応C++とJavaScriptとVBの経験がありますけど、PHPの用語など自分にはかなり高度に見えるのですが。
できれば中高生向けの解説HPや本など教えてもらえると思います。
PHP以外にもサーバサイドインタフェースが取り扱いできる言語があったらいいのですが。
0378nobodyさん2005/11/13(日) 08:14:36ID:???
>>374
PHP5でイテレータ使ってみた。微妙w
class StringIterator implements Iterator {
private $chars, $pos, $len;
public function __construct($utf8_str) {
$this->chars = preg_split('/(.)/su', $utf8_str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$this->len = count($this->chars);
$this->pos = 0;
}
public function __toString() { return implode('', $this->chars); }
public function current() { return $this->chars[$this->pos]; }
public function key() { return $this->pos; }
public function next() { $this->pos++; }
public function rewind() { $this->pos = 0; }
public function valid() { return $this->pos < $this->len; }
}

$str = new StringIterator('【PHP】質問スレッドpart30【php】');
echo $str, "\n"; // echo $str->__toString() . "\n";
foreach ($str as $char) {
echo $char, "\n";
}
0379nobodyさん2005/11/13(日) 09:03:04ID:???
>>378
なるほど。発想的にけっこう面白いんじゃないかな。
JavaでいうStringTokenizer、STLでいうstringstreamに通じるものがあるね。
洗練させればforeachでちょっとした字句解析なんてのもできそう。
foreach ($str as $token) ...
ってな感じで。
0380nobodyさん2005/11/13(日) 09:07:43ID:???
>>375
具体的に何がうざい?

>>376
そんなもん自分でベンチとりやがれ

>>377
まにゅある
0381nobodyさん2005/11/13(日) 09:10:53ID:???
php5ならArrayIteratorを継承したほうが楽だよ
0382nobodyさん2005/11/13(日) 09:13:29ID:???
SPLの組み込みイテレータのキーって実体は何よ。
0383nobodyさん2005/11/13(日) 09:18:44ID:lJ8slral
 <?php
//設定
$yourname = $_POST['name'];
$file=fopen("name.dat","r");
while($row=fgets($file,1024)){
    if(eregi('($yourname)[a-z0-9./_\-]+',$row,$data)){
        print($data[0]."<br />");
    }
}
fclose($file);
?>

ユーザがフォームに文字例入力して[送信]ボタンを押すと
上のプログラムが[name.dat]中から既出を検索してくれるプログラムを作りました。
これで正規表現の検索が出来ると思ったのですが、なぜかprintしてくれません。

どこか悪いところでもあるのでしょうか?
お願いします。
0384nobodyさん2005/11/13(日) 09:48:26ID:???
>>382
整数だけど。

>>383
まずはパターンの部分をシングルクォートではなくダブルクォートに。
$rowには改行も含まれているので、たぶんtrimか何かで削除すべきでは?
あとはそのname.datの一行に含まれるデータがどういう形式かわからないと何とも言えない。
[a-z0-9./_\-]+ってのがすごく奇妙なんだが。
0385nobodyさん2005/11/13(日) 09:51:42ID:???
>>383
なぜくだ質スレで回答をもらっているのにここに来る?
FAQにすら載らない基本中の基本を分かっていないのなら、
マニュアルの「言語リフアレンス」の項目を音読することをお奨めする。
0386nobodyさん2005/11/13(日) 10:06:17ID:???
( ´д)ヒソ(´д`)ヒソ(д` ) オクサンマルチラシイワヨ イヤーネ
0387nobodyさん2005/11/13(日) 10:10:45ID:???
断ってから移ってんだから別にいいんじゃねーの?
0388nobodyさん2005/11/13(日) 10:13:26ID:???
一応マルチではないんだが。。。
くだ質ではスレ違いで、こちらのスレが妥当と判断した理由が判らない。
内容からするとくだ質の方が適していると思うが。
それと、元のままだと$yournameの内容が展開されないよ、って教えて貰っているのに
そのまま同じ質問をするのも理解不能。
0389nobodyさん2005/11/13(日) 10:13:30ID:???
どうして「くだ質」から普通の質問スレッドへ階級が上がってるんだ?
逆なら分かるが、向こうからこっちにくるのは許せない。
だめ。
0390nobodyさん2005/11/13(日) 10:15:43ID:???
' → "
終了
0391nobodyさん2005/11/13(日) 10:17:18ID:???
>>383、巣へお帰り。ここはお前の住む世界じゃないのよ...
 by ナウシカ
0392nobodyさん2005/11/13(日) 10:23:17ID:???
うーん、俺的にはどっちのスレでもいいと思うんだが、向こうの440へのレスとして440の内容が理解できてないっていう意思表明はしてるわけだし。
まあ答えてもらった手前、礼の一つくらいしてから移動するべきだったってのはあるかもね。
つーか384で答えた手前、何か立場が微妙なボクチン。
0393nobodyさん2005/11/13(日) 10:29:46ID:lJ8slral
ごめん、向こうで何か展開されないとか答え貰ったんで
スレ違いかなぁ・・・と思ってここ来ました。
マルチのつもりではなかったのですが…

アドバイス参考に頑張ってみます。
ありがとうございました。
0394nobodyさん2005/11/13(日) 10:31:53ID:???
>>393
展開されないという書き込みをどう理解したのか
素直に390をやってみれ
0395nobodyさん2005/11/13(日) 10:35:09ID:???
念のため書いときまーす

【基本ルール】
・煽り・荒らしは放置。荒らしに反応した香具師も荒(ry

(>>1より一部引用)
0396nobodyさん2005/11/13(日) 10:56:11ID:AK9WWUo7
>>370の可変関数に関しての質問です。
http://www.php.net/manual/ja/functions.variable-functions.php
こちらに可変メソッドの例があるのですが、「あるオブジェクトのあるメソッド」を変数に格納しておく方法はないでしょうか?
つまり、$foo->Variableというメソッドの"Variable"という情報だけではなく、$fooも一緒に変数に代入することはできませんか?
0397nobodyさん2005/11/13(日) 10:58:14ID:???
おいおい
ただの変数だろ
0398nobodyさん2005/11/13(日) 11:02:50ID:???
以下のようにforeach内で$mlを追加すると、追加された配列は処理されないように
思うのですが、こういう時はwhileで書くべきなのでしょうか?

foreach($ml as $list){
time() = 123456 && $ml[] = time();
echo $list;
}
0399nobodyさん2005/11/13(日) 11:04:08ID:lJ8slral
>>394
おk。ありがとうございます。

>>395
僕が荒しだと言うのですか?
04003952005/11/13(日) 11:09:26ID:???
>>399
わりわり。おまいさんのことじゃないよ。

>>397
Variableってのがメソッド名なのでは?

>>398
foreachが回す配列は$mlの一時コピー。
むしろどういう動作を期待しているのかがようわからん。
0401nobodyさん2005/11/13(日) 11:26:46ID:???
>>400
変数のコピーなのですね
ありがとうございます
ディレクトリリストを作ろうとしています
0402nobodyさん2005/11/13(日) 13:30:05ID:???
>>396
つ array($foo, "Variable")
0403nobodyさん2005/11/13(日) 16:38:26ID:nIgwwwAk
質問がございます。
php.iniの設定が上手くいきません。

環境は
windowsXp
php5.0.5
mysqlserver5

php.iniはC\windowsフォルダ
に入れています。

php5ts.dllもsystem32に入れています。

php.iniファイルの extension系の";"
は参考書通りにはずしています。
0404nobodyさん2005/11/13(日) 16:50:14ID:???
>>403
Webサーバは何?
つーか何がどううまくいかないの?
0405nobodyさん2005/11/13(日) 16:58:56ID:???
>>403

>そもそもphpinfo()で表示されるphp.iniはあってるのかね。

>>extension=php_mysql.dllが有効にならず。
>>mysql サポートが enabledになりません。
>どうやって確認したんだか。

>mysql4.1以降はphp_mysqli.dllですがな。

とりあえずム板でもらったレスにも反応してやってくれ
0406nobodyさん2005/11/13(日) 17:33:00ID:???
エスパーさん、出番です
0407nobodyさん2005/11/13(日) 17:36:08ID:???
-k restart
0408nobodyさん2005/11/13(日) 17:37:22ID:???
スクリプトに点数つけてください。よろしくお願いします。
<?
// EX) value
$startcolor='012345';
$endcolor='0000FF';
$str='あいうえおかきくけこ';

// 文字列→配列
$str = stripslashes($str);
$strcount = mb_strlen($str,"SJIS");
for($i=0;$i<$strcount;$i++) $strarray[] = mb_substr($str,$i,1,"SJIS");

/********** 色をRGBにで10進数に変換 *********/
//開始色
$startcolor = mb_convert_kana($startcolor,"a","SJIS");
$startcolorarray = preg_split('//', $startcolor, -1, PREG_SPLIT_NO_EMPTY);
$startcolorR16 = $startcolorarray[0].$startcolorarray[1];
$startcolorG16 = $startcolorarray[2].$startcolorarray[3];
$startcolorB16 = $startcolorarray[4].$startcolorarray[5];
$startcolorR10 = hexdec($startcolorR16);
$startcolorG10 = hexdec($startcolorG16);
$startcolorB10 = hexdec($startcolorB16);
//終了色
$endcolor = mb_convert_kana($endcolor,"a","SJIS");
$endcolorarray = preg_split('//', $endcolor, -1, PREG_SPLIT_NO_EMPTY);
$endcolorR16 = $endcolorarray[0].$endcolorarray[1];
$endcolorG16 = $endcolorarray[2].$endcolorarray[3];
$endcolorB16 = $endcolorarray[4].$endcolorarray[5];
$endcolorR10 = hexdec($endcolorR16);
$endcolorG10 = hexdec($endcolorG16);
$endcolorB10 = hexdec($endcolorB16);
0409つづき2005/11/13(日) 17:37:52ID:???
/********** 色をRGBにで10進数に変換 *********/
$Rwidth = @round( ( $startcolorR10 - $endcolorR10) / $strcount,0);
$Gwidth = @round( ( $startcolorG10 - $endcolorG10) / $strcount,0);
$Bwidth = @round( ( $startcolorB10 - $endcolorB10) / $strcount,0);

/************* 結果作成 *************/
for($i=0;$i<$strcount;$i++){
$Rcolor = $startcolorR10 - ( $Rwidth * $i);
$Gcolor = $startcolorG10 - ( $Gwidth * $i);
$Bcolor = $startcolorB10 - ( $Bwidth * $i);
$Rcolor16 = @dechex( $Rcolor);
$Gcolor16 = @dechex( $Gcolor);
$Bcolor16 = @dechex( $Bcolor);
if(strlen($Rcolor16)==1) $Rcolor16 = "0".$Rcolor16;
if(strlen($Gcolor16)==1) $Gcolor16 = "0".$Gcolor16;
if(strlen($Bcolor16)==1) $Bcolor16 = "0".$Bcolor16;
$result.="<font color='#{$Rcolor16}{$Gcolor16}{$Bcolor16}'>{$strarray[$i]}</font>";
}
?>
0410nobodyさん2005/11/13(日) 17:40:15ID:???
ワロスw
0411nobodyさん2005/11/13(日) 17:45:34ID:???
2点
0412nobodyさん2005/11/13(日) 17:47:35ID:???
>>411
ながったらしい汚い物を書いてしまったのはあやまる。すまなかった。
マジレスするが、なんで2点?
0413nobodyさん2005/11/13(日) 18:54:29ID:???
点数は適当だが

突っ込みどころだらけで何とも言い難い…
最低でも
・バグ
・無意味に1文字ずつ切り取り(ヒント:substr)
・同じ処理はarray_map()や自作関数
の改善はやってくれ。
0414nobodyさん2005/11/13(日) 18:54:54ID:???
>>412
「ながったらしい汚い物」だからだろ。何が疑問なんだ。
あとせめて「何をするスクリプトか」くらい書けよ。
0415nobodyさん2005/11/13(日) 19:29:49ID:???
>>414
$strを$startcolorから$endcolorにグラデーション表示
以外と分からないもの?
0416nobodyさん2005/11/13(日) 19:32:23ID:???
>>413
サンクス!
最後の$result簡単に作るために
substr()無意味ではないと思うんだけど、、
違うやり方が見つからん。
0417nobodyさん2005/11/13(日) 19:37:59ID:???
ビットシフトしろ
0418nobodyさん2005/11/13(日) 20:34:30ID:???
>>416
R,G,B を配列にするだけでも随分と見やすくなると思うのだけど。
〜略〜
/********** 色をRGBにで10進数に変換 *********/
$startcolor = mb_convert_kana($startcolor,"a","SJIS"); //必要?
$endcolor = mb_convert_kana($endcolor,"a","SJIS");   //必要?
$startcolor10 = array(/* R, G, B*/);
$width = array(/* R, G, B*/);
for ($i = 0; $i < 3; $i++) {
  //開始色
  $color16 = substr($startcolor, $i * 2, 2);
  $startcolor10[$i] = hexdec($color16);
  //終了色
  $color16 = substr($endcolor, $i * 2, 2);
  $endcolor10 = hexdec($color16);
  //減色幅
  $width[$i] = @round( ( $startcolor10[$i] - $endcolor10 ) / $strcount,0);
}
/************* 結果作成 *************/
$result = '';
for($i=0;$i<$strcount;$i++){
  $color16 = array(/* R, G, B*/);
  for ($x = 0; $x < 3; $x++) {
    $color10 = $startcolor10[$x] - ( $width[$x] * $i);
    $color16[$x] = @dechex($color10);

    //$color10が -1 の時、FFFFFFFF になってしまうので下記の方がいいと思われ
    //if(strlen($color16[$x])==1) $color16[$x] = "0".$color16[$x];
    $color16[$x] = substr("0{$color16[$x]}", -2);
  }
  $result.="<font color='#{$color16[0]}{$color16[1]}{$color16[2]}'>{$strarray[$i]}</font>";
}
0419nobodyさん2005/11/13(日) 21:08:16ID:???
>>415
中身見て判断しろって時点でナメきっている
0420nobodyさん2005/11/13(日) 21:36:49ID:???
>>418
2人ともくだスレでやってくれ
0421nobodyさん2005/11/13(日) 21:41:53ID:???
RGBの処理なんてイディオムだと思ってたけど最近そうでもないんだな。
0422nobodyさん2005/11/14(月) 00:51:37ID:???
>>421
ビットシフトのこと?
まあPHPで書くのに色情報を24ビット(or 32ビット)に押し込まなきゃならん理由がないからな。
とくにRGBをそれぞれ独立にオーバーフローなども考慮した計算したい場合、シフトと逆シフトが余計なステップ踏むことになる。
よほどメモリの食い方に問題がある場合以外はあえてビットシフトしないじゃない?
0423nobodyさん2005/11/14(月) 01:02:02ID:???
PHPでPHPを処理することはできませんか?
0424nobodyさん2005/11/14(月) 01:10:21ID:???
eval()
0425nobodyさん2005/11/14(月) 01:14:58ID:???
>>423
include
0426nobodyさん2005/11/14(月) 01:57:55ID:???
evalすごい><
まだ使い方わかってないけど希望が見えてきました。
includeも頑張ります。
ありがとうございました。
0427nobodyさん2005/11/14(月) 08:24:50ID:???
>>422
いやRGBって書いてあるじゃん
0428nobodyさん2005/11/14(月) 08:33:12ID:???
ああぐぐり方を間違ったとか?
0429nobodyさん2005/11/14(月) 08:44:08ID:???
>>421 → >>422 → >>427
のエスパー会話を誰か翻訳してくれないか?
0430nobodyさん2005/11/14(月) 08:49:53ID:???
RPGについて
0431nobodyさん2005/11/14(月) 08:58:58ID:???
別にビットマップ扱おうってわけじゃないんだし
人間様に分かりやすい10進数が最凶伝説
0432nobodyさん2005/11/14(月) 09:00:43ID:???
16進法の方が書きやすいと思うよ
0433nobodyさん2005/11/14(月) 09:06:27ID:???
人間様…
0434nobodyさん2005/11/14(月) 09:12:53ID:3QndTAPn
ログイン認証について質問です。
今のところ、ユーザー名とパスワードが送信された場合にデータベースを検索し、正しいユーザー名とパスワードだった場合に
$_COOKIE['login'] = md5($username . time());
のような形にしているのですが、ユーザーがログインの状態を保ったまま別のページにアクセスした場合に、そのユーザーが元々どのユーザーだったのかを判別する方法がわかりません。
$_COOKIE['login'] = $username . time();
のようにそのままクッキーに書き込むと、何らかの方法でクッキーをのぞき見することが出来てしまった場合に情報の漏洩が起こってしまいます。
ユーザー情報を復元するにはどうしたら良いですか?
04354342005/11/14(月) 09:14:25ID:3QndTAPn
環境を書き忘れました。
Linux Apache1.3.33 PHP5.0.5です。
それと、自宅のWindowsXP PHP5.0.5だと、クッキーの情報が読めないことがあります。
原因がわかる方、いらっしゃいましたらご教授お願いします。
0436nobodyさん2005/11/14(月) 09:17:31ID:???
md5の値をファイル名にしてそこにユーザ名などのデータを入れとくと
クッキーからユーザ情報などを復元できる

ていうようなのを勝手にやってくれるのがPHPのセッションだと思うんですけど
0437nobodyさん2005/11/14(月) 09:24:12ID:???
くだ質レベルだな
0438nobodyさん2005/11/14(月) 09:54:52ID:???
$_COOKIEに放り込んでいる時点で破ってくれって言ってるようなものだしね
04394342005/11/14(月) 10:27:02ID:???
>>436 >>438
返答ありがとうございます。
なるほど。そこそこ手間をかけないといけないのですね。
セッションに関してはセキュリティ上問題ないのでしょうか?
ログイン認証を行うにはURLに直接埋め込む方法とクッキーを用いる方法の大きく2通りがありクッキーを用いる方法がより安全である、ということを(どこで見かけたのか忘れてしまったのですが・・・)聞いたことがあります。
(うろ覚えなので間違ってたら申し訳ございません)
04404342005/11/14(月) 10:28:01ID:???
>>437
すみません。精進します。
0441nobodyさん2005/11/14(月) 10:34:11ID:???
>>439
>クッキーを用いる方法がより安全である
そりゃその2つだけを単純に比較した場合の話。
自分でも書いてるが、認証の実装方法のほうが影響は大きい
セキュアな認証を実現する手段はググれば結構見つかるのでは?
0442nobodyさん2005/11/14(月) 10:52:57ID:???
>>439
SIDを丸投げされた時の対応を忘れなければ良いと思う
04434342005/11/14(月) 11:03:03ID:???
>>441
なるほど、定番みたいな方法はないのですね。
実際、WebメールなんかのログインではURLに情報を埋め込んでいるようですし、何がよくて何がまずいのかの理解に苦戦してます。
もう少しググってみようと思います。

>>442
すみません。SIDを「丸投げ」というのはいったい・・・。
ググってみたところ、SIDというのはユーザーを識別するための番号のことだと思うのですが。
間違っていましたらご指摘お願いします。

あと、クッキーの情報がうまく読めないのですが理由はわかりますでしょうか?
0444nobodyさん2005/11/14(月) 11:08:29ID:???
>>443
うまく読めない……では分からない。
具体的に、どうクッキーに書き込んで、
それを読み出そうとすると、どうなってしまうのか、
具体的に書かないと。

04454342005/11/14(月) 11:25:27ID:???
>>>444
ご指摘ありがとうございます。
大まかにですが、以下のようなコードを使っています。

// login.php
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// ユーザー名とパスワードをデータベースにて照合
$_COOKIE['login'] = md5($username . time());
header("Location: home.php");
}

これで、ロケーション先のhome.phpで$_COOKIE['login']の値を取得することができません。
(おそらく空白が入っています)
何か原因は思い当たりますでしょうか?
04464452005/11/14(月) 11:28:47ID:???
少し言葉足らずでしたので付け加えさせてください。
上記の$usernameはデータベースにて照合する際に$_POST['username']から値を代入してあります。
0447nobodyさん2005/11/14(月) 11:34:44ID:???
>>446
つーか、setcookieは?
0448nobodyさん2005/11/14(月) 11:37:35ID:JySqj704
<?php
for($lp=0;$lp<=100;$lp+1)
{
echo"$lp \r\n";
}
?>

↑の様に書くと、「0」を無限に書き出すのですが。何か間違ってますか?
ど素人ですいません。
0449nobodyさん2005/11/14(月) 11:39:30ID:???
>>448
for($lp=0;$lp<=100;$lp++)
もしくは
for($lp=0;$lp<=100;$lp=$lp+1)
では?
0450nobodyさん2005/11/14(月) 11:40:41ID:JySqj704
>>449

ホントすいません。

これはマジ自己嫌悪ですわ。
0451nobodyさん2005/11/14(月) 11:41:32ID:JySqj704
>>449
ありがとう御座いました。
俺、あほ過ぎ・・・
■ このスレッドは過去ログ倉庫に格納されています