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

【PHP】下らねぇ質問はここに書き込みやがれ 24

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/07/07(金) 14:54:53ID:KnVubDvE
PHPに関するくだらねぇ質問用スレです。
ここならお前の下らない質問に回答があるかも知れません。

まず読め【PHP マニュアル】
http://www.php.net/manual/ja/

過去スレは>>2
0714nobodyさん2006/07/19(水) 08:25:22ID:???
>>710
「他と重複しない完全なランダム」をどこにも記録せずに一発で生成するのは無理があるから
ファイルを作るのがイヤならDBに過去のキーを全部記録しとくとかしないと無理じゃない?
uniqid()は衝突の危険を回避するために現在時間を利用してるわけで、それも無しとなると、
ランダムな名前を試しに作る→過去のデータに重複がないか検索→重複してたら再生成
みたいなループを自力でやんないと原理的に不可能だよ。
(過去データを保持できるのは自分のプログラムだけなんだから、それを自動で処理する関数はありえない)
07157142006/07/19(水) 08:41:52ID:???
>>710
で、単にランダムなだけで、既存と重複してるかどうかは無視していいのであれば、
function randstring($len) {
$c = array_merge(range(0, 9), range("a", "z"), range("A", "Z"));
$s = '';
for($i = 0; $i < $len; $i ++) {
$s .= $c[array_rand($c)];
}
return $s;
}
こんな程度で任意の桁数の数字・大小英文字の組み合わせでの文字列は作れる。
あとは作る→探す→作るをひたすら繰り返すだけ。
0716nobodyさん2006/07/19(水) 09:36:16ID:???
>>705
・パスワードは保存しない、「忘れた」対応は新規に仮パスワードを振り出す
・比較用のハッシュとは別に暗号化して保存、キーはひみつの質問の答え、e-mailアドレス等から生成
こんなんでどうですか?
0717nobodyさん2006/07/19(水) 10:04:07ID:+mavFuWs
PHP4.3.xのソースが欲しいんですが、どこかでダウンロードできますか?
本家では最新の4.4しか置いてなさそうなんですが、実はどこかにあったりします?
0718nobodyさん2006/07/19(水) 10:11:01ID:???
>>717
PHPのサイトのDownloadのページに
Older versions of PHPってページへのリンクがあるけど?
0719nobodyさん2006/07/19(水) 10:14:46ID:???
javascript が on になってるかどうかで
処理分岐することは可能でしょうか?
可能な場合、方法教えてくりませ
0720nobodyさん2006/07/19(水) 10:16:39ID:???
$serial=array('\[(.+)\]','(.+)');
こうなってる
だから
print $serial[1];
が正解
07217202006/07/19(水) 10:17:29ID:???
誤爆しますた
0722nobodyさん2006/07/19(水) 10:19:55ID:???
>>719
ググれば星の数ほどサンプルが転がってる。
0723nobodyさん2006/07/19(水) 10:37:09ID:???
もはよう おまいら

何か昨日は祭りだったみたいだな
ID:n2ZEUTcJ みたいなのにはレスすんな
途中から670とか名乗ってるしw
0724nobodyさん2006/07/19(水) 10:59:42ID:Ay+5zUkF
すみませんが、教えてください。

PHPの4.3で、クラスのメンバ関数の呼び出しを変数を使って
呼び出したいんですけどできませんか?

$func1 = "testfunc1()";
$testClass->$func1;

0725nobodyさん2006/07/19(水) 11:22:57ID:???
>>724
$testClass->{$func1}
こうやってはいかがかな?
0726nobodyさん2006/07/19(水) 11:41:22ID:???
>>725
レスありがとうございます。が、しかし、Undefine Propertyになってしまいます・・・
0727nobodyさん2006/07/19(水) 11:52:47ID:???
>>724
現象が再現する最小限のソースプリーズ。
0728nobodyさん2006/07/19(水) 12:02:12ID:???
>>724
$func1 = "testfunc1";
$testClass->$func1();
または
$testClass->{$func1}();

ってカンジでどうでしょう?
07297172006/07/19(水) 12:20:13ID:+mavFuWs
>>718
ありがとう。
ページの右側ばっかり見てました。
0730nobodyさん2006/07/19(水) 12:35:41ID:???
おおぉ、皆様ありがとうございます。

>>727,728

$testClass->{$func1}();

この方法でOKでした。これなら、クラスを引数に渡せるし、
助かりました。

0731nobodyさん2006/07/19(水) 12:46:22ID:???
皆さん何かお勧めの参考書や辞典はありますか?

自分は
PHP辞典
PHPスーパーサンプル第2版
をよく読みます。(主に辞典)

何かお勧めの参考書などがあれば教えていただけませんか?
0732nobodyさん2006/07/19(水) 12:48:54ID:???
PHPマニュアル、Google

マジお薦め
0733nobodyさん2006/07/19(水) 12:55:32ID:???
>>717
cvs -d :pserver:cvsread@cvs.php.net:/repository checkout -r PHP_4_3 php-src
07347072006/07/19(水) 13:18:50ID:???
>>715
サンプルコードありがとう。
uniqidを、大文字も利用した短縮文字列に変換して、
必要であればなんらかの暗号的変換もかけるのはどうだろう?
と今思いつきました。
0735nobodyさん2006/07/19(水) 13:25:46ID:???
>>731
やはり、
http://jp.php.net/manual/ja/
これがもっともお勧めだな。
0736nobodyさん2006/07/19(水) 13:46:04ID:???
>>734
欲しいのは大文字だけなの?
uniqid()をベースにする限り、「現在時間に依存しない」「短い文字列」という希望は満たせないわけだが。

> なんらかの暗号的変換もかける
その時点でその文字列はユニークじゃなくなってしまう可能性が高いんで
最初から自力でランダムな文字列を生成するのと何も変わらなくなってしまうんだが。
0737nobodyさん2006/07/19(水) 13:51:12ID:/PVcx7MW
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<title>test</title>
</head>
<body>
<?php echo "hello"; ?>
</body>
</html>

を実行すると

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<title>test</title>
</head>
<body>
hello</body>
</html>

になって微妙に気持ち悪いんだが、これは仕様?
07387072006/07/19(水) 13:58:05ID:???
>>736
>> なんらかの暗号的変換もかける
>その時点でその文字列はユニークじゃなくなってしまう可能性が高いんで
>最初から自力でランダムな文字列を生成するのと何も変わらなくなってしまうんだが。
uniqidがベースなので、ユニークにできますよ。
また厳密には、現在時間に依存しますが、
容易に推測されないランダムな文字列になっていればいい、
という感じです。
0739nobodyさん2006/07/19(水) 14:08:15ID:???
さすが>>707
世界中の暗号学者が必死になって証明することを簡単に言ってのけるッ
0740nobodyさん2006/07/19(水) 14:09:48ID:???
>>738
>709の示した
ttp://phpspot.net/php/pg%83%86%83j%81%5B%83N%82%C8%82h%82c%82%F0%93%BE%82%E9.html
が希望に近いと思うが、どちらにせよ既存のIDと重複しないために、重複チェックは必要になる。
「重複チェックに引っかかる→再試行」の繰り返しを忘れぬよう。
0741nobodyさん2006/07/19(水) 14:09:49ID:???
進数変換と同様に、コード中に使える文字の種類を増やして
1対1の可逆変換で短縮した文字列を再生成するってことだな。
できるじゃね?
0742nobodyさん2006/07/19(水) 14:11:26ID:???
>>737
仕様
0743nobodyさん2006/07/19(水) 14:15:43ID:/PVcx7MW
>>742
まじかorz
回避方法は改行を余計に入れる、ってことくらいか?
07447072006/07/19(水) 14:21:34ID:???
uniqid() を16進数から36進数に変換して、
軽くシャッフルするとかシフトするとかすれば、(容易に推測されない程度の暗号化)
できそうですよね?
0745nobodyさん2006/07/19(水) 14:23:04ID:???
好きなようにすればいいと思うよ
暗号強度についてはスレ違いだしな
0746nobodyさん2006/07/19(水) 14:23:26ID:???
>>743
PHPタグはHTMLの途中に挿入するケースが多いから、
そのときに余分な改行が入らないように直後の改行を除去するようになってる。
逆に改行が入って欲しいなら、必要な分だけ改行を追加するしかないだろうね。
07477072006/07/19(水) 14:24:49ID:???
>>744
36進数は間違い。62進数(大文字つき)で。
0748nobodyさん2006/07/19(水) 14:25:36ID:???
>>744
36進数への変換まではいいと思うけど、シャッフルはユニークさが失われるからダメじゃない?
シフトってのがA,B.C→4,5,6みたいな1対1変換を指してるならそれは問題ないと思う。
07497072006/07/19(水) 14:31:08ID:???
>>748
シャッフルもパターンに則って行えば、シフトと同じようなもんです。
暗号化としてはゆるいですけど、外から推測困難な程度でいいので。
0750nobodyさん2006/07/19(水) 14:32:31ID:???
>>749
ああ、ルールに基づいて桁位置を一部入れ替えるってことね。いいんじゃね?
0751nobodyさん2006/07/19(水) 14:34:42ID:/PVcx7MW
>>746
わかった。サンクス!
0752nobodyさん2006/07/19(水) 16:04:01ID:???
飯食う時間ないんだけど、どうすればいい?
07537072006/07/19(水) 16:30:05ID:???
シフトは少し意味が薄いような感じでした。
シャッフルしてから、進数変換すると、
いい感じにランダムっぽくできました。
0754nobodyさん2006/07/19(水) 18:30:14ID:???
知っている人には簡単なことだと思うのですが

list($a, $b) = explode("|", $str);

みたいに書いたときに、| が含まれていない $str が来た場合に
Undefined offset の NOTICE が出ます。これが出ないように
うまい具合に短く書く方法はないでしょうか。

セパレータが含まれているかどうかを事前に判定して処理を分けるのも
考えましたが、あまり賢い方法じゃないように思えて。
0755マリー・アントワネット2006/07/19(水) 18:39:31ID:???
未定義だと言われるのなら先に定義しておけばいいじゃない。
0756nobodyさん2006/07/19(水) 18:41:59ID:???
>>754
区切り文字の数に規則性がないのなら、左辺を配列にしてしまえば良いのではないでしょうか?

$array = explode("|", $str);
foreach($array as $val){
処理
}
0757nobodyさん2006/07/19(水) 18:42:00ID:???
>>754
こんなのはどうですか?
list($a, $b) = explode("|", $str . "|");
0758nobodyさん2006/07/19(水) 18:43:43ID:???
ていうか、これがよい。
list($a, $b) = @explode("|", $str);
0759nobodyさん2006/07/19(水) 18:45:45ID:???
error_reporting(E_ALL ^ E_NOTICE);
0760軟式PHP2006/07/19(水) 18:59:40ID:???
>>759
臭いものには蓋をする的なレスだなw
0761nobodyさん2006/07/19(水) 19:08:31ID:ae0kzGe1
classが全然わかりません
先生助けて
foo::foget($this->hoge);

の::てどういう意味でしょう??
0762nobodyさん2006/07/19(水) 19:17:11ID:???
>>761
>>334-338嫁ボケ!お前のかーちゃんでべそ!!
0763nobodyさん2006/07/19(水) 19:48:11ID:???
やーい、やーい
お前のかーちゃん お・ん・な!!
0764nobodyさん2006/07/19(水) 20:14:14ID:???
float型の 1.49080555641E+15 を、
一般的な数値の表示形式に変換して表示することはできますか?
単純にint型にすると、オーバーフローしてしまうので・・。
07657642006/07/19(水) 20:48:57ID:???
printf('%.0f', $float);
で、できたようです。

ところで、
echo $a = 1209314420881328;

echo $b = 1209314420881329;
は、違う値($a != $b)だけど、同じ表示(1.20931442088E+15)になるんですね・・。(いまいちよくわかってないです)
0766nobodyさん2006/07/19(水) 21:04:01ID:???
>>763 うちのかーちゃんそろそろ60歳なんだが、ある意味すごくイヤだなそれ
0767nobodyさん2006/07/19(水) 21:54:47ID:R8UceB4D
変数に指定の文字列が含まれている場合、処理するにはどうすればいいのでしょうか?
以下のようなソースですが、希望通りになりません。

$image="test.jpg";
if($image==".jpg"){
echo "これはJPEGファイルです";
}
0768nobodyさん2006/07/19(水) 22:03:14ID:SHpEirXb
>>767
正規表現でマニュアル嫁
0769nobodyさん2006/07/19(水) 22:11:02ID:???
>>767
> if($image==".jpg")
両辺が同一ではないのですから、当然、マッチしません。
正規表現を使ってください。

PHP: preg_match - Manual
ttp://jp.php.net/manual/ja/function.preg-match.php
0770nobodyさん2006/07/19(水) 22:28:02ID:???
>>768-769
以下のソースで出来ました。アドバイスありがとうございました。
if(preg_match("/.jpg/",$image)){
echo "これはJPEGファイルです";
}
0771nobodyさん2006/07/19(水) 22:33:40ID:???
敢えて言っておくと、

$image = 'test.jpg.png';

でも通るから正しくない
0772nobodyさん2006/07/19(水) 22:45:28ID:???
>>770
771氏が指摘されたように、後方一致にしないと完全ではありませんね。
そのままでは部分一致です。

PHP: パターン構文 - Manual
ttp://php.liukang.com/manual/ja/reference.pcre.pattern.syntax.php
0773nobodyさん2006/07/19(水) 22:47:54ID:???
if(preg_match("/\.jpe?g$/i",$image)){
echo "これはJPEGファイルです";
}
拡張子が.jpegの時もたまにある
0774nobodyさん2006/07/19(水) 22:54:39ID:???
>>773
jpeのときもあるんだよなコレが。
0775nobodyさん2006/07/19(水) 23:00:07ID:???
だったら「jeg」もあるんだなコレが。
0776nobodyさん2006/07/20(木) 00:05:34ID:???
任意の過去の日付をあらわす8桁の数字YYYYMMDDから、曜日を割り出す関数ってありますか?
0777nobodyさん2006/07/20(木) 00:32:58ID:???
まぁ組み込み関数ではなくてモジュールになってしまうけどあるよ。

http://search.cpan.org/~stbey/Date-Calc-5.4/Calc.pod
0778nobodyさん2006/07/20(木) 00:48:51ID:???
>>776
まあ、関数じゃないけど、俺ならこうする。モジュール使うよりはマシ。
$a = '20060101';// 任意の日付
$weekname = array('日','月','火','水','木','金','土');
echo $weekname[date('w',strtotime($a))]; // '日'
0779nobodyさん2006/07/20(木) 01:18:02ID:???
検索エンジンになりつつあるな
0780nobodyさん2006/07/20(木) 01:59:05ID:???
PHPって何で3項演算子が左結合なんですか?
0781nobodyさん2006/07/20(木) 02:03:59ID:???
>>780
開発した人に聞いて
07827542006/07/20(木) 02:05:26ID:???
レス遅くなりました。
>>755
>未定義だと言われるのなら先に定義しておけばいいじゃない。
$bを先に定義してもこの NOTICE は出ますよね?そういう意味ではないかな

>>756-758
試して検討してみます。ありがとうございます。

>>759
確かに NOTICE は表示されなくなりますが…
根本的な解決にならないので…
0783nobodyさん2006/07/20(木) 02:06:36ID:???
>>782
> $bを先に定義してもこの NOTICE は出ますよね?そういう意味ではないかな
試してからやれ、このハゲ。
0784nobodyさん2006/07/20(木) 02:11:13ID:???
>>783
Notice出るよ。
0785nobodyさん2006/07/20(木) 02:14:47ID:???
>>773-775
横着しすぎると .j にまでマッチしてしまったり
0786nobodyさん2006/07/20(木) 02:14:53ID:???
なんでPHPでこんな厳密なコーディングせにゃならんのだろうか
0787nobodyさん2006/07/20(木) 02:16:54ID:???
>>785
素直に
if(preg_match("/\.(jpg|jpeg|jpe|jeg)$/i",$image)){
echo "これはJPEGファイルです";
}
って書いた方がよさげ
でも俺、.jegって見たことないよ。どんなときに作られるんだそれ。
0788nobodyさん2006/07/20(木) 02:23:44ID:???
>>787
マジレスすると、拡張子なんて信用できない。

例えば、JPEG形式で保存された画像にファイル名を付けるとする。
そこで敢えて拡張子を「gif」にしたとする。

* * *
こんなことしてもJPEGがGIFになることはないよね。
誤解している人も多いが、HTML文書の拡張子は「html」か「htm」じゃないとダメだ ・・・なんて言う
香具師がいるけどそれは違う。

拡張子なんて関係無い。
0789nobodyさん2006/07/20(木) 02:34:35ID:???
>>782
>>759
>確かに NOTICE は表示されなくなりますが…
>根本的な解決にならないので…
といいつつ
>>758を検討している件について。

0790nobodyさん2006/07/20(木) 02:37:27ID:???
>拡張子なんて関係無い。
サーバーの設定とブラウザの挙動による。
0791nobodyさん2006/07/20(木) 03:40:55ID:???
>>788
論点がずれている気がする。
拡張子を変更してもフォーマットに変更はない。
が、「拡張子を変えることで画像を表示できない」ことは問題だ。

大抵のサーバは拡張子 html で "Content-Type: text/html" を送ってくるし、
「拡張子なんて関係ない」は言い過ぎではないかと。

自前のサーバで "Content-Type" を設定するというのなら、気持ちはわからないでもないが、
それを他の人に求めるかとなると話は別だろう。
0792nobodyさん2006/07/20(木) 07:32:37ID:???
>>789
おまけに、この場合のNoticeを消そうと思ったら
× list($a, $b) = @explode("|", $str);
○ @list($a, $b) = explode("|", $str);
だったりする罠。
0793nobodyさん2006/07/20(木) 09:42:16ID:???
>>789
必ず $a と $b の二つの要素だけが必要になるのなら、

list($a, $b, $dummy) = explode("|", $str."||");

こうすればよい。
0794nobodyさん2006/07/20(木) 09:50:36ID:???
ごめん。やっぱりこれでよかった。

list($a, $b) = explode("|", $str."|");
0795nobodyさん2006/07/20(木) 10:34:16ID:???
>>754
セパレータが存在するか事前にチェックして処理を分けるのが一番賢い方法だと思う。
見た目に囚われてて視認性や可読性を犠牲にしてないか?
三項演算子のダメな使い方と同じ道を辿ってるぞ。
07967542006/07/20(木) 12:01:05ID:???
>>789
>>792
エラー制御演算子使うのも確かに本質的に同じですね…
で、配列のエラーなので>>792のいう通りでした。

>>795
$strの中を2度も見たくないと思って質問したのですが、
ごもっともな指摘です。
0797nobodyさん2006/07/20(木) 12:06:05ID:???
ところで、変数に大き目の文字列(HTMLページ丸ごとのような)が入っていて、
スクリプト途中で使用済みになった場合、
$html = "";
とかって初期化すると、スクリプトの効率がよくなったりしますか?
たとえば、

$arHtml = file('aa.html');
$html = implode($arHtml);

のように読み込んだファイルを $html の文字列一つにした後、その後の処理で使用しない $arHtmlを

$arHtml = array();

とするとか。
0798nobodyさん2006/07/20(木) 12:43:44ID:???
>>765
float の大きさはプラットフォーム依存です。
ただし、通常はおよそ 10 進数で 14 桁の精度があり、最大値は ~1.8e308 (これは 64ビット IEEE フォーマットです) となります。

1.2093144208813E+015
普通は14桁のはずだが
0799nobodyさん2006/07/20(木) 12:47:16ID:???
>>797
どうせ消すならちゃんとunset($arHtml)で;変数管理構造体ごと消すべきだと思うけど…。
食ってるメモリ量にもよるけど、それが巨大なら効率が上がる場合もあるんじゃないかな。
HTML丸ごとくらいは大したサイズじゃないと思ったりもするけど。
メモリスワップを引き起こすほどじゃなきゃ体感できるほど変わらんと思ったりもするけど。
0800nobodyさん2006/07/20(木) 13:11:38ID:???
>>799
ありがとうございます。
どのくらいが大きい量なのかわからなかったので。
レンタル鯖であれば、100バイトの1万行でも楽々動いていたのでさほど気にすることでもないのでしょうか。
0801nobodyさん2006/07/20(木) 13:38:24ID:???
共有のレンタル鯖だと自分だけ省メモリにしたとこで速度的には何も変わらんよな。
単に他人への迷惑が多少減るだけ。
0802nobodyさん2006/07/20(木) 13:45:15ID:???
>>797
> $arHtml = file('aa.html');
> $html = implode($arHtml);
使ってしまったメモリを解放するより、2回もでかいメモリアロケーションを
発生させてるのを減らす努力をした方が効率は上がると思う。
0803nobodyさん2006/07/20(木) 13:52:49ID:???
>>802
まったくだw
0804nobodyさん2006/07/20(木) 14:06:48ID:zh5fHket
質問です。

自分で定義したfunctionが沢山書かれたファイルを、別のサーバにあるphpファイルで呼び出そうとしたらうまくいきません。

別のサーバのphpファイルには
require_once("http://hogehoge.com/my_function.php";);
としているのですが、実行すると、
Call to undefined functionといわれます。

ちなみhogehoge.comのサーバのルートからのパスをrequireで指定すると動きます。

くだらない質問ですみません、ヒントがありましたらお願いします。

0805nobodyさん2006/07/20(木) 14:10:58ID:???
>>802
そのスクリプトは、HTMLのテンプレートの中に置き換える予定の文字を書き込んでおき ( %name% ) 等
あとで、

foreach ($Ar as $key => $value) {
$html = str_replace("%".$key."%", $value, $html);
}

でワンクッションで置き換えようとおもうたからです。
0806nobodyさん2006/07/20(木) 14:13:16ID:???
>>804
淫狂うど
0807nobodyさん2006/07/20(木) 14:17:28ID:zh5fHket
>806
レスありがとうございます。
includeでも同じようです。
サーバの設定にもよるのでしょうか?
0808nobodyさん2006/07/20(木) 14:40:37ID:???
>>807
ブラウザでhttp://hogehoge.com/my_function.phpを表示させてみれ。
その表示内容がrequireで読み込まれてる内容だから。
その中に自分の欲しいPHPコードは入っているかい?
0809nobodyさん2006/07/20(木) 14:44:51ID:zh5fHket
>808
レスどうもです!
なるほど!ちょっと盲点でした。
httpで読んでもダメという解釈でいいのでしょうか?
0810nobodyさん2006/07/20(木) 14:44:57ID:???
>>805
んー・・・・ だから?
それと無駄メモリ使いの手抜きコードと何の関連があるの?
いや別にHTMLファイル2個分くらい、たかが知れてるから
さほどこだわる必要も無いと思うけどな。
そのくせメモリ解放を気にするなんて小にこだわり大を失うって言うか。。
0811nobodyさん2006/07/20(木) 14:48:58ID:???
>>809
http以外で何でアクセスするんだ。
そうでなく、httpでアクセスしてもちゃんとPHPコードの形で出力されるようにすればいいだけ。
0812nobodyさん2006/07/20(木) 14:51:49ID:???
>>809
拡張子を.txtにしてインクルードしたらいい
0813軟式PHP2006/07/20(木) 14:53:14ID:???
関数丸見えて嫌だな。
ちゃんとアクセス制限しないとな。
0814nobodyさん2006/07/20(木) 15:09:44ID:???
拡張子をcgiにしておけば500エラーが出て表示されない
■ このスレッドは過去ログ倉庫に格納されています