[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 05/09 18:38 / Filesize : 104 KB / Number-of Response : 378
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【PHP】下らねぇ質問はID出して書き込みやがれ 81



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を表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)

◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。


100 名前:nobodyさん mailto:sage [2009/02/19(木) 21:26:33 ID:???]
すいませんIDがJPG

101 名前:nobodyさん mailto:sage [2009/02/19(木) 21:30:18 ID:???]
>>98
そのURLのソース試してみたか?
問題ないぞ。

102 名前:nobodyさん mailto:sage [2009/02/19(木) 21:31:03 ID:???]
>>99
何だって良いんじゃない?
<>sv なんてのも可だし

103 名前:nobodyさん mailto:sage [2009/02/19(木) 21:32:32 ID:???]
つうか、htmlspecialcharsの第2引数と第3引数をちゃんと指定していれば問題なし。

シングルクォートとダブルクォートをミックスすると表示は崩れるがXSSはできない。

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:???]
俺だせえ。
> 別の表現(&lt;)に置き換える。
な。

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だけできていない・・






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<104KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef