1 名前:nobodyさん [2009/02/18(水) 21:09:16 ID:xNLzAD7T] 質問者はまず>>1 を良く読むこと(必須!) 過去スレ、関連スレ、FAQなどは>>2-10 辺り 次スレは>>980 が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。 ◆前スレ 【PHP】下らねぇ質問はID出して書き込みやがれ 80 pc11.2ch.net/test/read.cgi/php/1233479457/ ◆質問用テンプレ 【OS名】vine linux 【PHPのバージョン】php5.26 【連携ソフトウェア】mysql 【質問内容】 ◆質問する時の注意 ・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す) ・ 己の行った操作、変更などを詳しく明記すること。 ・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。 ・ 質問者として、態度をわきまえること。 ・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。 (PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。) ◆質問後の注意 ・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。 ・解決しなくても回答をもらった場合はお礼を言うこと。 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。) ◆回答者への注意 ・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
104 名前:nobodyさん mailto:sage [2009/02/19(木) 22:20:00 ID:???] >>82 echo htmlspecialchars($data[1]) echo htmlspecialchars($data[2])
105 名前:nobodyさん [2009/02/19(木) 22:25:13 ID:NhJwmPwv] DWでPHP書いてますがeclipseで開発するメリットを教えてください
106 名前:nobodyさん mailto:sage [2009/02/19(木) 22:27:41 ID:???] ない
107 名前:nobodyさん mailto:sage [2009/02/19(木) 22:42:26 ID:???] DWの方が絶対良い データベースとか楽に構築できるしね
108 名前:nobodyさん mailto:sage [2009/02/19(木) 22:56:12 ID:???] >>105 スレチと思ったが開発環境スレが落ちてるな Eclipseのいいところは、 クラスや関数のアウトライン参照、コンテキストに沿ったコード補完、リファクタリング(まだまだ貧弱だが)、 ブレークポイントやステップ実行、その際の変数参照、 プラグインを導入すればバージョン管理システムやDBMSともIDE上から作業できる これらに興味がなければ無理して乗り換える必要もないかな
109 名前:nobodyさん mailto:sage [2009/02/19(木) 23:01:15 ID:???] DWでもCVSやSVNと接続できるけどな。 PDT使ったら、DWには戻れない。 まぁ、でも、サイトにすぐアップできるとか、いいよね。 でも、コードカラーリング崩れない? > DW
110 名前:nobodyさん mailto:sage [2009/02/20(金) 00:57:08 ID:???] DWはIDEじゃないから比較するものじゃないでしょ 使ったことないから知らないけどデバッガとかついてないでしょ?
111 名前:82 [2009/02/20(金) 01:21:04 ID:w405pQbs] >>86 >>104 ありがとうございます。 あと、たとえば$data[2]はたとえば3645.5218のような数字なのですが 桁を変えて36.455218にしたうえで10進から60進にしたいんです。 度 = int(36.455218) = 36 分 = int(0.455218 * 60) = int(27.31308) = 27 秒 = int(0.31308 * 60 *1000) / 1000 = 18.7848 = 36°27′18.7848″といったような感じにしたいんです。
112 名前:nobodyさん [2009/02/20(金) 01:37:44 ID:r16tK4jF] Smartyの質問なのですが、、PHPと関連するので質問させていただきます。 テンプレートを表示する時 $smarty->display("index.html"); で表示できますが、display()の中を変数にする事って出来ないでしょうか? それが出来たら、DBに保存しているHTMLをSmartyに反映させることが 出来るのですが、$smarty->display($html);とする方法では無理でした。
113 名前:nobodyさん mailto:sage [2009/02/20(金) 02:41:12 ID:???] demiru
114 名前:nobodyさん [2009/02/20(金) 05:22:05 ID:nLAMcH0P] PHPのメモリって勝手に開放されるのですか? デストラクタでunsetとかしないでも大丈夫ですか?
115 名前:nobodyさん mailto:sage [2009/02/20(金) 07:29:32 ID:???] 自動的に開放する。 無闇にunsetすると非効率になることが多いらしい が、処理時間の長いジョブとかの場合は開放した方がいい場合もある
116 名前:nobodyさん mailto:sage [2009/02/20(金) 08:38:58 ID:???] >>112 www.smarty.net/manual/ja/template.resources.php#templates.from.elsewhere これでできないか?
117 名前:nobodyさん mailto:sage [2009/02/20(金) 09:18:57 ID:???] はい? $template = 'index.html'; $smarty->display($template); で普通にできるのでは?
118 名前:nobodyさん [2009/02/20(金) 10:16:20 ID:P+ZCl9Zr] 昨日今日からの初心者です。 <html><body> <?php if(!適用条件) { echo "適用外"; exit;} // 適用条件内 ... ?> </body></html> と書くと適用条件外の場合"</body></html>"が出力しないようなのですが仕様なのでしょうか? その場合回避策としてタグの終りにジャンプとか抜けるみたなことは出来るのでしょうか? (適用条件内を1スコープにして括弧で括る、は出来ればしたくないので…)
119 名前:nobodyさん mailto:sage [2009/02/20(金) 10:29:22 ID:???] >>118 exitじゃなくて、goto ラベル;にしたらいいよ
120 名前:nobodyさん mailto:sage [2009/02/20(金) 10:39:43 ID:???] >>119 5.3以降でしか使えない変な物を教えるな >>118 条件外の時はexitしてるからそれ以降が実行されないので それ以降の</body></html>が出力されない そういう風に書くなら if (適用条件) { 条件内処理 } else { 条件外処理 } にすればいい あと、こっちのスレのがオススメ pc11.2ch.net/test/read.cgi/php/1227303362/
121 名前:nobodyさん mailto:sage [2009/02/20(金) 10:45:06 ID:???] 条件内処理をブロックに入れたくないって言ってるんだから、>>120 は無理でしょ。 せめて、 { echo "適用外</body></html> "; exit;} だな。
122 名前:nobodyさん mailto:sage [2009/02/20(金) 11:05:37 ID:???] 低級者向け:関数化すれ 中級者向け:テンプレエンジン使え 上級者向け:フレームワーク使え
123 名前:nobodyさん mailto:sage [2009/02/20(金) 11:05:49 ID:???] いや、なんでそこでexit使うか分からんな。 >>118 はexit使わなくても問題ないし。
124 名前:nobodyさん [2009/02/20(金) 11:06:54 ID:/aL6hv6c] >>122 逆じゃない?PHPで自分で作れないからフレームワーク使うんだろ?
125 名前:nobodyさん mailto:sage [2009/02/20(金) 11:06:57 ID:???] exitしないと、適用外のときでも、適用内の出力がまざっちまうじゃねぇか
126 名前:nobodyさん mailto:sage [2009/02/20(金) 11:08:20 ID:???] まず、初心者がくくりたくないとかいうわがままを許していいのかってことじゃねぇか。
127 名前:nobodyさん mailto:sage [2009/02/20(金) 11:10:01 ID:???] >>125 適用外のときは別途処理すればよくね?
128 名前:nobodyさん mailto:sage [2009/02/20(金) 11:10:28 ID:???] >>118 なぜ「出来ればしたくない」のか聞かせてくれ。
129 名前:nobodyさん mailto:sage [2009/02/20(金) 11:18:07 ID:???] >>127 詳しく
130 名前:nobodyさん [2009/02/20(金) 11:23:24 ID:P+ZCl9Zr] 回答・説明ありがとうございます。 取りあえず出来る書き方で書いて、天に祈りが届いたと思ってPHP5.3を待つ事にします。 >>128 Cで例外処理の場合はgoto文を使いたい(条件文が増えるとネストが深くなったりコードが重複したりするので) みたいなものです、プログラム思想みたいなものなので余りこれ以上の突っ込みはご勘弁を…
131 名前:nobodyさん mailto:sage [2009/02/20(金) 11:25:54 ID:???] gotoの方がよっぽど悪質だよww
132 名前:nobodyさん mailto:sage [2009/02/20(金) 11:34:03 ID:???] try-catch
133 名前:nobodyさん mailto:sage [2009/02/20(金) 11:39:58 ID:???] こんなところでtry-catchを持ち出そうとするからPHPerは糞だって言われるんだ
134 名前:nobodyさん mailto:sage [2009/02/20(金) 11:41:19 ID:???] >>133 すまん 例外処理と聞いて反射的に貼り付けただけなんだ
135 名前:nobodyさん mailto:sage [2009/02/20(金) 11:56:07 ID:???] >>130 それは貴方のロジックとかが悪いだけ
136 名前:nobodyさん mailto:sage [2009/02/20(金) 11:56:21 ID:???] gotoが許されるのはHSPだけです
137 名前:nobodyさん mailto:sage [2009/02/20(金) 11:59:50 ID:???] finallyを実装しなかった罪は思い
138 名前:nobodyさん mailto:sage [2009/02/20(金) 12:55:37 ID:???] 設計が悪いのにプログラム思想がうんぬん言われてもな…w 困るんだわ…w
139 名前:nobodyさん mailto:sage [2009/02/20(金) 13:12:10 ID:???] せっ・・・けい・・・?
140 名前:nobodyさん mailto:sega [2009/02/20(金) 15:34:00 ID:???] PHPのデバッガで、gdbのようなものはありますか? 主にコマンドラインプログラムが対象です attachの機能(すでに起動しているものを乗っ取れる)が 必須なんですが
141 名前:nobodyさん [2009/02/20(金) 16:27:31 ID:DGCUxhS+] 組込Linux C/C++ なドライバ屋(PHP歴は5日w)が質問させていただきます。 // 赤の他人の尻拭い中 識者いらっしゃいましたら助けてください。 よろしくお願いします。 【OS名】Linuxカーネル 2.6.18-92 (RHEL5.3) 【PHPのバージョン】php5.1.6 【連携ソフトウェア】Akelos 【質問内容】 XHTML 1.0 / UTF-8 な日本語ページ(タイトルも日本語)を出力する view があります。 IEやFireFoxなどのブラウザ、docomo iモードでは期待する内容が表示されます。 が、ezwebで文字化けします。 UTF-8が問題かと思ったのですが、同ページをPCブラウザ上で表示させ、 ソースを xx.html として保存。 このxx.html をezwebで表示すると、文字化けせずに期待通りの表示になります。 ezweb のブラウザ側の問題の可能性もあるかもしれませんが、回避策など ありましたら、教えてください。 --- xx.html の内容 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd "> <html xmlns="www.w3.org/1999/xhtml "> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>たいとる</title> // 以下略
142 名前:nobodyさん mailto:sage [2009/02/20(金) 16:33:21 ID:???] どうしてもUTF8でやりたいのなら ezwebだけ出力するときだけsjisに変換したら?
143 名前:nobodyさん mailto:sage [2009/02/20(金) 16:35:22 ID:???] >>141 www.au.kddi.com/ezfactory/tec/spec/4_2.html > また、EZwebでサポートする文字コードはShift-JISです。
144 名前:141 mailto:sage [2009/02/20(金) 16:44:08 ID:???] >>142 ,143 返答ありがとうございます。 Shift-JISに変換して出力するようにします。 ですが、.html拡張子のUTF-8なページは文字化けしないのが疑問のままなのは ちょっとモヤモヤが残ります。 識者いらっしゃいましたら、引き続きよろしくお願いします。
145 名前:nobodyさん mailto:sage [2009/02/20(金) 18:39:08 ID:???] >>144 header送信はどうやってる?
146 名前:nobodyさん [2009/02/20(金) 18:58:54 ID:QkuM0xlT] PHPの中から、apache上で走っているのか バッチファイル的に使われているのか(シェル上で、php hoge.php)を 判断する方法を教えて下さい
147 名前:nobodyさん mailto:sage [2009/02/20(金) 19:04:26 ID:???] >>146 phpinfo保存してdiffして好きなのを使うとか
148 名前:nobodyさん mailto:sage [2009/02/20(金) 19:12:40 ID:???] >>147 ありがとうございます それをヒントにして$_SERVERを比較したところ SHELLというキーが、シェルから呼んだ場合には設定されていました
149 名前:nobodyさん mailto:sage [2009/02/20(金) 19:17:35 ID:???] jp.php.net/manual/ja/function.php-sapi-name.php もろそういう用途の関数がありますよ
150 名前:nobodyさん mailto:sage [2009/02/20(金) 20:55:16 ID:???] php_sapi_name()ならpearのgo-pearを参考にしてもいいかも。 pear.php.net/go-pear
151 名前:nobodyさん mailto:sage [2009/02/20(金) 21:07:24 ID:???] めちゃめちゃPHP覚えてきた 自分の才能がコワイお(´・ω・‘)
152 名前:nobodyさん mailto:sage [2009/02/20(金) 21:09:59 ID:???] ほう,じゃ最近学んだこと何か語ってみてくれ
153 名前:nobodyさん [2009/02/20(金) 21:34:19 ID:JGeRmwBm] URLのうち、ドメイン直下の最上位ディレクトリを抽出するにはどうしたらいいですか? str系の関数組み合わせて3個目の/が何文字目で4個目が何文字目で… ってやれば出来るでしょうが、非効率というかアホっぽいので、正規表現でバキっと出す方法を 教えてください よろしく御願いします
154 名前:nobodyさん mailto:sage [2009/02/20(金) 21:37:09 ID:???] >>153 scandirが使えるバージョンならドメイン直下のディレクトリ名を取得すればおk 使えないならopendirとreaddirでググレカス
155 名前:nobodyさん mailto:sage [2009/02/20(金) 21:44:06 ID:???] >>141 GWの文字コード変換対象はtext/〜から始まるコンテンツのみ。 SSLも変換噛まさないけ
156 名前:nobodyさん mailto:sage [2009/02/20(金) 22:16:34 ID:???] >>152 文字コードがshift-jis、Euc-jpだとSQLインジェクションされる かといってutf-8は安全?というとそうでもない。
157 名前:nobodyさん mailto:sage [2009/02/20(金) 22:24:54 ID:???] php関係ねー 氏ねや
158 名前:nobodyさん mailto:sage [2009/02/20(金) 22:27:27 ID:???] そ・・・そんなん 必死に覚えてきたお(´・ω・‘)
159 名前:nobodyさん mailto:sage [2009/02/20(金) 22:37:43 ID:???] >>158 世の中にはいくらやっても報われないことが二つある ひとつは賽の河原の石積み もうひとつはお前のPHPの勉強だ
160 名前:nobodyさん [2009/02/20(金) 23:27:51 ID:r16tK4jF] SQLインジェクション対策は、 基本的に外部入力値をhtmlspecialcharsしていれば良い って考えは間違い?
161 名前:nobodyさん mailto:sage [2009/02/20(金) 23:31:06 ID:???] >>160 大間違い
162 名前:nobodyさん mailto:sage [2009/02/20(金) 23:34:48 ID:???] htmlspecialcharsで防げるだろ >>161 はhtmlspecialcharsを使用しても抜けられる穴について説明よろ
163 名前:nobodyさん mailto:sage [2009/02/20(金) 23:39:40 ID:???] >>160 htmlspecialchars(,ENT_QUOTES)で防げるのは「Script Injection」。 Javascript埋め込みとかそんなヤツ。 「SQLインジェクション」は別問題。 「PHPサイバーテロの技法」を買って読んどけ。
164 名前:nobodyさん mailto:sage [2009/02/20(金) 23:47:18 ID:???] >>162 LIKEのとこに%とか*突っ込んでみるとか。 select * from table where name like '%' ;
165 名前:nobodyさん mailto:sage [2009/02/21(土) 00:28:20 ID:???] >112 $str = '<font size="10">でっかい</font>'; $smarty->assign('tag', $str); $smarty->display('hoge.tpl'); ---hoge.tpl--- <body> {$tag} </body> とかいう意味だったら笑う。 >162 >164の変数名のところに「' OR 1=1」と入れるとレコードが全件変数に入り個人情報大暴露大会。 「'; DROP なんたらかんたら」と書くとテーブルがぶっ飛ぶ。レプリケーション先も全部死ぬからサービス復旧不能で店じまい、会社は倒産。 MySQLの設定が甘いと、管理テーブルを書き換えられてroot奪われるとかもあるな。
166 名前:nobodyさん mailto:sage [2009/02/21(土) 00:32:30 ID:???] あーっと、ENT_QUOTESだったか。死んでくる。
167 名前:nobodyさん mailto:sage [2009/02/21(土) 00:38:03 ID:???] >>160 addslashes
168 名前:nobodyさん mailto:sage [2009/02/21(土) 00:44:54 ID:???] >>167 addslashesも大間違い
169 名前:nobodyさん mailto:sage [2009/02/21(土) 01:19:11 ID:???] mysql_escape_string
170 名前:nobodyさん mailto:sage [2009/02/21(土) 01:34:53 ID:???] >>169 それも%とかをエスケープできないので間違い mysql_real_escape_string
171 名前:nobodyさん mailto:sage [2009/02/21(土) 01:47:18 ID:???] 可能な場合常にプレースホルダを使う、でFAだろ クエリの9割以上はカバーできるはずだ
172 名前:nobodyさん mailto:sage [2009/02/21(土) 02:05:10 ID:???] めんどいから ' と ; は削っちゃえ
173 名前:nobodyさん mailto:sage [2009/02/21(土) 02:17:42 ID:???] mysql_escape_stringって%エスケープしないのか ありえねーな likeを使ってなかったらだいじょうぶ?
174 名前:nobodyさん [2009/02/21(土) 02:35:53 ID:60WB0UqA] addslashesじゃだめなの? ある本にmysql_escape_stringより良いって書いてあったのに、早いって。。 純朴な素人をバカにしやがって
175 名前:nobodyさん mailto:sage [2009/02/21(土) 02:37:42 ID:???] お前は何を言ってるんだ 本にWebに書いてあることを鵜呑みにすることが「勉強」じゃないぞ?
176 名前:nobodyさん mailto:sage [2009/02/21(土) 02:44:35 ID:???] 何ぬかしてる、mysql_real_escape_string() は非推奨の mysql_escape_string() と機能は同じ だいたいこの関数はSQLステートメントとして成立する文字列リテラルを作るためのものだ %を勝手に殺したりする用途に使うもんじゃない
177 名前:nobodyさん mailto:sage [2009/02/21(土) 02:45:52 ID:???] %殺されちゃたまらないな。しかも%なんてSQLインジェクションには使えないだろ エスケープする必要ない
178 名前:nobodyさん mailto:sage [2009/02/21(土) 02:46:31 ID:???] PDOで解決
179 名前:176 mailto:sage [2009/02/21(土) 02:46:46 ID:???] 悪いアンカーが抜けていた >>176 は>>170 ,173へのレス
180 名前:nobodyさん [2009/02/21(土) 02:49:17 ID:RWcdEiGu] phpでhtmlのinputのtype="text"でreadonly='true'して printしているのですが、これってもしreadonlyに対応していない ブラウザとかだったら変更可能ですかね?ブラウザとか関係なく、 もし確実じゃなければ、それに代わる確実な方法を実現したいのですが 何か方法があれば教えてください。
181 名前:nobodyさん mailto:sage [2009/02/21(土) 02:58:27 ID:???] >>180 変更されてはならないものはクライアントに持たせない セッション変数なりストレージなりに保持しておく
182 名前:nobodyさん mailto:sage [2009/02/21(土) 05:32:46 ID:???] >>118 phpにおけるexitは強制終了。 それに続くタグとかは、一切実行も表示もされない。
183 名前:nobodyさん mailto:sage [2009/02/21(土) 12:05:11 ID:???] >180 そもそも、ブラウザなんぞ無くともデータは送受信可能だ。 HTTPなんて、テキストデータを送受信してるだけだからな。 クライアントに渡した全ての値は改竄され得るし、クライアントから送信される値は全て信用ならない。 input type="select"の中に、選択肢にない文字列が入ってくるなんてのはよくある事だ。
184 名前:nobodyさん mailto:sage [2009/02/21(土) 12:05:51 ID:???] <select><option>だったか。まあいいや。
185 名前:nobodyさん mailto:sage [2009/02/21(土) 13:04:41 ID:???] ちょっと気になったんだが、>>165 が書いている方法も SELECT * FROM test WHERE name='".htmlspecialchars($_POST["name"],ENTQUOTES)."' としていれば大丈夫なんじゃないのか? 「%」の件もlike使わなければいいわけだし。 like使う用途って「検索」が多いだろうから、表示されても良いデータだろうし。
186 名前:nobodyさん mailto:sage [2009/02/21(土) 13:10:29 ID:???] >>183 >選択肢にない文字列が入ってくる てっきりvalueにテキストを挿入してるかと思ったwwww
187 名前:nobodyさん mailto:sage [2009/02/21(土) 13:10:58 ID:???] >>185 そのセンス、感服するわ。 htmlspecialcharsで変換される文字君たちは検索にかからなくなるわけだが、 SQLにlikeを使わなきゃいいって制約を追加するわけだが、
188 名前:nobodyさん mailto:sage [2009/02/21(土) 13:14:04 ID:???] なんでそこまでしてhtmlspecialcharsに拘るのかが理解できない。 mysqlなら何も考えずmysql_real_excape_stringが一番安全確実簡単だろ。 htmlspecialchars使うと、<や>、&のような文字が全部変換されてDBに入力されてしまう。 検索なら対象がうまくヒットしなくなるし、画面表示文字列だとエスケープ/アンエスケープのタイミングを考慮しないといけない。 DBからCSVに書き出したくなったらどう変換すればいいんだ?JavaScriptに渡す時は? mlsql_real以下略なら、入力データはそのままの形でDBに格納されるし、そのままの形で検索される。この上なく分かりやすい。
189 名前:nobodyさん mailto:sage [2009/02/21(土) 13:16:13 ID:???] >>187 うん?クラスの処理とかすべて書けば良かったか? 単純かしたことに「こいつ馬鹿だwww」と感服したのかもしれないが。 そもそも、出力する時もフィールド指定するだろ。 だから、like使ってもパスワードが漏れないよな。 全件出力されるとか書いてたけど、普通limit指定するし。 >htmlspecialcharsで変換される文字君たちは検索にかからなくなるわけだが かからなくていいんじゃないか?検索させない場合は、変換入れるだろうが。
190 名前:nobodyさん mailto:sage [2009/02/21(土) 13:16:27 ID:???] 未だにDBで何をエスケープしておけばいいかわからないやつ多いよな。 基本的には「'」と「\」だけでいいんだぜ
191 名前:nobodyさん mailto:sage [2009/02/21(土) 13:19:03 ID:???] >>188 「そのままの形で格納されると困る」んだよ。 お前、WEBアプリケーション作ったことあるか? または、会員制サイト作って誰かに利用させたことあるか? その際、htmlspecialcharsで変換されない文字があるとどうなるかわかるだろ。 それに、htmlspecialcharsだけでも、CSV出力やJavascript(AJAX)の利用は出来る。
192 名前:nobodyさん mailto:sage [2009/02/21(土) 13:25:16 ID:???] >>189 おいおい、 記事中から、bread&butterって検索したくてもできないじゃないか。
193 名前:nobodyさん mailto:sage [2009/02/21(土) 13:26:33 ID:???] zend server 人柱だれかよろ ttp://sourceforge.jp/magazine/09/02/19/2316221
194 名前:nobodyさん mailto:sage [2009/02/21(土) 13:27:24 ID:???] >>191 が作ったWebアプリケーションは穴だらけ、バグだらけだろうなぁ。 ご愁傷様
195 名前:nobodyさん mailto:sage [2009/02/21(土) 13:27:36 ID:???] Zendワロタwwwwwwwww よく開発続けられるよなwwwww不人気なのにwwwwwww
196 名前:nobodyさん mailto:sage [2009/02/21(土) 13:29:18 ID:???] htmlspecialcharsをDBアクセスで使用するバカ 後輩とかに指摘されて恥かくまでずっとやってろ
197 名前:nobodyさん mailto:sage [2009/02/21(土) 13:30:31 ID:???] 俺はforeachのことを「フォレーチ」って読んでた 先輩は「フォー・イーチ」って読んでた 別に恥ずかしくないんだからねっ!これからも「フォレーチ」って読むわ
198 名前:nobodyさん mailto:sage [2009/02/21(土) 13:32:44 ID:???] >>191 なぁ、ちょっと確認していいか? 入力->フィルター->エスケープ->DB -> 取り出し-> フィルター -> html適合化 -> 表示 おまえこの流れは理解してるってことでいいんだよな?
199 名前:nobodyさん mailto:sage [2009/02/21(土) 13:34:46 ID:???] xamppに代わる開発環境になるかな?
200 名前:nobodyさん mailto:sage [2009/02/21(土) 13:35:45 ID:???] >>199 ネーミングが悪かったかもしれない XAMPPは初心者もなじみやすい名前だから、暫くはそっちが流行ると思うな
201 名前:nobodyさん mailto:sage [2009/02/21(土) 13:36:24 ID:???] >191 会員制の課金の発生する、バックエンドでCSVとTSVでレポートを吐くwebアプリを仕事で書いてるが、 ・DBに渡す際にPDOのプレースホルダで渡す、あるいはmysql_real_escape_stringなどでクエリを構成する ・画面表示する際にはビューに渡す時点で原則全ての値をhtmlspecialcharsでエスケープ (タグを書き出さないといけない箇所や、HTML以外の箇所などの例外は慎重に検討したうえでエスケープせず渡す) ・DBには、例えばフォームからの入力なら入力値がそのままの形で格納される このルールが一番分かりやすいし、安全だし、汎用性がある。 出力部で「この文字列はDBから来た値だからhtmlspecialcharsは不要、こっちはクライアントからの入力値だから必須…」とかやってると、絶対変換ミスが発生する。 何も考えずルールにさえ従ってさえいれば脆弱性が発生しない事をシステムが担保してくれる形にするのが一番安全なんだよ。 俺はMySQLでの危険文字を全て列挙すら出来ない低能だし、職場には俺以下の屑が溢れているが、このルールに従う限り絶対安全だとシステム側で保障できるコードを組める。
202 名前:nobodyさん mailto:sage [2009/02/21(土) 13:41:28 ID:???] >>198 してるわけないだろ。関数の使いどころすらわかってないんだから
203 名前:nobodyさん mailto:sage [2009/02/21(土) 13:41:54 ID:???] >>201 それでOKなんだけど、>>191 はフィルターやバリデーターとDB登録時のエスケープを混同してるらしいからw
204 名前:nobodyさん mailto:sage [2009/02/21(土) 14:03:40 ID:???] 俺が使ってるサービスで ↓を混同してるプログラマがコード書いてませんように・・・ ・DB入力時(SQLインジェクション) ・画面出力時(Scriptインジェクション)
205 名前:nobodyさん mailto:sage [2009/02/21(土) 14:14:16 ID:???] >>193 雑談はネタ不足気味な雑談スレで。 pc11.2ch.net/test/read.cgi/php/1200314111/
206 名前:nobodyさん mailto:sage [2009/02/21(土) 14:20:49 ID:???] >>198 ああ。実際に>>201 が書いているようなことはしているよ。 例として>>185 みたいな簡単な1行ソース出したから 「こいつ何も知らない馬鹿だなwww」と煽りたい気持ちも分かる。 だが、1から10までここに書けないだろ。 入力時、出力時にそれぞれ適切に変換するのは、初歩中の初歩だと思う。 201がああだこうだ書いてるが、俺は自作クラス作ってDB処理をしているから 変換ミスがどうのこうのはない。 ま、そういう自分の事はどうでも良くて、>>185 の意見を出しただけなんだが なぜか俺自身を煽りたい馬鹿がいるな。そんな事しても無駄だろ
207 名前:nobodyさん mailto:sage [2009/02/21(土) 14:22:00 ID:???] >>185 みたいなコードが出てくる時点でお前が一番馬鹿だよ
208 名前:nobodyさん mailto:sage [2009/02/21(土) 14:26:20 ID:???] >>207 >だが、1から10までここに書けないだろ。 ちゃんと読めよ・・・わかりやすいように簡単に書いたって言ってるだろ それに、htmlspecialcharsで変換しないでそのまま格納したとする その場合、phpMyAdminなどで管理する時。どうなるかわかるよな?
209 名前:nobodyさん mailto:sage [2009/02/21(土) 14:27:37 ID:???] >>208 こんだけ書かれてまだわかんないのか。 そこでhtmlspecialcharsはおかしいってことだろ。 代わりに何を使うべきか考えてみろ
210 名前:nobodyさん mailto:sage [2009/02/21(土) 14:28:10 ID:???] >>206 荒れるだけだから黙っててくれ。
211 名前:nobodyさん mailto:sage [2009/02/21(土) 14:28:10 ID:???] >>185 や>>191 みたいなこと書いてたら馬鹿にされるのあたりまえだろ >>206 が仕事ではなく趣味でPHPいじってるだけであることを祈る
212 名前:nobodyさん mailto:sage [2009/02/21(土) 14:28:18 ID:???] >>208 うん、あれはhtmlspecialcharsで変換されて出力されるね ってかphpMyAdminなんか使ってるのかよ
213 名前:nobodyさん mailto:sage [2009/02/21(土) 14:28:48 ID:???] >>209 わかる・わかんないの、俺に対しての批判はどうでも良いんだよ。 「なぜhtmlspecialcharsは駄目なんだ」って事だ
214 名前:nobodyさん mailto:sage [2009/02/21(土) 14:29:08 ID:???] >>208 phpMyAdminをなめてんの? 別にスクリプトが混入したって何もおきないよ。 もし、そこでスクリプトインジェクションされんならIPA行きだお
215 名前:nobodyさん mailto:sage [2009/02/21(土) 14:30:21 ID:???] >>213 > 「なぜhtmlspecialcharsは駄目なんだ」 既出
216 名前:nobodyさん mailto:sage [2009/02/21(土) 14:30:27 ID:???] お前ら、自分の視野で物事考えすぎだよ。 「phpMyAdminなんて使ってるの?」って言葉がここで出てくると思わなかったぜw ここのスレの役割考えろや。どうせ個人叩きしかできないくせに。
217 名前:nobodyさん mailto:sage [2009/02/21(土) 14:30:31 ID:???] >>208 全部わかったうえで一部分だけ簡単に書いてます、って言ってるやつの文章じゃないよそれ 結局DB格納時にhtmlspecialchars使ってるんじゃん
218 名前:nobodyさん mailto:sage [2009/02/21(土) 14:31:22 ID:???] >>216 phpMyAdmin → 画面出力時のお話 SQLインジェクションからかけ離れてきました・・・
219 名前:nobodyさん mailto:sage [2009/02/21(土) 14:32:07 ID:???] >>206 > 俺は自作クラス作ってDB処理をしているから変換ミスがどうのこうのはない。 変換とか言ってる段階で、その自作クラスが穴だらけに1000カノッサ
220 名前:nobodyさん mailto:sage [2009/02/21(土) 14:36:47 ID:???] > それに、htmlspecialcharsで変換しないでそのまま格納したとする > その場合、phpMyAdminなどで管理する時。どうなるかわかるよな? phpMyAdminは出力時サニタイズをすっかり忘れてる、ってこと?
221 名前:nobodyさん mailto:sage [2009/02/21(土) 14:38:07 ID:???] サニタイズってトイレにでも行く気?
222 名前:nobodyさん mailto:sage [2009/02/21(土) 14:38:47 ID:???] >>185 ENTQUOTES ENTQUOTES ENTQUOTES ENTQUOTES ENTQUOTES ENTQUOTES ENTQUOTES ENTQUOTES
223 名前:nobodyさん mailto:sage [2009/02/21(土) 14:40:08 ID:???] おまえらとどめは刺さないよなww
224 名前:nobodyさん mailto:sage [2009/02/21(土) 14:40:18 ID:???] >>219 >>201 が「俺はMySQLでの危険文字を全て列挙すら出来ない低能」と 言ってる意味を理解できていない、に1000カノッサ上乗せ
225 名前:nobodyさん mailto:sage [2009/02/21(土) 14:46:08 ID:???] >>185 語る以前にエラーになる件
226 名前:nobodyさん mailto:sage [2009/02/21(土) 15:07:41 ID:???] ↓アクセスするとGoogleに飛ぶんですがどういう仕組みですか? www.yahoo.xxco.jp/
227 名前:nobodyさん mailto:sage [2009/02/21(土) 15:11:56 ID:???] %はあんまり伝わらなかったみたいだなー。 SQLとHTMLでは、特殊な扱いになる文字が違うよってことだけど。 htmlspecialchar()でも問題なく見えるのは、たまたま、だと思ったほうがいいよ。 偶然にも、置き換え対象になる文字がSQLでエスケープが必要な文字と同じだったってこと。 ついでに言えば、エスケープの仕方は実際はDB依存だから addslashes()じゃなく、DB専用の関数を使ったほうがいい。
228 名前:nobodyさん mailto:sage [2009/02/21(土) 15:13:44 ID:???] >>160 からの流れ、断ち切っておくか・・・ ・DBに渡す際にPDOのプレースホルダで渡す、または専用関数(mysql_real_escape_string)でクエリを構成。 ・html出力時にhtmlspecialchars(,ENT_QUOTES)をする。 ※DBに渡す際にhtmlspecialcharsするのは間違い。 → 理由 >>188 → それでも分からない。 >>163 の本を読め。
229 名前:nobodyさん mailto:sage [2009/02/21(土) 15:18:48 ID:???] >>226 GET / HTTP/1.1 Host: www.yahoo.xxco.jp (略) HTTP/1.x 302 Found Date: Sat, 21 Feb 2009 06:15:31 GMT Server: Apache/2.2.9 (Fedora) X-Powered-By: PHP/5.2.6 Location: www.google.co.jp/ Content-Length: 0 Connection: close Content-Type: text/html; charset=UTF-8
230 名前:nobodyさん mailto:sage [2009/02/21(土) 16:10:53 ID:???] 素人だけど、俺より酷いプロらしき人が入るのを見て安心したような不安になったような…
231 名前:nobodyさん mailto:sage [2009/02/21(土) 16:11:49 ID:???] >>226 xxco.jpの管理人が、 www.yahooo.xxco.jpへアクセスした場合に 「Location: www.google.co.jp/ 」へリダイレクト(302)するようにしているだけ。 <?php header('Location: www.google.co.jp/ ', True, 302); ?>
232 名前:nobodyさん mailto:sage [2009/02/21(土) 16:25:04 ID:???] >>231 サンクス xxcoってドメインか
233 名前:nobodyさん mailto:sage [2009/02/21(土) 16:35:25 ID:???] べ・・・別に! 僕レンタルサーバー使ってるからね! エスケープしなくても安全よっ!
234 名前:nobodyさん [2009/02/21(土) 19:59:23 ID:230PJjNE] 【OS名】MacOS X (MAMP) 【PHPのバージョン】php5.2.5 【連携ソフトウェア】mysql 【質問内容】 Webアプリケーションで、ウィンドウ毎に違う情報を引き継いで処理をしていく物を作っています。 uniqid()でセッションIDを割り振って、formのhiddenに入れると引き継げるのは分かりました。 しかしこれだと、link(aタグ)で機能を選択した場合に、セッションIDが引き継げないように 思います。ですよね??何か良い方法はありませんか? リンクのパラメータに追加するとなると、全部のリンクに書き足す必要があって大変だし、 POSTとGETの両方の評価が必要になると煩雑だし、そもそもurlにセッションIDを出すのが 微妙に避けたいので・・・。 お知恵を拝借したいです。よろしくお願いいたします。
235 名前:教えて [2009/02/21(土) 20:15:36 ID:1h/i9qY8] これだと1回で20数全部でます。1回1数でかぶらずに20回出したです。 <?php $numbers = range(1, 20); shuffle($numbers); for($i = 0; $i < 20; $i++) { echo $numbers[$i]."<br>\n"; } ?>
236 名前:nobodyさん mailto:sage [2009/02/21(土) 20:16:32 ID:???] ふつうセッションIDはCOOKIEで渡す ケータイの場合はGET渡ししかない
237 名前:nobodyさん mailto:sage [2009/02/21(土) 20:17:25 ID:???] >>235 出したんなら良かったな
238 名前:nobodyさん mailto:sage [2009/02/21(土) 20:21:23 ID:???] モバゲーで鳴らした俺はこの程度の日本語崩壊くらいなんて事は無い モバゲーではこの程度の言語障害者珍しくも無い マジ日本はどこへ向かうんだ $numbers = range(1, 20); shuffle($numbers); echo array_pop($number); // なんか処理 echo array_pop($number); // なんか処理 echo array_pop($number); … 1ページ内の処理ならこれでいける。 2枚以上の画面にわたって変数を持って行きたいならセッションを使うしかない。
239 名前:234 [2009/02/21(土) 20:33:28 ID:230PJjNE] >>236 COOKIEですか・・・ちょっと調べてみます。ありがとうございます。 クライアントはパソコンなので、GETでもPOSTでも使えます。 COOKIEでもウィンドウ毎って可能なんですか?
240 名前:nobodyさん mailto:sage [2009/02/21(土) 20:38:24 ID:???] >>239 パソコンならhiddenを使う必要ない。セッションはクッキーが勝手に確立してくれる GETやらPOSTも意識する必要ない。セッションに少し慣れればすべて解決する 別ウインドウのことを言ってるのだとしても リンクやフォームから作成された別ウインドウは同一セッションとなる
241 名前:234 mailto:sage [2009/02/21(土) 20:51:05 ID:???] >>240 同一セッションでは困るんですが・・・ウィンドウ毎に分けたいので・・・
242 名前:nobodyさん mailto:sage [2009/02/21(土) 20:54:07 ID:???] >>241 であればウインドウごとにID発行してそれをセッションで持ちまわす
243 名前:242 mailto:sage [2009/02/21(土) 20:58:18 ID:???] ごめん、うそついた 同一セッションで別ID発行してもセッションが上書きされるだけだからダメか
244 名前:nobodyさん mailto:age [2009/02/21(土) 20:59:36 ID:???] 入力->フィルター->エスケープ->DB -> 取り出し-> フィルター -> html適合化 -> 表示 で質問。 入力->フィルター->エスケープ->DB -> 取り出し-> ここまではわかるが。 その後なんでまたフィルタにかけるの? while文でたとえば <? while ( $item = mysql_fetch_array( $result ) ) { ?> <tr> <td><?= $item['item_id'] ?><?= $item['item_id2'] ?></td> <td><?= $item['item_name'] ?></td> <td><?= $item['author_name'] ?></td> <td><?= $item['publisher_name'] ?></td> <td><?= date( 'Y年m月d日', strtotime( $item['release_date'] ) ) ?></td> <td><?= $item['list_price'] ?></td> <td><?= $item['sale_price'] ?></td> <td><?= get_category_name( $link, $item['category_id'] ) ?></td> <td><?= $item['quantity'] ?></td> <td><?= $item['state'] ?></td> <td> <nobr>[<a href="admin_edit_item.php?item_id=<?= $item['item_id'] ?>">編集</a>]</nobr> <nobr>[<a href="admin_del_item1.php?item_id=<?= $item['item_id'] ?>" onClick="return confirm( '完全に削除されます。よろしいですか?' )">削除</a>]</nobr> </td> <? $n ++; } ?> でまわしてはいかんのかね?
245 名前:nobodyさん mailto:sage [2009/02/21(土) 21:09:52 ID:???] >>244 俺も取り出しのあとのフィルターってのはよくわからん DBには正しいものが入ってるはずだしな でもhtml適合化は必要だろ。そのコードだとScript実行されるよ
246 名前:234 mailto:sage [2009/02/21(土) 21:10:06 ID:???] >>243 そうなんです。>234の様にformかurlに入れれば、 とりあえずウィンドウ毎に別の情報を引き継げます。 だけど、formとurlの両立が難しい。 何か、簡単にウィンドウ毎を識別する方法があれば・・・
247 名前:244です。 mailto:sage [2009/02/21(土) 21:15:34 ID:???] htmlspecialcharsか
248 名前:nobodyさん mailto:sage [2009/02/21(土) 21:17:49 ID:???] >234 まったく同一のページを2ウィンドウ開くのならば、URLかPOST値にセッション情報を含めないとダメだな。 手を抜くならセッションキーGET渡しで ・Smarty使ってるならポストフィルタで全サイト内リンクにセッションキーを追加する ・JavaScript経由で全リンクをセッションキー付きに書き換える 辺りか。 リンクを書き換えないなら、複数ウィンドウシステムに入った時点で index.php/hogehoge/ index.php/fugafuga/ のような固有URLを割り振り、これをセッションキーにするのも手。 index.php/hogehoge/menu から <a href="./information">で index.php/hogehoge/information に遷移させられるから記述が多少楽になる。 ただし、セッション情報がリクエストヘッダでだだ漏れだし、外部リンクに気を払う必要も出てくる(REFERERで漏れる)。
249 名前:nobodyさん mailto:sage [2009/02/21(土) 21:20:12 ID:???] >>244 >入力->フィルター->エスケープ->DB -> 取り出し-> フィルター -> html適合化 -> 表示 どこにそんなことが書いてある? 入力 -> エスケープ -> DB -> 取り出し -> サニタイズ -> 表示 これでいい
250 名前:nobodyさん mailto:sage [2009/02/21(土) 21:26:33 ID:???] >>249 サニタイズってのは、入力値に不正な値や壊れた文字列が入っていないかをチェックするもの。 やるなら、入力の直後だが、サニタイズって言うと、>>249 みたいな誤解をするやつがいるから、 入力後にやるのが、バリデート+フィルター。
251 名前:nobodyさん mailto:sage [2009/02/21(土) 21:28:51 ID:???] DBからの取り出し後にフィルターを書ける理由 DBってのはデータストア。 収録されたデータをすべて出力していいとは限らないし、 形式によってはフィルターをかける必要がある。jk
252 名前:nobodyさん mailto:sage [2009/02/21(土) 21:33:13 ID:???] >>250 入力段階でチェックするのはvalidate sanitizeは表示段階で、浄化、つまり悪意のあるスクリプトやタグを無効にするもの
253 名前:nobodyさん mailto:sage [2009/02/21(土) 21:43:54 ID:???] フィルターって要するにバリデートだろ。 エスケープやサニタイズとは別の話題。
254 名前:nobodyさん mailto:sage [2009/02/21(土) 21:44:23 ID:???] >>252 まぁ、そう思っててもいいけどな。 それは、htmlspecialcharsをサニタイズだと思っている子たちの誤解 悪意と善意を確実に識別できるのはどこかを考えれば正解はどっちかわかるはずだが、 困ったことに、サニタイズ≒出力フィルタだと書いちまってるサイトやら本があるからなぁ。 要するに、サニタイズなんて曖昧なメタファーでプログラムを語るなってことだ。
255 名前:nobodyさん mailto:sage [2009/02/21(土) 21:45:32 ID:???] >>253 バリデートはフィルターに含まれる。 エスケープとは別。 で、何が言いたいの?
256 名前:nobodyさん mailto:sage [2009/02/21(土) 21:46:05 ID:???] >>251 具体的にどういうデータだったらそのフィルターとやらをかけるの?放送禁止用語とか?
257 名前:nobodyさん mailto:sage [2009/02/21(土) 21:47:37 ID:???] >>254 htmlspecialcharsもサニタイズの一種だろ。話を難しくしすぎ
258 名前:234 mailto:sage [2009/02/21(土) 21:48:33 ID:???] >>248 そうですよね。ありがとうございます。 固有URLの実装方法は分かりませんし、 そもそもフレームワークにCakePHPを使うので、そういうURLなのです。 リンクじゃなくて、全てformのボタンにするのも手ですかねぇ・・・。
259 名前:nobodyさん mailto:sage [2009/02/21(土) 21:49:18 ID:???] >>256 放禁みたいなNGフィルター、SNS用の権限フィルター 多端末対策で文字コード変換フィルター スクリプト許可端末、スクリプト拒否端末用の変換フィルター タグ許可・不許可 まぁ、なんでもいいでしょ
260 名前:nobodyさん mailto:sage [2009/02/21(土) 22:00:32 ID:???] バリデート 検証。入力値などに問題が無いかをチェックする(チェックした後どうするかは知らない)。 フィルタ 入力値をチェックし、ヤバいものは除去する、ないし弾く(エラーにする、無視する)。 サニタイズ 消毒。転じて無害化。害の無いものにする。変換・置換など無害化の方法は多数あるが。。 エスケープ ある環境で特殊な意味を持つ値(HTMLならば<など)を、その環境のルールで規定された別の表現(<)に置き換える。 ダブルクォート中で"の前にバックスラッシュを置くのもエスケープ。 どれがベストかというと、どの表現も曖昧さが残るので使うべきではない。 DBへの入力の無害化処理と、HTML出力への無害化処理は違うし、無害化の方法も1通りではない。 設計初期などで抽象度を残した表現をしたい時くらいしか使わないな。 >259は文脈を意図的に曲解した例。
261 名前:nobodyさん mailto:sage [2009/02/21(土) 22:01:28 ID:???] >>257 htmlspecialchars=html適合化っていう具体的かつ正確な言葉があるのに、 曖昧かつ誤解に満ちて見解が分かれるサニタイズなんて言葉にする必要はないだろ。
262 名前:nobodyさん mailto:sage [2009/02/21(土) 22:01:39 ID:???] 俺だせえ。 > 別の表現(<)に置き換える。 な。
263 名前:nobodyさん mailto:sage [2009/02/21(土) 22:05:41 ID:???] >>260 > ダブルクォート中で"の前にバックスラッシュを置くのもエスケープ PHPとかJSならエスケープだが、HTML中でこれができると思ってしまう奴もいるらしいからな。 HTML出力時にaddslashesするやつとか、 DBに入れる前にhtmlspecialcharsする奴とか、 入力時に両方処理する奴とか、 ほんと、ウンコだな
264 名前:nobodyさん mailto:sage [2009/02/21(土) 23:03:26 ID:???] >>263 自分のこといってるんですね わかります。
265 名前:nobodyさん mailto:sage [2009/02/21(土) 23:17:26 ID:???] >>263 はうんこ
266 名前:nobodyさん mailto:sage [2009/02/21(土) 23:33:28 ID:???] ほんと、ウンコだな
267 名前:nobodyさん mailto:sage [2009/02/21(土) 23:47:51 ID:???] 叩かれる理由のない>>263 を叩いてるのは 昼にhtmlspecialcharsの件で叩かれてたやつだろ
268 名前:nobodyさん mailto:sage [2009/02/21(土) 23:49:41 ID:???] >>263 はうんこ
269 名前:nobodyさん mailto:sage [2009/02/22(日) 00:00:19 ID:???] >263 良く分からないけどやーいやーいうんこうんこー
270 名前:nobodyさん mailto:sage [2009/02/22(日) 00:13:17 ID:???] うんこを馬鹿にしたやつ全員明日から便秘に悩む。
271 名前:nobodyさん [2009/02/22(日) 00:31:09 ID:bY3v8MvV] >>270 のせいで、便秘ではないがうんこが止まらない。 この1時間で4回うんこにいっている
272 名前:nobodyさん mailto:sage [2009/02/22(日) 00:34:34 ID:???] <?=str_repeat( 'うんこ', date('s') )?>
273 名前:234 [2009/02/22(日) 00:46:35 ID:JUr+Er3M] リンクやPOSTで受け取るデータの他に、元のページから送られてくるデータって 何か無いかな・・・って考えてたら・・・$_SERVER['HTTP_REFERER']が使え ないかなぁ?って思ったのですが。どうでしょうか? 例えばheaderのmetaとかでreferer urlを変更して、セッションIDを追加したり とか出来ないでしょうか。 他にも、何か使えそうなデータって無いでしょうか?
274 名前:nobodyさん mailto:sage [2009/02/22(日) 01:01:49 ID:???] >>273 refererは自由に変えられるし、飛ばさないブラウザもあるし信用ならないよ まず別セッションにしたい理由がわからん ユーザーに複数セッションを使わせたいという状況は想像できないし 自分が複数セッション使いたいならブラウザもうひとつ立ち上げればよいだけ
275 名前:234 [2009/02/22(日) 01:27:54 ID:JUr+Er3M] >>274 refererが信用ならないのはおっしゃる通りです。ご指摘ありがとうございます。 リファラ出さないブラウザは対象外って事で良いのです。 複数セッションを使うために、別のブラウザを立ち上げれば済むのもご指摘通り。 自分だけで使うなら、その方が簡単なのですが。 例を挙げると、ウィンドウ1つに一人分の情報を表示/編集できる、マルチ・ ウィンドウの住所録ソフトみたいなものを想定しています。 ウィンドウ毎に別セッションにしないと無理じゃないかと思いました。 他に、定石があるようでしたら教えて下さい。 よろしくお願いいたします。
276 名前:nobodyさん mailto:sage [2009/02/22(日) 02:04:13 ID:???] あなたがたは無職なのに なんで質問に回答するときはえらそうな 態度なの?
277 名前:nobodyさん [2009/02/22(日) 03:06:25 ID:3nGhqmkB] SQLite3 + PDO で、 1つ目のプロセスがトランザクション張ってて、 2つ目のプロセスがトランザクション張ろうとして、 当然1が既にデーターベースをロックしてるから、 2はロックを取得できなくて、そんで SQLITE_BUSYが帰ってきて、 database is locked ってわかったとき、 しばらくsleepさせて、リトライ って処理、どうやって書けばいいの? どっかにサンプルコードある?
278 名前:nobodyさん mailto:sage [2009/02/22(日) 04:28:08 ID:???] >>277 そこまで分かってるならforなりでいくらでも書けそうだけど・・ 具体的にどこが分からないのよ
279 名前:nobodyさん mailto:sage [2009/02/22(日) 18:00:44 ID:???] 例えばtp://test.jp/とういうサイトで、 ユーザ登録(ユーザ名をuserで登録)して、ページを開設する ↓ tp://test.jp/user/ みたいに自分のページができる ↓ このページを誰もがある程度操作できる(お絵かき掲示板とか、ブログのコメ投稿とか) mixiなどのようにログインページがいらないので次回からこのページは tp://test.jp/user/が存在する限り、だれもがこのurlから訪問することができる。 みたいなサイトみて思ったのですが、 1./user/の部分は実際にサイトの鯖でuser専用のディレクトリやそこに.phpなどを作っているのでしょうか? 2.それとも、apacheだったらhttpd.confなんかで、 tp://test.jp/mypage.php?userid=user → tp://test.jp/user/ みたいな変換をしているのでしょうか? しかし2.の方法だと、userというページがあるかどうかをどうやって判断しているんでしょう・・ 適当に、userid=tekitouとかしてみたときに、tp://test.jp/tekitou/となってしまい、そのページが あるかないかの判断はいろんな方法でできると思うのですが、ユーザ登録が増えれば増えるほど その判断する速度は落ちるような気がしてしまうのです・・ そもそも2の時点で他の方法でユーザを管理しているかもしれません、 上のようなサイトの、ユーザ管理とその引き出しはどう管理しているのか、 大体でもいいので教えていただけないでしょうか よろしくお願いします
280 名前:278 [2009/02/22(日) 18:01:32 ID:euIhPE01] id
281 名前:nobodyさん mailto:sage [2009/02/22(日) 18:03:04 ID:???] >>279 今の主流は動的URLを性的URLに変化する example.com/user/ →example.com/id=user DBにデータを保存しておいてページのIDで呼び出す
282 名前:nobodyさん [2009/02/22(日) 18:09:47 ID:euIhPE01] すいません>>280 の名前は279でした >>281 なるほど、DBを使ってユーザーのページに誰かが訪れるその度に 検索呼び出ししているということでしょうか。 なんかすっきりしましたありがとうございました
283 名前:nobodyさん mailto:sage [2009/02/22(日) 18:12:49 ID:???] >>282 ちなみに毎回DBから同じ情報ひっぱってくるのは負荷かかるから キャッシュを使ってるのが多いと思う (ここはまたSmartyとか覚えたときにやってみるといい)
284 名前:nobodyさん [2009/02/22(日) 18:16:29 ID:euIhPE01] >>283 Smartyですか、参考に調べてみます ありがとうございました!
285 名前:nobodyさん [2009/02/22(日) 21:21:50 ID:3nGhqmkB] >>278 while で書いたけど、 deadlockになるのです
286 名前:nobodyさん mailto:sage [2009/02/22(日) 21:47:52 ID:???] 具体的にどう書いたか見せたほうが答えてもらいやすいと思うが・・ 恥ずかしがらないで
287 名前:nobodyさん [2009/02/22(日) 21:50:36 ID:3nGhqmkB] >>286 1.php と 2.php と2つのファイルを用意して、 以下のテストを行いました。 「テスト1」 1.phpを単独で実行する -> OK 「テスト2」 2.phpを単独で実行する -> OK 「テスト3」 1.php -> 2.php という順番で実行する -> deadlock発生 こういう状況です。
288 名前:nobodyさん [2009/02/22(日) 21:52:30 ID:3nGhqmkB] 1.phpは、トランザクション中に sleep(10); をかませて、ゆっくり実行するようにしてあります。 このゆっくりタイムに、いそいで2.phpを実行する、という テストです。
289 名前:nobodyさん [2009/02/22(日) 21:53:36 ID:3nGhqmkB] 環境は、PHP5 + PDO + SQLite3 です。 データーベース構造は、 id | name| value 1 | bond | 5 database name = test1 table name= tb1 です。
290 名前:nobodyさん [2009/02/22(日) 21:54:35 ID:3nGhqmkB] 1.php のソースは以下の通りです <?php try { $oDbCxn = new PDO('sqlite:test1'); $oDbCxn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Error connecting to DB"); } $bUpdatePending = true; while ($bUpdatePending) { try { $oDbCxn->beginTransaction(); $oDbCxn->exec("UPDATE tb1 SET value = value + 1 WHERE id = '1'"); sleep(10); $oDbCxn->commit(); $bUpdatePending = false; // Exit the loop now the update has been done } catch (PDOException $e) { // Update failed. Wait a while before trying again in the next loop } } ?>
291 名前:nobodyさん [2009/02/22(日) 21:55:09 ID:3nGhqmkB] 2.phpは、以下の通りです <?php try { $oDbCxn = new PDO('sqlite:test1'); $oDbCxn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Error connecting to DB"); } $bUpdatePending = true; while ($bUpdatePending) { try { $oDbCxn->beginTransaction(); $oDbCxn->exec("UPDATE tb1 SET value = value + 1 WHERE id = '1'"); $oDbCxn->commit(); $bUpdatePending = false; // Exit the loop now the update has been done } catch (PDOException $e) { // Update failed. Wait a while before trying again in the next loop sleep(15); } } ?>
292 名前:nobodyさん [2009/02/22(日) 21:57:20 ID:3nGhqmkB] 1.phpと2.phpの違いは、sleep(10)があるか、ないかというだけです。 それ以外は全部同じです。 SQLiteはトランザクション中に、別のトランザクションを発生させようとすると 1秒も待たずに「database is locked」になるので、 ウエイト->リトライ、という処理を自分で書かないといけません。 これがイマイチ普及しない最大のポイントだと思いますが、 その処理の書き方についての質問です。 なぜかデッドロックになってしまうのです
293 名前:nobodyさん mailto:sage [2009/02/22(日) 21:57:20 ID:???] え?ループ内にトランザクション?
294 名前:nobodyさん [2009/02/22(日) 21:57:55 ID:3nGhqmkB] >>293 だってリトライしないといけないわけだから。 なんか間違ってる?
295 名前:nobodyさん mailto:sage [2009/02/22(日) 22:01:33 ID:???] 例外が発生するポイントは、beginかexecか調べた?
296 名前:nobodyさん [2009/02/22(日) 22:03:13 ID:3nGhqmkB] >>295 例外は発生しないにょ ずーーーっと実行中のままになって、 最後にはタイムアウトになるんだにょ PHPのデフォルトタイムアウトが60秒だから 60秒でタイムアウトになるにょ
297 名前:nobodyさん mailto:sage [2009/02/22(日) 22:04:43 ID:???] >>296 おいおい、 例外にならなかったら、falseが設定されるでしょうが。 例外をcatchして捨ててるだけでしょうが。
298 名前:nobodyさん mailto:sage [2009/02/22(日) 22:06:21 ID:???] beginTransactionでオートコミットモードがオフになる。 execに失敗する。 もう一度、beginTransactionをかけるが、既にbeginされてるので例外発生 で、またループ。 beginをループの外に出すかcatchしたときにロールバックしてみたらどうかね
299 名前:nobodyさん mailto:sage [2009/02/22(日) 22:13:32 ID:???] EC-CUBEのカスタマイズで1000万て安い? ちなみに1年、5人担当
300 名前:nobodyさん [2009/02/22(日) 22:15:02 ID:3nGhqmkB] >>297 そしたら、catchの中で、 例外をprintするように改造して もう一回試してみるよ
301 名前:nobodyさん [2009/02/22(日) 22:15:38 ID:3nGhqmkB] >>299 一人当たり200万円しかもらえないじゃん
302 名前:nobodyさん [2009/02/22(日) 22:17:17 ID:3nGhqmkB] 例外を補足するようにコードを改造してみました。 一番下のところに catch (PDOException $e) { print( $e->getMessage()); } って入れただけですけど。 そしたら、以下のようになりました。
303 名前:nobodyさん [2009/02/22(日) 22:19:02 ID:3nGhqmkB] 1.php Fatal error: Maximum execution time of 60 seconds exceeded in C:\1.php on line 21 (さっきと同じ結果) -------------------------------------------------------- 2.php SQLSTATE[HY000]: General error: 5 database is locked There is already an active transaction There is already an active transaction There is already an active transaction Fatal error: Maximum execution time of 60 seconds exceeded in C:\2.php on line 28 -------------------------------------------------------- 2.phpについて、いままで出ていなかった 例外がレポートされるようになりました。
304 名前:nobodyさん [2009/02/22(日) 22:22:34 ID:3nGhqmkB] >>298 exec ってオートコミットモードがONでないと使えないのですか? もしかして、 $sql="UPDATE tb1 SET value = value + 1 WHERE id = '1'"; $sth = $dbh->prepare($sql);//プリペアードステートメント $sth->execute();//エクスキュート とかってやればOK?
305 名前:nobodyさん mailto:sage [2009/02/22(日) 22:26:36 ID:???] そうじゃなくて、begin済みなのにbeginするなってこと。 1.phpで例外が出ないで無限ループするのはおかしいからチェックしてみ
306 名前:nobodyさん [2009/02/22(日) 22:29:18 ID:3nGhqmkB] >>305 biginをループの外に出したら意味ないのでは? だってリトライできなくなるし。
307 名前:nobodyさん mailto:sage [2009/02/22(日) 22:31:48 ID:???] >>306 ろーるばっくすればいいじゃん >>298 さんが正解でしょ
308 名前:nobodyさん [2009/02/22(日) 22:34:36 ID:3nGhqmkB] とりあえずわけわかんなくなってきたので、 改造済みのコードを改めてはります。
309 名前:nobodyさん [2009/02/22(日) 22:35:58 ID:3nGhqmkB] 1.php <?php try { $oDbCxn = new PDO('sqlite:test1'); $oDbCxn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Error connecting to DB"); } $bUpdatePending = true; while ($bUpdatePending) { try { $oDbCxn->beginTransaction(); $oDbCxn->exec("UPDATE tb1 SET value = value + 1 WHERE id = '1'"); sleep(10); $oDbCxn->commit(); $bUpdatePending = false; // Exit the loop now the update has been done sleep(1); } catch (PDOException $e) { print( $e->getMessage()); $oDbCxn->rollback(); } } ?>
310 名前:nobodyさん mailto:sage [2009/02/22(日) 22:46:19 ID:???] 1.php側はループさせると、テストにならんから、 実行中のsleepだけでいいことにして、ループ外した方がよさげ。 それから、ロック以外の例外の時も無限ループしちゃうわけで・・・ まぁ、テストだからいいけど。
311 名前:nobodyさん mailto:sage [2009/02/22(日) 22:47:07 ID:???] 例外分かってないのでは?
312 名前:nobodyさん mailto:sage [2009/02/22(日) 22:48:00 ID:???] トランザクションも怪しいw
313 名前:nobodyさん [2009/02/22(日) 23:08:50 ID:3nGhqmkB] >>310 そしたらループはずしてみようかな?
314 名前:nobodyさん [2009/02/22(日) 23:17:01 ID:3nGhqmkB] よく考えたら、ロールバックしろ、とかいうアドバイスは無意味だな だってdatabase is lockedっていうエラーが出ているわけだから、 トランザクションをゲットできていないわけだから、 そもそもロールバックなんかしないわけで。
315 名前:nobodyさん [2009/02/22(日) 23:19:21 ID:3nGhqmkB] ソースコードを改変したので、 3.phpと4.phpということにしました。 3.php <?php try { $oDbCxn = new PDO('sqlite:test1'); $oDbCxn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Error connecting to DB"); } $bUpdatePending = true; try { $oDbCxn->beginTransaction(); $oDbCxn->exec("UPDATE tb1 SET value = value + 1 WHERE id = '1'"); sleep(10); $oDbCxn->commit(); $bUpdatePending = false; // Exit the loop now the update has been done sleep(1); } catch (PDOException $e) { print( $e->getMessage()); $oDbCxn->rollback(); } ?>
316 名前:nobodyさん mailto:sage [2009/02/22(日) 23:20:11 ID:???] >>315 前よく「質問」って書いてた人?
317 名前:nobodyさん [2009/02/22(日) 23:20:13 ID:3nGhqmkB] 4.php <?php try { $oDbCxn = new PDO('sqlite:test1'); $oDbCxn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Error connecting to DB"); } $bUpdatePending = true; while ($bUpdatePending) { try { $oDbCxn->beginTransaction(); $oDbCxn->exec("UPDATE tb1 SET value = value + 1 WHERE id = '1'"); $oDbCxn->commit(); $bUpdatePending = false; // Exit the loop now the update has been done } catch (PDOException $e) { // Update failed. Wait a while before trying again in the next loop print( $e->getMessage()); $oDbCxn->rollback(); } } ?>
318 名前:nobodyさん [2009/02/22(日) 23:22:14 ID:3nGhqmkB] 3.php −> 4.php という順番で実行する流れです 3.php −>10秒待つ 4.php −>待たないですぐに実行
319 名前:nobodyさん [2009/02/22(日) 23:22:53 ID:3nGhqmkB] 実験結果 3.php エラー無し カウントアップは成功している 4.php SQLSTATE[HY000]: General error: 5 database is locked カウントアップは成功している
320 名前:nobodyさん [2009/02/22(日) 23:36:10 ID:3nGhqmkB] あれ? もしかして、完成? 成功している??
321 名前:nobodyさん mailto:sage [2009/02/22(日) 23:38:30 ID:???] >>314 なんか勘違いしてないかい?
322 名前:nobodyさん [2009/02/23(月) 00:01:27 ID:DYtiHKsN] これでうまくいった 7.php −> 8.php 7.php wait 10seconds 8.php wait 0 7.php <?php try { $oDbCxn = new PDO('sqlite:test1'); $oDbCxn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Error connecting to DB"); } $bUpdatePending = true; while ($bUpdatePending) { try { $oDbCxn->beginTransaction(); $oDbCxn->exec("UPDATE tb1 SET value = value + 1 WHERE id = '1'"); sleep(10); $oDbCxn->commit(); $bUpdatePending = false; // Exit the loop now the update has been done } catch (PDOException $e) { sleep(3); $oDbCxn->rollback(); } } ?>
323 名前:nobodyさん [2009/02/23(月) 00:02:02 ID:DYtiHKsN] 8.php <?php try { $oDbCxn = new PDO('sqlite:test1'); $oDbCxn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Error connecting to DB"); } $bUpdatePending = true; while ($bUpdatePending) { try { $oDbCxn->beginTransaction(); $oDbCxn->exec("UPDATE tb1 SET value = value + 1 WHERE id = '1'"); $oDbCxn->commit(); $bUpdatePending = false; // Exit the loop now the update has been done } catch (PDOException $e) { sleep(3); $oDbCxn->rollback(); } } ?>
324 名前:nobodyさん [2009/02/23(月) 00:03:11 ID:DYtiHKsN] でも、8.phpの最後のほうの、 sleep(3); $oDbCxn->rollback(); これなんだけど、せっかくsleepを入れたのに、 sleepしているようすが見られない。 7.phpの実行が終わると、即座に 間髪いれずに、8.phpの実行も終了している。 なんでだ? 3秒待ってからロールバックしてるんじゃないのか?
325 名前:nobodyさん [2009/02/23(月) 00:03:49 ID:DYtiHKsN] あと、トランザクションをゲットしていないのに、 ロールバックするという意味がわからん。 いったいどこに戻っているというのだ?
326 名前:nobodyさん mailto:sage [2009/02/23(月) 00:16:50 ID:???] database is lockedはトランザクション自体ではなく、 その中のUPDATE文に対してのエラーである。 なので、トランザクション自体は開始されているので、 一旦ろーるばっくでトランザクションを改めてトランザクションを開始している。
327 名前:nobodyさん mailto:sage [2009/02/23(月) 00:17:43 ID:???] >一旦ろーるばっくでトランザクションを改めてトランザクションを開始している。 一旦ろーるばっくでトランザクションを閉じて、改めてトランザクションを開始している。
328 名前:nobodyさん [2009/02/23(月) 00:19:44 ID:DYtiHKsN] >>326-327 なるほどねー ようやくわかってきたわぁ きたわぁ きたわぁ
329 名前:nobodyさん [2009/02/23(月) 00:22:06 ID:DYtiHKsN] やっぱあれだな。 SQLiteの4つのロックのうち、 すぐにロックを獲得できるのを、 明示的に書かないとだめだな。 $oDbCxn->beginTransaction(); ↑これがダメってこと。 なぜなら、↑だと、デフォルトのロックが選択される。 SQLiteにおける、デフォルトのロックとは、defferd lockである。 これだと遅延するから、4つの処理をトランザクションではさみたい、 などという場合には不向き。
330 名前:nobodyさん mailto:sage [2009/02/23(月) 00:29:36 ID:???] busy_timeoutの設定をするんじゃだめなのか?
331 名前:nobodyさん [2009/02/23(月) 00:45:25 ID:DYtiHKsN] >>330 やったことある?
332 名前:nobodyさん [2009/02/23(月) 00:58:26 ID:DYtiHKsN] もう一つの懸念。 SQLiteはNFSというファイルシステムを使っているマシンで実行すると ぶっこわれるらしい。 NFSとはおもにUNIXで使われるファイルシステムらしい。 特にfreeBSDでよく使われるらしい。 自分が借りているレンタルサーバーはfreeBSDなので、 ひょっとしてSQLiteは使えないんじゃないか?
333 名前:nobodyさん mailto:sage [2009/02/23(月) 01:02:31 ID:???] NFS使ってるレンタルサーバなんてないから安心しろw
334 名前:nobodyさん mailto:sage [2009/02/23(月) 01:02:40 ID:???] jp.php.net/manual/ja/function.sqlite-open.php >ヒント >NFSパーティションにマウントされたSQLiteデータベースを処理すること は推奨されません。 >ロックに関してNFSは著しい問題があるので、 データベースを全くオープンすることさえできない可能性があります。 >ま た、成功した場合でも、ロックに関する動作は予測できない結果を生む可 能性があります。 だってさ。こっち調べるのが先じゃない?w
335 名前:nobodyさん [2009/02/23(月) 01:02:48 ID:DYtiHKsN] SQLiteには、 deferred, immediate, exclusive という3つの種類のロックがあるが、 どれを使うべきか?というのは、考えなくていいの? $dbh->beginTransaction(); これを使うと、自動的に、デフォルトの、ロックが 選択される。SQLiteにおけるデフォルトのロックとは deferred ロックである。 もし銀行口座などの実装をしたい場合、 exclusiveにしないとダメなのではないか? また、immediateって、なんのためにあるんだ? いつ使うんだ?
336 名前:nobodyさん [2009/02/23(月) 01:03:21 ID:DYtiHKsN] >>333 よかった
337 名前:nobodyさん mailto:sage [2009/02/23(月) 01:07:02 ID:???] ロックとトランザクションの違いを勉強してきたほうがいいんじゃないかな?
338 名前:nobodyさん mailto:sage [2009/02/23(月) 01:07:46 ID:???] 俺もそう思うw
339 名前:nobodyさん mailto:sage [2009/02/23(月) 01:29:03 ID:???] こいつ前いたキティだろ 通報しましたとかsqlite関連で腐るほど書き込んでた
340 名前:nobodyさん mailto:sage [2009/02/23(月) 01:29:11 ID:???] WikiとCMSってどう違うの
341 名前:nobodyさん mailto:sage [2009/02/23(月) 01:36:09 ID:???] >>316 をスルーしてる時点で確定
342 名前:nobodyさん mailto:sage [2009/02/23(月) 01:38:00 ID:???] >>340 WikiもCMSの一種だよ Wikiが他のCMSと違うのは、不特定多数によるサイト構築を主体とした構成になっている つかPHP関係ないじゃん
343 名前:nobodyさん [2009/02/23(月) 02:23:27 ID:DYtiHKsN] もしかしてwhileいらないんじゃないか? sleepしてrollbackだけでいいんじゃないか?
344 名前:nobodyさん mailto:sage [2009/02/23(月) 03:33:25 ID:???] こいつプログラム板の方とマルチだった pc11.2ch.net/test/read.cgi/tech/1232712334/284-
345 名前:nobodyさん mailto:sage [2009/02/23(月) 03:44:00 ID:???] 派遣先の歓迎会などで、趣味を聞かれることがあります。 私の趣味は豊富で下記のとおりです。 ・アニメ、エロゲ、同人誌、アニソン ・風俗、ストリップ鑑賞 ・声優、秋葉系アイドルイベント参加 しかし、これを言うと、おそらくひかれてしまいます。。。 なんて言えばよいのでしょうか? 休みの日は何をしてる?と聞かれても、声優ライブの最前線で サイリウムをもって、跳んでいるなんて言えません。
346 名前:nobodyさん [2009/02/23(月) 04:39:47 ID:cBNbBaFX] $a = "aaa" if(preg_match("/^[0-9]+$/",$a) == true){ echo "ok"; }else{ echo "dame"; } でdameになってくれるのに(if(preg_match("/^[0-9]+$/",$a)でもいけた)、 if(preg_match("/^[0-9]+$/",$a) !== false){ echo "ok"; }else{ echo "dame"; } だと$aを何にしても全部okになる・・ なんで><
347 名前:nobodyさん [2009/02/23(月) 04:40:33 ID:cBNbBaFX] →$a = "aaa";
348 名前:nobodyさん mailto:sage [2009/02/23(月) 04:52:33 ID:???] >>346 jp.php.net/preg_match
349 名前:nobodyさん [2009/02/23(月) 05:29:48 ID:DYtiHKsN] <?php try { $oDbCxn = new PDO('sqlite:test1'); $oDbCxn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Error connecting to DB"); } $bUpdatePending = true; while ($bUpdatePending) { try { $oDbCxn->query("BEGIN EXCLUSIVE TRANSACTION"); // $oDbCxn->beginTransaction(); $oDbCxn->exec("UPDATE tb1 SET value = value + 1 WHERE id = '1'"); $oDbCxn->commit(); $bUpdatePending = false; // Exit the loop now the update has been done } catch (PDOException $e) { print $e->getMessage(); $oDbCxn->rollback(); } } ?>
350 名前:nobodyさん [2009/02/23(月) 05:30:39 ID:DYtiHKsN] >>349 実行すると、なんでエラーになるの? PHP5 + PDO + SQLite3 ---------------------------------- database structure id | name| value 1 | value| 5 ------------------------------- database name = test1 table name= tb1
351 名前:nobodyさん [2009/02/23(月) 05:33:14 ID:DYtiHKsN] トランザクションをスタートするのに、 $oDbCxn->query("BEGIN EXCLUSIVE TRANSACTION"); はダメで、 $oDbCxn->beginTransaction(); なら良い、というのはおかしい。 なぜエラーになるの?
352 名前:nobodyさん [2009/02/23(月) 06:48:25 ID:c878IibK] 教えて下さい。 test.txt というutf-8のファイルがあって中に文とかphpの変数とかが書いてあります。 これをsjisのtest.phpで読み込み表示させたいのですがincudeだと文字化けします。 どうすれば表示できますか?
353 名前:nobodyさん mailto:sage [2009/02/23(月) 06:59:44 ID:???] <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS" /> を吐いてやる
354 名前:nobodyさん mailto:sage [2009/02/23(月) 07:08:52 ID:???] >>353 その知識で回答しようと思えるなんて素直に感心するよ
355 名前:nobodyさん [2009/02/23(月) 07:20:40 ID:cBNbBaFX] >>348 自分なりに調べてみました>< mb_eregでは !== false でいけたので、それも一緒に比べてみたら 返り値のとこが、 mb_ereg >正規表現に一致しないか、 エラーを発生した場合に FALSE を返します。 preg_match >preg_match() は、エラーが発生した場合にFALSEを返します。 でした。 preg_matchは正規表現に一致しないときはfalseを返してくれないので、 !== falseがスルーされたということでよいのでしょうか?>< 今まで全部!== falseでできると思っててそれでやってたので変更が大変ですが preg_matchのときは==とか何もつけないバージョンでやっておきます>< ありがとうございました
356 名前:nobodyさん mailto:sage [2009/02/23(月) 07:29:25 ID:???] >>352 逆だUTF-8の方 両方使いたいなら変換かけるべし
357 名前:nobodyさん mailto:sage [2009/02/23(月) 16:02:31 ID:???] OS linux PHP ver 5.2.5 連携 とくになし <? //------------------------------------------------ //ペット可否 //------------------------------------------------ function GetPet_F($int) { $res = ""; if($int=="0") $res = "不可"; else $res = "可能"; return $res; } print GetPet_F(0); ?> 以上ソースコードでsyntax error, unexpected $end出るんですが何が原因なんでしょうか・・・
358 名前:357 [2009/02/23(月) 16:02:51 ID:yJ3BEx4Z] ID出すの忘れ
359 名前:nobodyさん mailto:sage [2009/02/23(月) 16:12:39 ID:???] あれ、流出してる?
360 名前:nobodyさん mailto:sage [2009/02/23(月) 16:31:29 ID:???] >>352 eval(mb_convert_encoding(file_get_contents('test.txt'), 'Shift-JIS', 'UTF-8')); >>357 構文に間違いはないから スクリプトのエンコーディングが mbstring.script_encoding と合ってないんでしょう
361 名前:nobodyさん [2009/02/23(月) 16:37:17 ID:yJ3BEx4Z] 可能の能抜いたらエラー出なかったです・・・ なんなのだろう
362 名前:nobodyさん mailto:sage [2009/02/23(月) 16:46:30 ID:???] >>357 原因は、Shift Jisの5C問題だね。 能のShift Jisのコードが94 5C 5Cはバックスラッシュ(Shift Jisだと¥)なので、 PHPのパーサが、終わりのダブルクォーテーションを文字列と認識してしまう。 結果、文字列が閉じられていないと判断されて、エラーになる。
363 名前:nobodyさん mailto:sage [2009/02/23(月) 17:31:12 ID:???] 今時SJISでスクリプト書くやつなんていんの? 話は変わるが echo '<table 〜'. '〜〜〜〜〜〜〜〜〜'. '〜〜〜〜〜〜〜〜〜'. '〜〜〜〜〜〜〜〜〜'. '〜〜〜〜〜〜〜〜〜'; 引継ぎでプログラムのソースコード見たらこうなってた まじ簡便してくれ・・・orz あと、同じ要領でechoでJavaScriptとか吐き出してるのもやめてくれ クエリはまだ許せる 仕事でプログラムするときはほかの人にわかりやすいコードにしてください これまじでお願い
364 名前:nobodyさん mailto:sage [2009/02/23(月) 17:59:46 ID:???] --enable-zend-multibyte付けてmbstring.script_encodingを設定すりゃ Shift-JISだろうが何で書こうがそいつの自由だ 雑談スレに行けクズ
365 名前:nobodyさん [2009/02/23(月) 21:03:10 ID:cBNbBaFX] また質問させていただきます $aa = "AA"; $bb = "bb"; $sql = "SELECT * FROM v001upfile WHERE :AA = :BB"; $result = executeQuery($sql); $result->bindParam(":AA",$aa,PDO::PARAM_STR); $result->bindParam(":BB",$bb,PDO::PARAM_STR); $result->execute(); $row = $result->fetchAll(); $rows = count($row); のようにすると、whereに該当するデータがなく、$rowsも0になってしまいます。いろいろしていると、 $sql = "SELECT * FROM v001upfile WHERE AA = :BB"; とするとデータが得られました。 どうやらwhere :AAのbindのパラメータ、PDO::PARAM_STR で、'AA'とされてしまっているから?、だめのような気がするのですが、 解決策ありましたらよろしくおねがいします
366 名前:nobodyさん mailto:sage [2009/02/23(月) 21:21:42 ID:???] >>365 それ駄目だ、俺も悩んだ WHERE $AA = ?か、 ? = ?にしたよ SELECTでbindValueとbindParamは使わない方がいいって グーグル先生が言ってた
367 名前:nobodyさん mailto:sage [2009/02/23(月) 21:33:37 ID:???] PDO::PARAM_STMT
368 名前:nobodyさん mailto:sage [2009/02/23(月) 21:36:22 ID:???] カラム名にPARAM_STR使うなよ アホかw
369 名前:nobodyさん [2009/02/23(月) 22:03:46 ID:ikSisMyc] 【OS名】CentOS 5.0 【PHPのバージョン】php5.2 【連携ソフトウェア】JavaScript Smarty 【質問内容】 ユーザがログインに成功したときにセッションに値をセットして 次にページにアクセスしてきた時にSmartyで値があるか確認して初期化処理 例: {{if $smarty.session.foo == 'bar'}} init(); //これはJScriptの関数 {{/if}} をしたいんですけど、ブラウザを終了するとセッションまで破棄されてしまいます。 ご教授お願いいたします。
370 名前:nobodyさん [2009/02/23(月) 22:06:30 ID:cBNbBaFX] >>366 sql文に直接変数入れる方法でしました。できました。 ありがとうございました >>367 ,368 やってみたのですが、反応としては356とほぼ同じでした マニュアルのパラメータ一覧のものをいろいろ代えてやってみたのですが どうもうまくいきませんでした。
371 名前:nobodyさん mailto:sage [2009/02/23(月) 22:12:39 ID:???] >>369 セッションはブラウザを終了すると破棄されるものです 継続したいならクッキーを使うといいよ
372 名前:nobodyさん mailto:sage [2009/02/23(月) 22:28:00 ID:???] >>370 そのいろいろかえてやってみた、の中に正解が入ってないわけだな。 ビット和はとったのか。まぁ、いいや。メンドクセ
373 名前:nobodyさん [2009/02/23(月) 22:55:40 ID:DYtiHKsN] なぜEXCLUSIVEはトランザクション開始直後に ジャーナルファイルを作成しないのか?
374 名前:nobodyさん mailto:sage [2009/02/23(月) 22:59:36 ID:???] アホか
375 名前:369 mailto:sage [2009/02/23(月) 23:03:42 ID:???] >>371 PHPSESSIDをクッキーに格納する仕様と勘違いしてました。 ありがとうございました。
376 名前:nobodyさん [2009/02/24(火) 00:24:39 ID:r/vu3Jnx] ∩_ 〈〈〈 ヽ 〈⊃ } ∩___∩ | | | ノ ヽ ! ! / ● ● | / | ( _●_) ミ/ <ココまでアホばかり 彡、 |∪| / / __ ヽノ / (___) /
377 名前:nobodyさん mailto:sage [2009/02/24(火) 07:08:35 ID:???] pdoで急にinsertできなくなった・・ エラーなしで何事もなく終わってるのに肝心のinsertだけできていない・・