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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/09/29(土) 18:35:56ID:YlkpEUW6
まず読め→【PHP マニュアル】http://www.php.net/manual/ja/
PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、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カテゴリ)の各スレで


0756nobodyさん2007/10/10(水) 09:44:17ID:???
DBのエスケープ入出力関係は一昔前に万能クラスを作ってから気にしてないな、
今は抽象化レイヤがトレンド?
0757nobodyさん2007/10/10(水) 09:48:50ID:???
データ量の増加よりもリスク回避の方が優先だと思うし何より出力する度にエスケープする
というのが効率良く思えないんだけどな。効率など考えない企業向けなら何処で何をしようが
関係ないだろうけどw。
0758nobodyさん2007/10/10(水) 09:51:28ID:???
DBに入れる以前の問題として、エスケープしないといけないようなものを
画面で入力可能にしているのが諸悪の根源だよ。
0759nobodyさん2007/10/10(水) 09:53:09ID:???
>>755
そういうのはエスケープして当然
それ以外は生で入れるべき
0760nobodyさん2007/10/10(水) 09:54:21ID:???
>>758
バカ?
0761nobodyさん2007/10/10(水) 09:54:56ID:???
生発言もわからん事はないけどそのぬるさが情報流出に繋がったケースも多いい。
完璧だと思い込んでいる奴が墓穴をほるケースだわ。
0762nobodyさん2007/10/10(水) 09:55:22ID:???
バレなきゃ、何しても構わんみたいな発想で共感はできんな。
0763nobodyさん2007/10/10(水) 09:55:44ID:cLvYq00J
みなさんPHPは秀丸とかEmとかテキストとかで手書きなの?
0764nobodyさん2007/10/10(水) 09:57:13ID:???
>>762
今時モラルなんて期待しちゃいかんよ。
0765nobodyさん2007/10/10(水) 09:58:50ID:???
エスケープもしないで生でDBに突っ込むってやつは、
100%ユーザーのIDやパスワードも生で入れるタイプ。
0766nobodyさん2007/10/10(水) 10:06:57ID:???
>>765
IDは生でパスワードは暗号化しているんだけど
IDも暗号化して入れたほうがいいの?
0767nobodyさん2007/10/10(水) 10:09:28ID:???
>>766
シングルクオート使ってるIDはエスケープするだろ?
誰も暗号化とは言ってないぞ?
0768nobodyさん2007/10/10(水) 10:12:03ID:???
IDにクォートを使わせている人なんているのか・・・
0769nobodyさん2007/10/10(水) 10:12:04ID:???
>>767
すまん、早とちりした
てか、IDとパスワードはエスケープしないで使える文字を限定しているわけだが
それでもエスケープって必要なのかな
正規表現でa-zA-Z0-9\-_で弾いてる
0770nobodyさん2007/10/10(水) 10:15:05ID:???
使える文字がa-zA-Z0-9\-_だけならエスケープする必要ないだろw
0771nobodyさん2007/10/10(水) 10:15:53ID:???
IDとパスワードは、情報流出のためにするものだろ。
エスケープの目的とは全然違う。
まぁ、エスケープもしないというやつはセキュリティーに無関心だから情報流出についても無関心だと思うが。
0772nobodyさん2007/10/10(水) 10:18:27ID:???
何が困るって引継ぎの時が一番困るんだよ
書き方がかわるだけで穴が出来てしまう
0773nobodyさん2007/10/10(水) 10:19:10ID:???
A.保存するときそのまま入れる場合
DBから取り出すときは毎回htmlspecialcharsをかける

B.保存するときhtmlspecialcharsかける場合
DBから取り出すときはそのまま出力できる

どっちが効率的かと言ったらBだと思うけど。
0774nobodyさん2007/10/10(水) 10:20:42ID:???
げ、もしかしてPEARのDBライブラリ使うときに
SQL文エスケープしないとまずい?
今まで自動でしてくれるもんだと思ってたんだが・・・
0775nobodyさん2007/10/10(水) 10:23:46ID:9QH/UxMS
mysql_escape_string
pg_escape_string
0776nobodyさん2007/10/10(水) 10:32:00ID:???
バックエンドにRDBMSを据えた電子掲示板で'や"をエスケープせんとその文字使えない
つか、文字列に'を含んだSQL投げた時点でRDBMSに蹴られるやん
詰まるところクォーテーション使いたいからキチンと処理しとるで
0777nobodyさん2007/10/10(水) 10:34:28ID:???
>>776
保存するときhtmlspecialcharsかけない人って
magic_quotes_gpc = Onにしてるのかな?
まあたしかにOnにしてると生データ入れられるな。
でもmagic_quotes_gpc = Offが推奨なんだよな。
0778nobodyさん2007/10/10(水) 10:41:00ID:???
>>777
いや、普通保存するときにかけるのはmysql/pg_escape_stringであって
htmlspecialchars使う人は表示以外にデータを使わないと最初から決めてる人。
magic_quotes関係ない。
0779nobodyさん2007/10/10(水) 10:42:31ID:???
htmlspecialcharsってHTMLの特殊文字をエスケープするヤツなんだから
HTMLを出力するときに掛けるのは当然。
DBに入れるときにはDBの特殊文字をエスケープするのが当然。
DBに入れるときにhtmlspecialchars使うのはおかしい。
たまたま上手くいってるってだけだ。

0780nobodyさん2007/10/10(水) 10:46:33ID:???
magic_quotes_gpc = Onにしててもバックスラッシュでエスケープした文字だけやろ
Don't → Don\'t こんな文字列もらってもRDBMSには突っ込めんよ?
少なくとも俺の使ってるRDBMSでは駄目
普通に手抜けるんだからhtmlspecialchars通しておけばいいんでないの?
RDBMSから生のデータ引っ張り出した時はガックリくるかもしれんけど
0781nobodyさん2007/10/10(水) 10:47:59ID:???
DBに入れるパスワードは暗号化じゃなくてハッシュ化だろ
暗号化っていうと復号できるみたいなニュアンスあるから誤解をまねく
>>758のいってることはごく自然だと思うんだけどな
SQLインジェクションにつながるものはバリデータではじくもしくはエスケープして入れる
XSSにつながるデータは直接いれて出力時にエスケープする
ていうのが定説だと思うんだけど
なんでもかんでもhtmlspecialcharsすればいいっていうわけではない気がする
0782nobodyさん2007/10/10(水) 10:54:00ID:???
>>779はhtmlspecialchars使うのはおかしいと言ってる
>>780はhtmlspecialchars使うのは正しいと言ってる
うーん・・・
0783nobodyさん2007/10/10(水) 10:55:20ID:???
>>782
場合によって使い分けろということで解決するんじゃね?
0784nobodyさん2007/10/10(水) 10:57:57ID:???
結局出力時に適切な形で出力できればいい
0785nobodyさん2007/10/10(水) 10:59:25ID:???
目的と効率の差みたいな感じで意見が分かれてるだけかな。

私は効率だからPOSTであがってきたデータはhtmlspecialcharsしている事が多いい。
書き込みより読み込み回数の方がたいてい多いいしな。
0786nobodyさん2007/10/10(水) 11:04:14ID:???
お前らは、腐ったものでも冷蔵庫に入れて保存して、
取り出す時に調べれば良いっていうことかww

ダーティーなデータをDBに保存することに違和感を持たない感覚って、
プロとしてダメダメだよ
0787nobodyさん2007/10/10(水) 11:04:57ID:???
しかし
> DBに入れるときにはDBの特殊文字をエスケープするのが当然。
> DBに入れるときにhtmlspecialchars使うのはおかしい。
> たまたま上手くいってるってだけだ。
これも納得できる。
htmlspecialcharsではなくmysql_real_escape_stringを使うべきなのだろうか?
0788nobodyさん2007/10/10(水) 11:08:03ID:M9anXW7v
PHPで変数が undefined な状態を調べることってできますか?
isset()ではnullがセットされたものもtrueとなってしまいます。
0789nobodyさん2007/10/10(水) 11:10:54ID:???
>>788
strlen
礼はいらん
0790nobodyさん2007/10/10(水) 11:13:50ID:???
htmlspecialcharsではなくmysql_real_escape_stringを使うべきな気がしてきた。
0791nobodyさん2007/10/10(水) 11:14:46ID:???
>>786
いやいや、割り切りだよ割り切り。
Windowsアプリケーション等では insert文投げる時にトラブルの種になる文字は
禁則文字として「使わないでくださいね」って釘打っておけば納得してもらえるの。
ところがWebの場合、「これ、使えません」っていうと「なんでや?他んところは
使っておるやないかボケ!!」って聞き入れない。
ま、つまんねえとこで意地張ってもしょうがないじゃん。
0792nobodyさん2007/10/10(水) 11:16:16ID:???
だからどの時点でやるべきなのか、効率が良いのかの違いだけだよ
出力する時に50項目*1000ループhtmlspecialcharsを実行するのか、
それともあがって来たデータそのものに一度だけhtmlspecialcharsを
実行するのかの違いだけ
0793nobodyさん2007/10/10(水) 11:22:00ID:???
htmlタグを含んだTEXTフィールドはどうしてる?
タグと本文を正規表現で分けて処理すんのかな?
0794nobodyさん2007/10/10(水) 11:22:12ID:???
>>782
779は正統派、780はやや邪道だが目的は満たしてるし手抜きもできていいと言ってる。
0795nobodyさん2007/10/10(水) 11:25:16ID:???
>>792
考え方としては毎回動的に画面を生成する掲示板等と
更新時に静的HTMLを生成してしまうblog等との違いと一緒だよな。
それがより効率を上げ性能を向上させるものなら
多少の非汎用化も許容される場合がある。
もちろん、常時内容が変化するようなシステムなら
元になるデータだけ持っておいて毎回動的生成すべきだろう。
0796nobodyさん2007/10/10(水) 11:33:16ID:0neE8nHZ
はじめまして

自分はサイト運営をしているのですが、PHPを使ったページで

Warning: main(db/.php): failed to open stream: No such file or directory in /home/webmaster/public_html/link/yomi.php on line 21

Fatal error: main(): Failed opening required 'db/.php' (include_path='.:') in /home/webmaster/public_html/link/yomi.php on line 21

とエラーが出てきてしまい使えません。
誰かPHP等に詳しい方、対処方法を教えていただけませんか
0797nobodyさん2007/10/10(水) 11:35:02ID:???
>>788
無いんじゃないかな…
なんせ
$a = NULL;
var_dump(is_scalar($a));
の結果が「bool(false)」になるくらいで、
NULLを格納した値はPHP上では「未定義変数」の扱いになってる。
決してNULLという値が格納されたスカラー変数ではないのよ。
0798nobodyさん2007/10/10(水) 11:35:24ID:???
典型的な夏厨な質問だな
何でmail()なんて使おうと思ったの?
0799nobodyさん2007/10/10(水) 11:35:49ID:???
779の補足
効率の話は全く考えてなかった。どうすべきか、という意味で779を書いた。
表示の度にhtmlspecialcharsを掛ける負荷をなくすという目的なら
htmlspecialcharsをかけてDBへ保存すれば良い。
でも、だからといってDB固有のエスケープを掛けないで良いという事じゃない。
htmlspecialcharsを掛けてさらにmysql_real_escape_stringなどをかける。
0800nobodyさん2007/10/10(水) 11:36:27ID:???
>>796
db.phpが無いんだからdb.phpを該当ディレクトリにアップロードすればいい。
0801nobodyさん2007/10/10(水) 11:37:36ID:???
>>800
それ釣りだよw
何度も出てる
0802nobodyさん2007/10/10(水) 11:37:54ID:???
>>796
Yomi-searchのマニュアル読んでちゃんと設定すればいい。
設定しなきゃ動かんよ、それ。
0803nobodyさん2007/10/10(水) 11:38:12ID:???
Bamcompile使ったがPEAR使えないのな・・・
0804nobodyさん2007/10/10(水) 11:38:45ID:???
mysql_real_escape_stringと同等の関数を有していないDBMSは無視ですか?
0805nobodyさん2007/10/10(水) 11:39:48ID:???
>>804
たとえば?
0806nobodyさん2007/10/10(水) 11:40:14ID:???
>>801
100%釣りだよなw
0807nobodyさん2007/10/10(水) 11:41:54ID:???
>>788
<?php
$a = 100;
$a = null;
if (!isset($a)) {
  echo "empty!\n";
}
?>

emptyって表示されたけど・・・。
0808nobodyさん2007/10/10(水) 11:46:45ID:???
779は正統派だと思っていたが

例えば文字列 Don't をそのままDBに入れる人は
DBから文字列 Don't を取り出せないじゃないか!
保存するときhtmlspecialcharsかけるのが正統派だ
0809nobodyさん2007/10/10(水) 11:47:23ID:???
>>805
mysql以外のDBMS
08107962007/10/10(水) 11:51:12ID:0neE8nHZ
残念ながら釣りではないです。
回答頂いた方ありがとうございます
色々と調べてみます
0811nobodyさん2007/10/10(水) 12:01:35ID:???
つーかなんでプリペアドステートメントとか使わないの?
htmlspecialcharsとかaddslashesすりゃ良いって人よく見るけど
それぞれ用途があるんだからそれぞれの用途に合ったものを使うべき

DBに突っ込む時にhtmlspecialcharsとかしとけば表示の時楽だが
生データじゃないので再利用性が落ちるし
こういう人に限って表示の時も
再度htmlspecialcharsをしたりと言う場合が多い気がするんだけど?
0812nobodyさん2007/10/10(水) 12:04:34ID:???
MT4の重さは異常、調べたらDB設計が糞だったw
0813nobodyさん2007/10/10(水) 12:06:56ID:???
>>811
やり方はともかく一貫性は大切〆。
0814nobodyさん2007/10/10(水) 12:11:05ID:???
>>808
取り出せるだろ・・・
0815nobodyさん2007/10/10(水) 12:14:54ID:???
>>814
SELECT * FROM table WHERE moji = 'Don't'
これじゃ取り出せないよなあ?
どうやって取り出すよ?
0816nobodyさん2007/10/10(水) 12:16:11ID:???
>>815
おまえ頭悪いだろwwwww
0817nobodyさん2007/10/10(水) 12:16:58ID:???
釣りだろ、読み出す前に入れれないだろw
0818nobodyさん2007/10/10(水) 12:18:44ID:???
>>816
俺みたいな頭悪いやつに頭悪いだろと言っても意味ねーんだよ
で?どうやって取り出すよ?
とりあえず答えてから貶せ
0819nobodyさん2007/10/10(水) 12:19:49ID:???
>>815
ちょっと笑っちまったじゃねーか
insertだろうがselectだろうが、SQL文に入れる文字列はエスケープ掛けるんだよ。
$sql = "SELECT * FROM table WHERE moji = '" . mysql_real_escape_string("Don't") . "'"


0820nobodyさん2007/10/10(水) 12:20:02ID:???
>読み出す前に入れれないだろw

釣りか?入れれるだろw
0821nobodyさん2007/10/10(水) 12:20:55ID:???
>>820
815のお頭ならって話だよw
0822nobodyさん2007/10/10(水) 12:32:14ID:???
>>811
prepareにしろescape処理の関数にしろ至れりつくせりのDBMSなら何も問題ない
しかしPHPでサポートされてるDBMSって全てが横並びで標準実装ってわけでない
某SQLServerみたいに見放された(?)感のあるDBMSすらある
PDOに移行すれば救われるのかもしれないけど native driver がこれまた将来に
渡って保証されていない物もある
しょうがないから妥協している箇所を否定されたら何もできないよ
08237882007/10/10(水) 12:40:36ID:M9anXW7v
>>797
ん〜、もはや変数にもならないんですね。
ちょっと不便だなぁ。PHPらしい簡易化による不便さですね・・・。

>>807
ごんめんなさい、質問文が間違えてtrueとfalseが反対になってました。
0824nobodyさん2007/10/10(水) 12:40:37ID:???
>>822
prepareはともかくescapeなんて、sqlserver_escape_string()みたいな関数1個作ればいいだけでしょ?
そんなに悩むこともない気がするんだが。
0825nobodyさん2007/10/10(水) 12:45:33ID:???
>>819
htmlspecialcharsとmysql_real_escape_string両方使ったら取り出せなかった。
htmlspecialcharsをコメントアウトしたら取り出せたorz
0826nobodyさん2007/10/10(水) 12:46:09ID:???
>>825
何回エスケープするんだよ
0827nobodyさん2007/10/10(水) 12:47:20ID:???
何の処理をしているのかわかってないらしいw
0828nobodyさん2007/10/10(水) 12:50:11ID:???
>>822
将来の話なんて出すべきもんじゃないだろ
PDOじゃなくてもPEARとかのライブラリ類もあるし
動作的に同じであれば良いんじゃないの?
0829nobodyさん2007/10/10(水) 12:55:41ID:???
>>827
だからいちいち貶すだけのレスはやめれ
わかってないから聞いてんだよw
0830nobodyさん2007/10/10(水) 12:59:23ID:???
あれ?
DBに入れる際には、mysql_real_escape_string
HTMLに出力するときには、htmlspecialchars
じゃないの?
0831nobodyさん2007/10/10(水) 13:01:13ID:???
>>829
質問するという意思があるの?
じゃあなんでID出さないの?
0832nobodyさん2007/10/10(水) 13:11:14ID:???
>>831
わかったよ。ID出さないから答えなくていいよ。
じゃあこの話は終了ね
0833nobodyさん2007/10/10(水) 13:12:29ID:???
ID出さずに逃げたwwwwwwテラチキンwwwwwwwww
0834nobodyさん2007/10/10(水) 13:15:00ID:???
↑
こういうのがうざいんだよなぁ

ちなみに「htmlspecialchars() だけでは不十分」らしいな
0835nobodyさん2007/10/10(水) 13:59:21ID:???
データベースで$categoryの中に1,2,3,4とか数値を入れてるのですが、
$category=1に該当するデータ数を出すにはどう書けばいいですか?
0836nobodyさん2007/10/10(水) 14:03:30ID:???
>>835
スレ違い
0837nobodyさん2007/10/10(水) 14:09:10ID:???
>>835
クエリーでやるとこんな感じだけど
SELECT count(category) FROM category_table WHERE category='1'

まぁどんなやり方してるかにもよるし
出そうとしてる部分のソースださんとどーにもならん
0838nobodyさん2007/10/10(水) 14:30:15ID:zc/CFV7a
クラスで宣言していない変数にアクセスしたときに
参照はエラーにできると思いますが
書き込みのときにも
エラーを発生させる方法はないでしょうか?


class Hoge {
public $v1;
}

$h = new Hoge();
$h->v1 = 1;
$h->v2 = 2; //ここでエラーを発生させたい

0839nobodyさん2007/10/10(水) 14:44:39ID:???
レスが乱発しているから、まとめておく。話を混同しすぎだよw

'→DBの予約語→DBに入れる前にエスケープする
<>&→HTMLの予約語→HTMLを出力する前にエスケープする
\aなど→システム特殊文字→システムのフロント処理の所で削除
�@など→機種依存文字→システムのフロント処理で警告メッセージ
0840nobodyさん2007/10/10(水) 14:47:19ID:???
__setを定義

まぁもっとスマートな方法あったような気がするが忘れた
0841nobodyさん2007/10/10(水) 14:57:04ID:???
思ったんだけどさ、__set、__getを使えば
PHP4でもプライベート変数とか使えるんじゃね?

まあパフォーマンスは落ちるが、
それは開発時だけそうやっといて
運用時ははずすと言う方向で。
0842nobodyさん2007/10/10(水) 15:00:55ID:???
>>841
__set,__getってphp5からじゃ?
まぁデストラクタはつけれるけど
0843nobodyさん2007/10/10(水) 15:13:12ID:???
>>842
__callも含めて使えるよ。overloadを調べよう。
0844nobodyさん2007/10/10(水) 15:21:58ID:???
あー、メールトリガーで自動返信してたらメールが無限ループした、まじうざい
0845nobodyさん2007/10/10(水) 15:26:28ID:???
>>843
thx
こんなのあるのか・・・
毎回定義するの面倒ではあるが・・・
0846nobodyさん2007/10/10(水) 15:54:13ID:???
Overloadableとかいう名前のクラスを継承して
そこのコントラスタに書けばいいだけさ。

php4とphp5の仕様の違いが嫌?
ならそれを吸収するコードを書けばいいだけさ。

そんなコードを各のが嫌?
ならそれをサポートしているライブラリ・フレームワーク等を
使えばいいだけさ。
0847nobodyさん2007/10/10(水) 16:16:17ID:???
>>840
これって838へのレス?
それじゃ防げなくないか?
0848nobodyさん2007/10/10(水) 16:43:03ID:5Clc9AoY
データベースに
大阪府|東大阪市|中小阪|三丁目|6

のように格納されてるんだけど、
住所検索で「大阪府東大阪市中小阪3-6」
みたいな感じでもHitさせたいんだけど何かよさそうな方法はありませんか?
0849nobodyさん2007/10/10(水) 16:57:33ID:???
>>848
すぐに思い付くのは、

1. データの重複を承知で連結されたカラムを追加する。
2. 検索時のオーバーヘッドを承知でSELECT時に連結して検索する。

くらいかな。
0850nobodyさん2007/10/10(水) 17:00:06ID:5Clc9AoY
>>849
サンクス

GoogleMapやGeocodingみたいに
「おおさかふ」で大阪が検索されたりするのは
相当な技術のアルゴルズムなんだなぁ・・・
0851nobodyさん2007/10/10(水) 17:00:34ID:???
>>848
システム構成にもよるが、俺だったらツリー構造でオンメモリーで
住所データを保持しておいて、検索時にツリー構造から検索するようなやり方にする。
そうすれば、高速で検索が可能になる。まぁ、メモリーは食うけどなぁ。
0852nobodyさん2007/10/10(水) 17:18:46ID:???
>>848
3-6をデータベースの書式に合わせる
08537962007/10/10(水) 17:33:35ID:0neE8nHZ
うわぁぁあぁぁぁあ!!!
わかんねぇよ!!和漢ねlwんだよぉおおぉぉぉっうぇうぇwwwwwwwww
0854nobodyさん2007/10/10(水) 17:35:32ID:???
>>853
ウザイ
死ね
0855nobodyさん2007/10/10(水) 17:40:01ID:???
DB覚えなくても・・とか言ってる奴は頭が足りなくて覚えられないだけだな。
知っとくに越した事ないってw
■ このスレッドは過去ログ倉庫に格納されています