【PHP】下らねぇ質問はここに書き込みやがれ 55
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/09/29(土) 18:35:56ID:YlkpEUW6PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り
◆前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 54
http://pc11.2ch.net/test/read.cgi/php/1189309377/
◆質問する時の注意
・ 自分のIDを表示させること。(メール欄に何も記述しないこと。空白も入力しちゃダメ)
・ サーバーのOS(Linux、Windows他)、WebサーバーとPHPの種類やバージョン等を明記すること。
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・偽者防止に必ずIDを表示させること。(メール欄に何も記述しない)
・2回目以降は最初に質問した際のレス番号を名前欄に入れること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
0011nobodyさん
2007/09/29(土) 22:41:37ID:???<?php echo '等し'.(@file_get_contents('dat.txt')=='a'?'いです':'くありません');
0013nobodyさん
2007/09/29(土) 22:50:34ID:???echo bin2hex($line);
を見てみ。
ファイルを読み込むのは、file_get_contents() でもできるよ。
文字列比較は、strcmp() を使う方がいいかな。
0014nobodyさん
2007/09/29(土) 22:55:14ID:vw2Lts3b$errorの中身を表示するコードが書かれていないからです。
0015nobodyさん
2007/09/29(土) 22:56:39ID:vw2Lts3b0016nobodyさん
2007/09/29(土) 22:57:44ID:m/9bviMMprint $error;が抜けておりました。しかし、これを付け加えても
等しくありませんとなってしまいます。
file_get_contents()で検索してみたのですが、これはファイル内容を
全て読み込む関数でよろしいですか?
その場合、テキストに改行して書いてあった場合その通りに表示するには
またこれ用の関数があるのでしょうか。。。
0017nobodyさん
2007/09/29(土) 23:00:29ID:vw2Lts3b> 文字列比較は、strcmp() を使う方がいいかな。
なぜですか。
0018nobodyさん
2007/09/29(土) 23:01:13ID:YnYts4Cn・まずファイルの中身を読み取って出力させる
・次に1行ずつ文字列と比較して真偽を見る
とか順序だててやらないとウンコ漏らすことになる
0019nobodyさん
2007/09/29(土) 23:03:03ID:m/9bviMMdat.txtにa一文字だけ書いて比較すると正常に等しいとなるのですが、
a
b
c
d
e
としてdat.txtに書き込んだ場合、aがあるにも関わらず等しくないとなるのです。
0020nobodyさん
2007/09/29(土) 23:05:14ID:???0021nobodyさん
2007/09/29(土) 23:05:41ID:YnYts4Cnforeach ($logs as $log) {
$log = rtrim($log);
if ($log == 'a') {
$print = '等しい';
} else {
$print = '等しいわけない';
}
}
print $print;
でやってみて
0022nobodyさん
2007/09/29(土) 23:07:00ID:m/9bviMMそれも試してみましたが、うまくうごきませんでした。
printでも改行コードまでは表示されないので、どう比較していいか悩んでいます
0023nobodyさん
2007/09/29(土) 23:08:02ID:m/9bviMM丁寧なアドバイスありがとうございます。
早々試してみます。
0024nobodyさん
2007/09/29(土) 23:08:19ID:???echo bin2hex($line);
を見たら改行コードが入ってるのが分かるんだけどな。
'0a' とかみたいに16進数で表示されるから。
0026nobodyさん
2007/09/29(土) 23:13:05ID:m/9bviMMありがとうございます。無知ゆえ、改行コードが16進数で表示されるとはわかりませんでした。
そちらも視野に入れて色々じっけんしてみます。
0027nobodyさん
2007/09/29(土) 23:16:24ID:m/9bviMM改行コードは見えたのですが、行数によってコードが違うので比較できそうにないのですが、
これは比較の方法があるのですか?
0028nobodyさん
2007/09/29(土) 23:18:17ID:m/9bviMMためしてみましたが、やはり19と同じ模様です。
一行だけaが記述されていると等しくなるのですが、
a
b
c
とかってして読み込んで比較すると等しくなりませんでした
0029nobodyさん
2007/09/29(土) 23:18:25ID:???0030nobodyさん
2007/09/29(土) 23:18:43ID:???今回の場合だといいかもしれないけど、PHPだと、
if ('2a' == 2)
が真になってしまうから。
=== を使うか strcmp() を使う癖を付けないと危険。
0031nobodyさん
2007/09/29(土) 23:19:55ID:???> が真になってしまうから。
なにこの糞言語www
0032nobodyさん
2007/09/29(土) 23:20:11ID:vw2Lts3b$printの中身を表示するコードがforeachループに外にあるのは間違いでしょう。
0033nobodyさん
2007/09/29(土) 23:24:10ID:???以下の記事に詳しく書いてある。
ttp://d.hatena.ne.jp/gallu/20061108/p1
0034nobodyさん
2007/09/29(土) 23:24:53ID:m/9bviMM21のアドバイスでも32のアドバイスもよいと思いますが、私は等しくないと何度も付加したくないので
(foreachの中にプリント入れると全ての処理に対して等しくないをつけてしまう)21のアドバイス
で納得しました
0035nobodyさん
2007/09/29(土) 23:28:38ID:m/9bviMMへぇーこれは驚きですね。今までならってきたifの概念からすると比較できそう
にないとおもってしまいますが、こういう事実もあるのですね。
0036nobodyさん
2007/09/29(土) 23:28:57ID:vw2Lts3bそうですね。
1つ気を付けることは、 ===演算子で比較した場合は、 同値の時にTRUEを返すのに対し、
strcmp()関数を使った場合は、 同値の時にFALSEと評価される0を返すということです。
同値かどうかを判断するなら、 ===演算子の方が分かりやすいでしょう。
0037nobodyさん
2007/09/29(土) 23:31:02ID:YnYts4Cnスタックしてた
脳内で
吊って来る
0038nobodyさん
2007/09/29(土) 23:35:00ID:vw2Lts3b$printの中身を表示させるコードをforeachループの外に書いてしまうと、
最後の行が "a" と等しいか等しくないかしか分かりませんよ。
>>21の言いたいことは、 trimを使って改行を削除せよということでしょう。
0039nobodyさん
2007/09/29(土) 23:35:39ID:m/9bviMM例えばパスワード登録フォームってありますよね。他の人と同じパスワードを登録
しようとすると、現在そのパスワードは使用中ですとかって出ますよね。
そういうようなプログラムを実現したいのですが、素人目の判断ではなく実際の現場では
どのように記述されているのでしょうか
0040nobodyさん
2007/09/29(土) 23:37:03ID:m/9bviMMどうやら私の解釈がまちがっていたようです。失礼いたしました
0041nobodyさん
2007/09/29(土) 23:40:58ID:m/9bviMM0042nobodyさん
2007/09/29(土) 23:41:47ID:???> 実際の現場では
実際の現場?
パスワードを入力されたらそれをMD5などでハッシュ化しデータベースに保存。
チェック時は入力されたパスワードを再度ハッシュ化しデータベースを検索。
0043nobodyさん
2007/09/29(土) 23:43:11ID:m/9bviMMやっぱりパスワードとか扱う場合はテキストファイルじゃなくてデータベース使うんですね。
自分はMySQL入れています
0044nobodyさん
2007/09/29(土) 23:45:09ID:???ほとんどの場合データベースを使う。
テキストファイルはログ吐くぐらいにしかつかわない。
0045nobodyさん
2007/09/29(土) 23:47:40ID:???if(strstr($line, "a") === false){
print "等しくない";
} else {
print "等しい!";
}
今回は一文字だけど特定の単語が含まれるかどうかの判定もできる
0046nobodyさん
2007/09/29(土) 23:49:28ID:m/9bviMMみなさんありがとうございます。今日はもう休みますが、明日また続きを
やりたいとおもいます。
0047nobodyさん
2007/09/29(土) 23:55:23ID:???0049nobodyさん
2007/09/30(日) 01:22:21ID:???>>19
実はprint $error;をループの外に置いてて
ファイルの最後の行の結果で上書きされてた
ってオチじゃないの
0050nobodyさん
2007/09/30(日) 01:35:44ID:vTnMvhRC1スレッド1ファイルにするのと、1ファイルに全部まとめるのは
どちらがいいでしょうか?
ファイルが大量にあると鯖の動作にも影響でそうな気もしますし、
ログを1つのファイルにまとめると読み込むときに負荷が気になります。
0051nobodyさん
2007/09/30(日) 01:55:03ID:???0053nobodyさん
2007/09/30(日) 02:56:59ID:???一般的な個人のページだと、
スレッド式にしたところで年間に書き込まれる数なんて合計100レスいくかいかないだろ?
だからあんまこだわらなくてもいいんじゃないかね。
とはいえやっぱファイルを分けたほうが管理しやすいだろう。
保守性を考えた組み方をしたほうがいいよ。
まぁDBを使えないとか特殊な環境以外ではDBでやったほうがいいけど。
0054nobodyさん
2007/09/30(日) 03:25:14ID:???そのスレッドって各スレをageたりsageたりできるの?
1ファイルでやるとスレの順番の入れ替え表示は手間になるよ。
ログファイルを丸ごと配列に読み込める程度の量なら簡単だけど、
かなり分量が増えることを想定してるんでしょ?
あと、レスデータってスレごとにまとめるの?それとも行の頭にスレNo.でもつけて
単純にファイル末尾に付け足して表示のときにスレごとに集めるの?
レスの書き込みはやっぱ末尾にappendでやった方が簡単だし
出力時間が短くなる分、ファイルのクラッシュ率も低くなるけど、
スレのデータがファイル中に分散してると表示に手間食うよ。
0055nobodyさん
2007/09/30(日) 15:38:25ID:aR8s0UFr$ ./hoge.php
hello
Abort trap (core dumped)
hoge.phpの中身は以下のとおりです。
#!/usr/local/bin/php
<?php
echo "hello\n";
?>
"Abort trap (core dumped)"が出ないようにするためにはどうすればよいのでしょうか?
OSは、
$ uname -r
5.4-RELEASE-p6
です。
よろしくごきょうじゅ願います。
0056>>55
2007/09/30(日) 15:53:22ID:aR8s0UFrFreeBSD
となります。
0057nobodyさん
2007/09/30(日) 16:04:23ID:hOfwjY6s皆さん昨日はありがとうございます。今日も挑戦したいとおもいます。
$logs = file("dat.txt");
foreach ($logs as $log) {
$log = rtrim($log);
print $log;
if ($log == 'd') {
$print = '等しい';
} else {
$print = '等しいわけない';
}
}
print $print;
rtrimが入っているので前後の改行・空白は取り除けているはずなのですが、
比較するとどうも等しくないと出力されてしまう症状は変わりませんでした。
引き続きアドバイスをよろしくお願いいたします。
rtrimでは取り除けない改行文字が存在するということなのでしょうか?
0058nobodyさん
2007/09/30(日) 16:10:01ID:???0059nobodyさん
2007/09/30(日) 16:11:10ID:???rtrimって後ろの空白文字だけ削除でしょ。文頭に空白文字入ってるとか。
print "[".$log."]\n";
で$logの中身見れば?
もしくは$logの中身が'd'じゃなかったりw
0060nobodyさん
2007/09/30(日) 16:14:30ID:hOfwjY6sはい。いまちょっと進展があって理由はわからないのですが、なぜかこうすると正常に判断されます。
if(isset($_POST["md5"])){
$passwd=crypt($_POST["md5"]);
$input=htmlspecialchars($_POST["md5"]);
}else{
$_POST["md5"]="";
$input="";
$passwd="";
}
$error="";
print $input."<br>";
print $passwd."<br><br>";
$dat=$input."\r\n";
$file_handle = fopen("dat.txt", "r");
while (!feof($file_handle)) {
$line = fgets($file_handle);
echo $line."<br>";
if($line==$input){
$error="error";
}
}
fclose($file_handle);
if(!$error){
$file=@fopen("dat.txt","a") or die ("ファイル書き込みオープンエラー");
flock($file,LOCK_EX);
fwrite($file,$dat);
flock($file,LOCK_UN);
fclose($file);
}else{
print "使用中のパスワードです";
}
0061nobodyさん
2007/09/30(日) 16:15:48ID:hOfwjY6s失礼しました。両方の空白はtrimでした。
0062nobodyさん
2007/09/30(日) 16:18:08ID:hOfwjY6sdat.txtとひかくして等しくなければ書き込み処理を行うとすると正常に動作します。
0063nobodyさん
2007/09/30(日) 16:56:33ID:hOfwjY6s私の書いたものは動き的には21と大差ないとおもうのですが、なぜ21の文法で動かないのか理解出来ませんでしたが。こうしたら等しいと出ました。
dat.txtに改行して
a
b
c
d
e
f
g
と入れます。そしてcを比較すると等しいですと出ました。
$dat="";
$fp = fopen("dat.txt", "r");
while($str = fgets($fp)) {
// 文字列比較
$str = trim($str);
if ( $str == "c" ) {
$dat="等しいです<br>";
}
}
fclose($fp);
print $dat;
0064nobodyさん
2007/09/30(日) 17:00:01ID:hOfwjY6shttp://ml.php.gr.jp/pipermail/php-users/2004-April/021654.html
fileで一行ずつ取得しようが、fgetsで取得しようが動きは同じだと考えていたのですが
取得したときになにかあったのでしょう。(それが何かはわかりませんでしたが)
0065nobodyさん
2007/09/30(日) 17:35:07ID:Uem6Q7XY例で言うなら
<?php define("NAME","test") ?>
<html>
<body>
${NAME}
</body>
</html>
みたいな感じで。
0066nobodyさん
2007/09/30(日) 17:35:09ID:???>>21の、rtrimをtrimに、上書き防止用にelse文以下を削除、してもダメだった?
$msg="";
$logs = file(ファイルへのパス);
foreach ($logs as $log) {
$log = trim($log);
if ($log == 'a') {
$msg = '等しい';
}
}
print "[".$msg."]<br>\n";
>>18氏の書いてるように段階的にとにかく出力させて確認した方がいい気がする
0067nobodyさん
2007/09/30(日) 17:40:48ID:???つまりスペースを使ったパスワードに問題になる
0068nobodyさん
2007/09/30(日) 17:45:27ID:hOfwjY6sはい。66の通り試してみたのですがうまく動作しませんでした。
とりあえず、動いたので今度は暗号化したものをテキストファイルに書き込んで
パスワードの妥当性チェックに挑戦したいと思います。
0070nobodyさん
2007/09/30(日) 17:53:27ID:hOfwjY6sこれでパスワードをmd5ハッシュで暗号化してテキストファイルにかきこみ、これを比較することで使用中のパスワードか比較することができました。*まだサニタイズ等してないので当然このままのスクリプトでアップすることはできませんが。。。
//pass.phpから比較対象のパスワードを取得
//もしこのファイルが直接読み出された場合に$_POST["md5"]はなにもはいってないので初期化
if(isset($_POST["md5"])){
$pass=$_POST["md5"];
}else{
$_POST["md5"]="";
$pass="";
}
//変数の初期化
$error="";
//テキストファイルからデータを一行ずつ読み込み
$fp = @fopen("dat.txt", "r") or die("読み込みファイルオープンエラー");
while($str = fgets($fp)) {
// 文字列比較(trimで空白を削除)
$str = trim($str);
if ( crypt($pass,$str) == $str ) {
$error="error";
}
}
fclose($fp);
//もし$errorにerrorが入っていればそのパスワードは使用中。それ以外ならば使えるパスワード
if($error){
print "現在使用中のパスワードです<br><a href=\"pass.php\">戻る</a>";
}else{
//if条件を満たしていればファイルにパスワードを書き込み
$fp=@fopen("dat.txt","a") or die("追加書き込みオープンエラー");
fputs($fp,crypt($pass)."\r\n");
fclose($fp);
print "パスワードが登録されました<br><a href=\"pass.php\">戻る</a>";
}
0071nobodyさん
2007/09/30(日) 18:05:02ID:???$_POSTの$pass代入時にtrimしないと$str = trim($str)と整合取れない可能性あり。
$pass=trim($_POST["md5"]);
それと$_POST に代入させるのは止めた方がいい。
以後使用するなら移した$passで。
あと多分判ってるだろうけどパス未設定ならメッセージ出力して終了
0072nobodyさん
2007/09/30(日) 18:23:20ID:hOfwjY6sおおっと、ナイスアドバイスありがとうございます。
$_POSTの$pass代入時にtrimしないと$str = trim($str)と整合取れない可能性あり。
$pass=trim($_POST["md5"]);
の件については知りませんでしたので助かりました。
0073nobodyさん
2007/09/30(日) 19:03:56ID:hOfwjY6s勿論このままだと空白もパスワードとして登録されてしまいすので、空白は入らないように
しますよ。
0074nobodyさん
2007/09/30(日) 19:05:07ID:???その程度のスクリプトでcoreを吐くようじゃ環境に依存しているんで
自分で原因を追究するしかないんじゃないの?
#つか、これだけでわかる奴いるのかよ…
0075nobodyさん
2007/09/30(日) 19:18:44ID:???動作を把握できてなさ具合といい、プログラミングの基礎を固めるところから
やらないと後々苦労するんじゃないかと他人事ながら心配になる
0076nobodyさん
2007/09/30(日) 19:41:18ID:a9TKVxASphpでcURLというのが使えないんです。
どうやってインストールするのでしょうか?
0077nobodyさん
2007/09/30(日) 19:51:53ID:???>>1にも書いてあるけどマニュアルをまず読め
該当するページを読め
http://www.php.net/manual/ja/ref.curl.php
0078nobodyさん
2007/09/30(日) 20:56:19ID:a9TKVxASxamppでインストールされたのでphpのコンパイルって
どうやってやるんだろ?みたいな。
0079nobodyさん
2007/09/30(日) 21:36:10ID:4K+ZGFPDGDでは出来ませんでした。
imagemagickはレンタル鯖なので使えません。
教えてください。お願いします。
008179
2007/09/30(日) 21:43:46ID:4K+ZGFPDすみません。もうできねえやってあきらめて試したスクリプト消してしまいました・・・
せめてどの関数使うかだけでも教えていただけないでしょうか?
0082nobodyさん
2007/09/30(日) 21:52:06ID:???0083nobodyさん
2007/09/30(日) 21:52:32ID:???内容まったく見てないけど、こんなんでてきた
ttp://www.dabun-doumei.com/topix/imageConvertSource.php
008479
2007/09/30(日) 22:16:32ID:4K+ZGFPD0085nobodyさん
2007/09/30(日) 23:28:06ID:???http://www.php.net/manual/ja/ref.curl.phpから抜粋
Win32 ユーザへの注意: このモジュールを Windows 環境で使用可能とするには、
libeay32.dll および ssleay32.dll が PATH の通った場所に存在する必要があります。
これが理解出来ない頭の構造ってのを見てみたい
PHP本家のwindows用配布物に両dllは含まれているのに何故コンパイル?
xamppには含まれないならそんな物に頼るな
0086nobodyさん
2007/10/01(月) 10:43:50ID:nNJ7ChTVfopen("php://stdin", "r")
で、メールの内容を解析できますが、これは一体何なんでしょ?
メール送信しなくただ単にスクリプトを実行させただけでは、
中身が空っぽです。
ただ単にHTTPリクエストを受けたときに、その受けた内容を一時的に保存しているのでしょうか。
(それだと、普通にアクセスしても情報が残りそうですが・・・。)
0087nobodyさん
2007/10/01(月) 10:50:10ID:i+Hfwjq6それは標準入力取得。
スクリプトをSSHとかからコマンドで引数に何か与えて実行してみればわかる
php ./test.php "aiueo"
とかやれば"aiueo"が渡される
0088nobodyさん
2007/10/01(月) 10:52:51ID:nNJ7ChTVって書いたらPHPが動かなくなったorz
0090nobodyさん
2007/10/01(月) 12:16:45ID:???0092nobodyさん
2007/10/01(月) 12:53:17ID:???情報が欲しいログインするタイプのサイトへ
phpで自動化しようと思ったんですけど…
返ってきたHTTPレスポンスが
------------------------------
…サインインするには JavaScript が必要です
このブラウザでは JavaScript をサポートしていないか
現在スクリプトの使用が禁止されています。…
--------------------------------
と
これはもしかしてphpでは無理ですか?
0094nobodyさん
2007/10/01(月) 13:03:59ID:???0100nobodyさん
2007/10/01(月) 14:40:06ID:MMTKck5hphpinfoや設定ファイルを目視する以外にやり方ございませんか?
0101nobodyさん
2007/10/01(月) 14:42:47ID:???0102nobodyさん
2007/10/01(月) 14:43:33ID:???0106nobodyさん
2007/10/01(月) 15:51:28ID:???どこがちがうの?
>>1のテンプレに入ってるのにわけわかんね
だいたい質問以前の基本的なことができてないのに相手してもらえるわきゃないわな
0108nobodyさん
2007/10/01(月) 15:59:45ID:???おまえ頭固いな〜
こいつら全員基本的なことができてないだろーがよ
「おまえらまとめて>>1の基本的なことやってから質問しろ」って意味じゃねーの?
もうちょっと自分で考えてみろよ
■ このスレッドは過去ログ倉庫に格納されています