【PHP】下らねぇ質問はここに書き込みやがれpart18
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
2006/03/15(水) 19:18:21ID:yiOrS10Nここなら本スレで回答のないお前の下らない質問に回答があるかも知れません。
まず読め【PHP マニュアル】
http://www.php.net/manual/ja/
本スレ【PHP】質問スレッドpart33【php】
http://pc8.2ch.net/test/read.cgi/php/1140027592/
前スレ【PHP】下らねぇ質問はここに書き込みやがれpart17
http://pc8.2ch.net/test/read.cgi/php/1140786348/
過去スレは>>2-3あたり
0809nobodyさん
2006/04/03(月) 23:55:43ID:???32文字ぴったりで一致する文字列が「$str に含まれていると」TRUEなのか!
畜生!
0810805
2006/04/04(火) 00:02:00ID:???ご返答ありがとうございます。
申し訳ありません。重要な部分を抜かしていました。
以下のようにすれば希望の動作になるかと思われます。
(switchで理論演算ができるとした場合です。)
switch ($err){
case &1: echo "1のときのエラーメッセージ";
case &2: echo "2のときのエラーメッセージ";
・・・}
というように、break;を入れずにコーディングすればすべてのcaseと比較されますよね。
説明が足らず申し訳ありませんでした。
$errにはエラーによって既に1,2,4,8の和が入ってるので、$errを配列にしてしまうとまずくないですか?
foreach(array(1,2,4,8) as $b) if($err & $b) echo $message[$b];
$message[n] n=1,2,4,8 として、それぞれにエラーメッセージを入れればできますね。
ありがとうございます。
0811nobodyさん
2006/04/04(火) 00:03:43ID:???ほんとうにありがとうございました。
0812nobodyさん
2006/04/04(火) 00:05:43ID:???> 以下のようにすれば希望の動作になるかと思われます。
ならんでしょ。&1に該当した時点で以下全部実行されちゃうもの。
例えば1と8に該当するメッセージを出したい場合にswitchでどう処理すんの。
> すべてのcaseと比較されますよね。
最初に該当する場所が見つかった時点で以下は比較されません。
0813807
2006/04/04(火) 00:08:19ID:???あー。スマソ
err1とかのdefineじゃ一括処理はしにくいんで配列化したんだが
変数名がバッティングしてるとこまで気にしてなかった。
0814nobodyさん
2006/04/04(火) 01:07:13ID:???Invalid argumentって出ちゃう
0815805
2006/04/04(火) 01:08:10ID:???そうなのですか。それは知りませんでした。
一度真になった時点で、それ以下は真偽にかかわらず、
比較されずにすべて実行されてしまうのですね。
不思議な条件分岐ですね。浅学でした。ご指摘ありがとうございます。
>>813
私もややこしい文を書いてしまったので勘違いを招いてしまったのだと思います。
度々申し訳ありません。
$errに代入される数字は、1を除き2の累乗であることを思い出し考えつきました。
for($i=1; $i<=8; $i*=2) if($err & $i) echo $message[$i];
一般にはどのようなアルゴリズムでチェックをしているのでしょうか。
0816nobodyさん
2006/04/04(火) 04:13:56ID:???それを使いたいファイルの最初でinclude使って呼び出してるんですけど。
一度呼び出したら全てのfunctionを読み込んじゃうのですか?
それともfunction ()と書いた時点で該当functionのみが呼び出されるのですか?
0817nobodyさん
2006/04/04(火) 04:30:47ID:???日本語でぽk
0818nobodyさん
2006/04/04(火) 04:33:05ID:???>一度呼び出したら全てのfunctionを読み込んじゃうのですか?
「読み込んじゃう 」の意味が判らん。
同じファイルに複数のfunctionを記述してるなら、
そのファイルをincludeしたらメモリには「読み込んじゃう」よ。
ifで動的にincludeは、どうだったか忘れた。
0819nobodyさん
2006/04/04(火) 07:35:49ID:???お前が最初に書いた方法が一般的な方法だと思う
俺には無駄な方法とは思えないしこんな処理を簡略化しようとも思わないな
0822805
2006/04/04(火) 10:11:09ID:???そうですか。
あの方法はエラーが4パターンの場合ですが、
エラーのパターンがいくつもあった場合を考慮すれば、
すべてifですととても長くなってしまうと思いまして。
似通った部分をがあるとどうしても一つにまとめようとするタチなので・・・
たいして処理速度が変わるわけでもないですしね。
貴重なご意見ありがとうございました。
0823nobodyさん
2006/04/04(火) 10:58:46ID:???処理速度云々より、エラー発生時のメッセージ出力にバグが混入すると
最悪ケース時の保守効率が大きく落ちてしまって、致命傷になる場合がある。
単純なforeachくらいまでは許容できるが、数値演算のような手法は入れないのが吉。
0825nobodyさん
2006/04/04(火) 11:12:23ID:???元々そういう結果を返す関数があってそれを処理したいというならともかく。
$errを配列にしてエラーコードを順に格納するか、配列にしたくない場合は
「,」や「:」などの文字で連結するなどして、エラー内容を示す文字をセットして
それをループ→連想配列にセットしたメッセージを表示、とかにする。
その方が拡張性やメンテ効率が高くて扱いやすい。
0826nobodyさん
2006/04/04(火) 11:22:09ID:???3て返ってきたんだけどいつから6じゃなくなったんですか?
0827nobodyさん
2006/04/04(火) 11:27:01ID:???そりゃmbstring.func_overloadに2がセットされて
strlenでmb_strlenが呼び出されてないか?
0828nobodyさん
2006/04/04(火) 13:27:51ID:???今まで.phpの最後で常に mysql_free_result(); mysql_close(); exit; ってやってたのですが、
途中で mysql_close してその後も処理が長いのなら有効だけど、
最後におまじない感覚で付ける程度なら別にいらないですかね?
0829805
2006/04/04(火) 13:48:50ID:???安全性を考慮すれば確かにifが一番ですね。
ややこしくて見難くなるという欠点もありますし。
>>824
よく考えると余分な処理が入るので確かに遅くなりますね・・・
短くするということに拘りすぎていました。
>>825
特にプログラムに制約はありません。
ただやってみたいだけだというか、論理積で判別するということに感動してしまったので・・・
効率の良いコーディングというのはただコードを短くするだけではないのですね。
後々のメンテナンスのことやエラーを最小限にとどめること。これが肝心ですね。
アドバイスありがとうございます。
0830nobodyさん
2006/04/04(火) 16:19:31ID:???$a = 0.654338473287589
$a = sscanf($a,"%0.4f");
「Bad scan conversion character "."・・・」というエラーが出てしまいます
printfだと通るのでフォーマット部分は台状豚と思うのですが・・・
0831nobodyさん
2006/04/04(火) 16:42:38ID:???スクリプトの一番最後に記述するなら不要。
(PHPに自動で解放させた方が、見た目の処理時間は若干短くなる)
でも自分は気持ち悪いからcloseはしてる。freeは必要な時だけ(他の変数の場合も)
0832nobodyさん
2006/04/04(火) 16:55:23ID:???$a = 0.654338473287589;
echo intval($a * 10000)/10000 - intval($a);
0833832
2006/04/04(火) 16:57:03ID:???小数点以下だけの場合と勘違いした。
$a = 0.654338473287589;
echo intval($a * 10000)/10000;
0835834
2006/04/04(火) 17:06:01ID:???0836nobodyさん
2006/04/04(火) 17:18:57ID:???0837nobodyさん
2006/04/04(火) 17:20:46ID:???0838830
2006/04/04(火) 17:29:36ID:???ありがとうございます
すみませんちょっと言葉足らずだったようです○凹
具体的には小数点以下二桁までの%表示が目的でした。(0.65438・・・であれば65.43%というように)
ifやらsplitやら駆使すればいけるとは思うんですが、勉強中の身なのでスマートな方法を模索してました・・・
0841nobodyさん
2006/04/04(火) 18:54:02ID:???そうなんですよ。気持ち悪いんですよね
mysql_close();
exit;
と決まり文句のようにスクリプトの最後に付けてましたが、
実行速度面で差が出るならなくしたほうがスマートですね。
0842nobodyさん
2006/04/04(火) 19:07:04ID:???差が出ると言ったのは、その一行分をパースする時間の差のことだろ。
あくまで“差があるか無いかで言えば”ベースの話なんだから、実際には差なんて無いよ。
それより、プログラムを書く者として、自分で獲得したリソースを自分で解放するクセは付けた方がいいんじゃないかと思うよ。
それはすなわち、今どんなリソースが開かれてるかを意識するってことになると思う。
でないと、肝心なときにリソースリーク出しちゃうよ。
0843nobodyさん
2006/04/04(火) 19:07:07ID:mQslQj05正規表現の検索文字列が*だったりすると
エラーが出てしまいます。
mb_eregi(): mbregex compile err: invalid regular expression; there's no previous pattern, to which '*' would define cardinality
エスケープするのに、エラーが出る文字をいちいち探すのが大変なので
どこかに一覧とか有りますでしょうか。
0844nobodyさん
2006/04/04(火) 19:16:29ID:???0845nobodyさん
2006/04/04(火) 19:46:43ID:???いや、差があると言ったのは「見た目」の話。
出力を先にやってリソースの解放を後回しにできるので
例えばHTTPの出力を受け取る側から見ると若干レスポンスがよい。
(出力バッファの噛ませ方にもよるので一概には言えないけど)
>それはすなわち、今どんなリソースが開かれてるかを
>意識するってことになると思う。
だね。
0847nobodyさん
2006/04/04(火) 22:35:01ID:ERhiveKKttp://project-p.jp/halt/anubis/blog_show/549
この人はそんなにすごいんか?
0850nobodyさん
2006/04/05(水) 00:37:57ID:???そういうスキル低くても使えるように設計された言語ってのもあるけどな。
0851nobodyさん
2006/04/05(水) 00:49:25ID:???別にそんなにカチンとくるようなことは書いてなかったけど?
コミュニティの規模で言うと英語>日本語は当たり前だから、
その中のアホ(褒め言葉)な香具師の数も英語>日本語なだけ。
0854nobodyさん
2006/04/05(水) 08:27:45ID:???たった一行のこのスクリプトに脆弱性はありますか?
あれば具体的にどういった方法による攻撃が可能か教
えてください。(単なる知的探究心)
0855nobodyさん
2006/04/05(水) 09:00:46ID:NCTGlvjg可能性があるとすれば、USER_AGENT にとてつもなく長い文字列が渡された時とか、
あるいは通常は含まれない文字が含まれている場合(\0 とか)に何か起こるかもしれない。
もしバッファオーバーフローによる脆弱性があるならば、USER_AGENT に何らかのコードを埋め込むことにより、
PHP の実行権限の範囲で任意のコマンドなどを実行できる可能性がある。
けど、そういうのはスクリプト自体の脆弱性とは言わないと思うよ。
スクリプトに脆弱性があるってのは、たとえば $_SERVER['HTTP_USER_AGENT'] をそのままSQLに埋め込んで
実行しちゃうようなコードについて言うんだと思う。
その点から言えば、そのスクリプトには脆弱性は無さそうだ、と言えるんじゃないかな。
0856854
2006/04/05(水) 09:08:56ID:???なるほど。たった一行のスクリプトにもそんな問題点(厳密には言語依存の)があるん
ですね。非常に興味深いです。
SQLを発行したりする動作は、チェックを怠れば簡単に脆弱性を生んでしまうのであえ
て記述しなかったのですが、print命令一個でも弱点をつかれると危険かもしれません
ね。
ご回答ありがとうございました。
0857nobodyさん
2006/04/05(水) 09:25:16ID:???0859nobodyさん
2006/04/05(水) 09:36:09ID:???でもサーバの負荷が高まってる場合にもそうだとはいえない。
マメに開放できる部分は開放したほうが、アクセス集中しているときの
処理は裁けるだろ。
0860855
2006/04/05(水) 09:37:29ID:???もし >>854 の出力がブラウザに対してのものならば、USER_AGENT にタグを埋め込むことにより悪用できるね。
その場合には、そのスクリプトは脆弱だと言えるのかな。
0861nobodyさん
2006/04/05(水) 09:42:38ID:???>>855
>>856
シンプルな例だと、USER_AGENTがそのサイトのID、パスワードを入力させる
FORMのHTMLで、POSTの送信先が攻撃者の影響下のサーバだっら、ログイン情
報筒抜けになる。この場合だとID盗みたい相手のUSER_AGENT変えなきゃならんが、
容易に変えられるブラウザもあるし、変えた状態でそのブラウザ再配布することだっ
てできる。
もちろんこれは単純な例で、Javascriptとか組み合わせてもっと複雑なこと仕掛ける
事だって可能。
0865nobodyさん
2006/04/05(水) 18:39:28ID:???どんな方法があるでっしゃろ?
0866nobodyさん
2006/04/05(水) 18:47:45ID:???0867nobodyさん
2006/04/05(水) 20:10:33ID:NCTGlvjgスクリプトでメールを受信する方法について聞いてるの?
だったら、POP を話すスクリプトを書くか、.forward や .qmail 等で受信メールをスクリプトに引き渡すようにするといいんじゃないかな。
0868nobodyさん
2006/04/05(水) 20:50:49ID:???0869nobodyさん
2006/04/05(水) 21:24:22ID:???アクセスしてページ内容を取得し、商品の値段とかランキング順位とかを自動で得たいんですけど、
ページ内容の取得ってどうやればいいのでしょうか・・・。
(これってつまり、検索エンジンとかのクローラーを作るのと同じ原理??)
ど素人過ぎて質問がおかしいかもしれませんが、どなたかヒントをください。
0873872
2006/04/05(水) 21:53:56ID:???すまそ
0875nobodyさん
2006/04/06(木) 00:40:20ID:???>$_SERVER['HTTP_USER_AGENT'] をそのままSQLに
普通にやってるけどなぁ。
リスクとコスト、天秤にかけて、それをしなければならないケースなんてそんなにないんじゃね?
つか、漏れはそんなシビアな仕事は一生無縁だし、やりたいとも思わんな。
0876nobodyさん
2006/04/06(木) 00:45:01ID:???いや、いくらなんでもmysql_escape_string()くらいはかけてSQLに入れるでしょ。常識的に。
0878nobodyさん
2006/04/06(木) 02:21:51ID:???はい、>>473からの流れを参考にやってみましたが、
アマゾンのページからは情報を取得できません。
ちなみに、他のサイトからは取得できたので、アマゾン側で何かしらクローラーみたいなのを
弾くようになっているのでしょうか??
AWSは、たかがこれだけのために登録するのも面倒で・・・
(ある一つの商品を自動で一週間くらいチェックしたいだけなんです)
0880nobodyさん
2006/04/06(木) 02:45:52ID:???これを
http://hogehoge.com/hoge/a/1234/
↑こんな感じにしたサイトをよく見ますが、
このやり方に名称があれば教えてください。
または、やり方を教えてください。
0881nobodyさん
2006/04/06(木) 03:22:57ID:???ユーザエージェントで弾いてんじゃね
と勝手な予想
php5 なら file または file_get_contents でUserAgentをいじれるみたいだけどね
0882nobodyさん
2006/04/06(木) 03:37:09ID:???特にしてない。勿論通常のナビゲーションでは色々やってるけど
<?php var_dump(file('http://www.amazon.co.jp/exec/obidos/ASIN/456966427X')); ?>
教科書的な書籍とかで、もう少し基礎力つけてチャレンジしたら?
0883nobodyさん
2006/04/06(木) 04:07:45ID:???0884nobodyさん
2006/04/06(木) 04:55:30ID:tcJKbNjsと記述すると一番後ろのHTMLの「>」がHTML上で文字として表示されてしまいます。
何故でしょうか?どのように記述すれば解決しますか?
0885nobodyさん
2006/04/06(木) 05:01:28ID:???0887nobodyさん
2006/04/06(木) 05:47:16ID:???あれ・・・ホントだ・・・
「file_get_contents」にこだわってて、なんで出来ないんだろ?って
思ってたら、「file」だとページの内容を取得できますね・・・。
でもアマゾン以外のサイトでは「file_get_contents」でも内容を取得できたのに、
なぜアマゾンだけは出来なかったんだろう? そしてなぜ「file」なら成功したんだろう??
大垣リファレンス本をいくら読んでもど素人な俺にはサッパリわかりません。
0888nobodyさん
2006/04/06(木) 05:50:24ID:???13<>ほげほげ<>ほげほげ<>
12<>ほげほげ<>ほげほげ<>
11<>ほげほげ<>ほげほげ<>
というような文字列の中から
12<>ほげほげ<>ほげほげ<>
だけ取り出したいとします。その場合
12<>(.)+
で取得できるのですが
012<>ほげほげ<>ほげほげ<>
112<>ほげほげ<>ほげほげ<>
このような文字列も取得してしまいます。
上記なような文字列が含まれる中
12<>ほげほげ<>ほげほげ<>
だけ取り出すにはどのように記述すれば良いのでしょうか。
0889888
2006/04/06(木) 05:53:57ID:???0890nobodyさん
2006/04/06(木) 05:55:52ID:???勉強がてらやろうと思ったら、思ったより時間がかかった・・
まぁ、趣味でやったので必要なくても構わないけどね・・
もっとこうしたらっていうのは腐るほどあると思うので前向きなアドバイスは頂けたら嬉しいです。
-------------------------------------------------
header("Content-Type: text/html;charset=Shift_JIS");
mb_detect_order(SJIS);
print "encode:" . mb_detect_encoding("新渡戸 稲造") . "<br>";
print "新渡戸 稲造" . "<br>";
$search = "新渡戸 稲造";
$search = mb_convert_encoding($search,"UTF-8","SJIS");
$search = urlencode($search);
print "エンコード後文字列:<br>" . $search . '<br><br>';
$search = urlencode($search);
$url = 'http://www.amazon.co.jp/exec/obidos/search-handle-url/index=books-jp&field-author=' . $search . '/';
print "アクセスするURL:<br>" . $url . "<br><br>";
$content = file_get_contents($url);
var_dump($content);
-------------------------------------------------
0891nobodyさん
2006/04/06(木) 07:35:01ID:???mod_rewrite
か
content negotiation(MultiViews) + path info
0892nobodyさん
2006/04/06(木) 08:24:49ID:???<?php var_dump(file_get_contents('http://www.amazon.co.jp/exec/obidos/ASIN/456966427X')); ?>
別に問題なく取れる。まあ中でやってること一緒だし。
上手くいかないスクリプトとURL(上手くいかない別のページので良い)晒してみ。
0894nobodyさん
2006/04/06(木) 09:12:14ID:tcJKbNjssprintfのようにデータを成形して
文字列変数に代入できる関数はありませんか?
0898894
2006/04/06(木) 10:05:03ID:???0899nobodyさん
2006/04/06(木) 10:22:27ID:n7Il5xOBどちらが良いのでしょうか?
0901nobodyさん
2006/04/06(木) 10:32:01ID:iRMo+Utmpreg_ の方がパフォーマンスがいいというのがどっかに書いてあったと思った
0903nobodyさん
2006/04/06(木) 11:05:23ID:???サンプルで正規表現使ってないのかもしれないが
if (strpos( $var, "hoge") !== false)のほうがはるかに速いと思われる
0904nobodyさん
2006/04/06(木) 11:57:37ID:???実際のとこSQLインジェクションを実際に食らうケースが
ほとんど無い&狙ってやるような外基地が来たら諦めた方が早い
ってのがリスクとコストを天秤に、の話だとは思う。
だけどそれ以前の問題として、USER_AGENTって
たまに顔文字入れてたりするバカがいる(案外多い)ので、
「'」を含んでてそのままだとSQLがエラーになったりするのな。
そういう、一般ユーザレベルのトラブルとクレームを防ぐ目的から
その手の外部から取得するデータをエスケープするのは
「当たり前」という感覚にしとかないと、ごく普通の仕事でも
「とても金を払えるレベルの品質じゃない」という烙印を押されるのよ。
0905nobodyさん
2006/04/06(木) 13:00:26ID:???「アクセスログを徹底的に取っています」と言われているみたいで、忍者のアク解並みにムカつく。
0906nobodyさん
2006/04/06(木) 13:30:52ID:???禿るぞ
レス数が900を超えています。1000を超えると表示できなくなるよ。