09/02/21 14:28:48
>>209
わかる・わかんないの、俺に対しての批判はどうでも良いんだよ。
「なぜhtmlspecialcharsは駄目なんだ」って事だ
214:nobodyさん
09/02/21 14:29:08
>>208
phpMyAdminをなめてんの?
別にスクリプトが混入したって何もおきないよ。
もし、そこでスクリプトインジェクションされんならIPA行きだお
215:nobodyさん
09/02/21 14:30:21
>>213
> 「なぜhtmlspecialcharsは駄目なんだ」
既出
216:nobodyさん
09/02/21 14:30:27
お前ら、自分の視野で物事考えすぎだよ。
「phpMyAdminなんて使ってるの?」って言葉がここで出てくると思わなかったぜw
ここのスレの役割考えろや。どうせ個人叩きしかできないくせに。
217:nobodyさん
09/02/21 14:30:31
>>208
全部わかったうえで一部分だけ簡単に書いてます、って言ってるやつの文章じゃないよそれ
結局DB格納時にhtmlspecialchars使ってるんじゃん
218:nobodyさん
09/02/21 14:31:22
>>216
phpMyAdmin → 画面出力時のお話
SQLインジェクションからかけ離れてきました・・・
219:nobodyさん
09/02/21 14:32:07
>>206
> 俺は自作クラス作ってDB処理をしているから変換ミスがどうのこうのはない。
変換とか言ってる段階で、その自作クラスが穴だらけに1000カノッサ
220:nobodyさん
09/02/21 14:36:47
> それに、htmlspecialcharsで変換しないでそのまま格納したとする
> その場合、phpMyAdminなどで管理する時。どうなるかわかるよな?
phpMyAdminは出力時サニタイズをすっかり忘れてる、ってこと?
221:nobodyさん
09/02/21 14:38:07
サニタイズってトイレにでも行く気?
222:nobodyさん
09/02/21 14:38:47
>>185
ENTQUOTES
ENTQUOTES
ENTQUOTES
ENTQUOTES
ENTQUOTES
ENTQUOTES
ENTQUOTES
ENTQUOTES
223:nobodyさん
09/02/21 14:40:08
おまえらとどめは刺さないよなww
224:nobodyさん
09/02/21 14:40:18
>>219
>>201が「俺はMySQLでの危険文字を全て列挙すら出来ない低能」と
言ってる意味を理解できていない、に1000カノッサ上乗せ
225:nobodyさん
09/02/21 14:46:08
>>185
語る以前にエラーになる件
226:nobodyさん
09/02/21 15:07:41
↓アクセスするとGoogleに飛ぶんですがどういう仕組みですか?
URLリンク(www.yahoo.xxco.jp)
227:nobodyさん
09/02/21 15:11:56
%はあんまり伝わらなかったみたいだなー。
SQLとHTMLでは、特殊な扱いになる文字が違うよってことだけど。
htmlspecialchar()でも問題なく見えるのは、たまたま、だと思ったほうがいいよ。
偶然にも、置き換え対象になる文字がSQLでエスケープが必要な文字と同じだったってこと。
ついでに言えば、エスケープの仕方は実際はDB依存だから
addslashes()じゃなく、DB専用の関数を使ったほうがいい。
228:nobodyさん
09/02/21 15:13:44
>>160 からの流れ、断ち切っておくか・・・
・DBに渡す際にPDOのプレースホルダで渡す、または専用関数(mysql_real_escape_string)でクエリを構成。
・html出力時にhtmlspecialchars(,ENT_QUOTES)をする。
※DBに渡す際にhtmlspecialcharsするのは間違い。
→ 理由 >>188
→ それでも分からない。 >>163の本を読め。
229:nobodyさん
09/02/21 15:18:48
>>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: URLリンク(www.google.co.jp)
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8
230:nobodyさん
09/02/21 16:10:53
素人だけど、俺より酷いプロらしき人が入るのを見て安心したような不安になったような…
231:nobodyさん
09/02/21 16:11:49
>>226
xxco.jpの管理人が、
www.yahooo.xxco.jpへアクセスした場合に
「Location: URLリンク(www.google.co.jp)」へリダイレクト(302)するようにしているだけ。
<?php
header('Location: URLリンク(www.google.co.jp)', True, 302);
?>
232:nobodyさん
09/02/21 16:25:04
>>231
サンクス
xxcoってドメインか
233:nobodyさん
09/02/21 16:35:25
べ・・・別に!
僕レンタルサーバー使ってるからね!
エスケープしなくても安全よっ!
234:nobodyさん
09/02/21 19:59:23 230PJjNE
【OS名】MacOS X (MAMP)
【PHPのバージョン】php5.2.5
【連携ソフトウェア】mysql
【質問内容】
Webアプリケーションで、ウィンドウ毎に違う情報を引き継いで処理をしていく物を作っています。
uniqid()でセッションIDを割り振って、formのhiddenに入れると引き継げるのは分かりました。
しかしこれだと、link(aタグ)で機能を選択した場合に、セッションIDが引き継げないように
思います。ですよね??何か良い方法はありませんか?
リンクのパラメータに追加するとなると、全部のリンクに書き足す必要があって大変だし、
POSTとGETの両方の評価が必要になると煩雑だし、そもそもurlにセッションIDを出すのが
微妙に避けたいので・・・。
お知恵を拝借したいです。よろしくお願いいたします。
235:教えて
09/02/21 20:15:36 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さん
09/02/21 20:16:32
ふつうセッションIDはCOOKIEで渡す
ケータイの場合はGET渡ししかない
237:nobodyさん
09/02/21 20:17:25
>>235
出したんなら良かったな
238:nobodyさん
09/02/21 20:21:23
モバゲーで鳴らした俺はこの程度の日本語崩壊くらいなんて事は無い
モバゲーではこの程度の言語障害者珍しくも無い
マジ日本はどこへ向かうんだ
$numbers = range(1, 20);
shuffle($numbers);
echo array_pop($number);
// なんか処理
echo array_pop($number);
// なんか処理
echo array_pop($number);
…
1ページ内の処理ならこれでいける。
2枚以上の画面にわたって変数を持って行きたいならセッションを使うしかない。
239:234
09/02/21 20:33:28 230PJjNE
>>236
COOKIEですか・・・ちょっと調べてみます。ありがとうございます。
クライアントはパソコンなので、GETでもPOSTでも使えます。
COOKIEでもウィンドウ毎って可能なんですか?
240:nobodyさん
09/02/21 20:38:24
>>239
パソコンならhiddenを使う必要ない。セッションはクッキーが勝手に確立してくれる
GETやらPOSTも意識する必要ない。セッションに少し慣れればすべて解決する
別ウインドウのことを言ってるのだとしても
リンクやフォームから作成された別ウインドウは同一セッションとなる
241:234
09/02/21 20:51:05
>>240
同一セッションでは困るんですが・・・ウィンドウ毎に分けたいので・・・
242:nobodyさん
09/02/21 20:54:07
>>241
であればウインドウごとにID発行してそれをセッションで持ちまわす
243:242
09/02/21 20:58:18
ごめん、うそついた
同一セッションで別ID発行してもセッションが上書きされるだけだからダメか
244:nobodyさん
09/02/21 20:59:36
入力->フィルター->エスケープ->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さん
09/02/21 21:09:52
>>244
俺も取り出しのあとのフィルターってのはよくわからん
DBには正しいものが入ってるはずだしな
でもhtml適合化は必要だろ。そのコードだとScript実行されるよ
246:234
09/02/21 21:10:06
>>243
そうなんです。>234の様にformかurlに入れれば、
とりあえずウィンドウ毎に別の情報を引き継げます。
だけど、formとurlの両立が難しい。
何か、簡単にウィンドウ毎を識別する方法があれば・・・
247:244です。
09/02/21 21:15:34
htmlspecialcharsか
248:nobodyさん
09/02/21 21:17:49
>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さん
09/02/21 21:20:12
>>244
>入力->フィルター->エスケープ->DB -> 取り出し-> フィルター -> html適合化 -> 表示
どこにそんなことが書いてある?
入力 -> エスケープ -> DB -> 取り出し -> サニタイズ -> 表示
これでいい
250:nobodyさん
09/02/21 21:26:33
>>249
サニタイズってのは、入力値に不正な値や壊れた文字列が入っていないかをチェックするもの。
やるなら、入力の直後だが、サニタイズって言うと、>>249みたいな誤解をするやつがいるから、
入力後にやるのが、バリデート+フィルター。
251:nobodyさん
09/02/21 21:28:51
DBからの取り出し後にフィルターを書ける理由
DBってのはデータストア。
収録されたデータをすべて出力していいとは限らないし、
形式によってはフィルターをかける必要がある。jk
252:nobodyさん
09/02/21 21:33:13
>>250
入力段階でチェックするのはvalidate
sanitizeは表示段階で、浄化、つまり悪意のあるスクリプトやタグを無効にするもの
253:nobodyさん
09/02/21 21:43:54
フィルターって要するにバリデートだろ。
エスケープやサニタイズとは別の話題。
254:nobodyさん
09/02/21 21:44:23
>>252
まぁ、そう思っててもいいけどな。
それは、htmlspecialcharsをサニタイズだと思っている子たちの誤解
悪意と善意を確実に識別できるのはどこかを考えれば正解はどっちかわかるはずだが、
困ったことに、サニタイズ≒出力フィルタだと書いちまってるサイトやら本があるからなぁ。
要するに、サニタイズなんて曖昧なメタファーでプログラムを語るなってことだ。
255:nobodyさん
09/02/21 21:45:32
>>253
バリデートはフィルターに含まれる。
エスケープとは別。
で、何が言いたいの?
256:nobodyさん
09/02/21 21:46:05
>>251
具体的にどういうデータだったらそのフィルターとやらをかけるの?放送禁止用語とか?
257:nobodyさん
09/02/21 21:47:37
>>254
htmlspecialcharsもサニタイズの一種だろ。話を難しくしすぎ
258:234
09/02/21 21:48:33
>>248
そうですよね。ありがとうございます。
固有URLの実装方法は分かりませんし、
そもそもフレームワークにCakePHPを使うので、そういうURLなのです。
リンクじゃなくて、全てformのボタンにするのも手ですかねぇ・・・。
259:nobodyさん
09/02/21 21:49:18
>>256
放禁みたいなNGフィルター、SNS用の権限フィルター
多端末対策で文字コード変換フィルター
スクリプト許可端末、スクリプト拒否端末用の変換フィルター
タグ許可・不許可
まぁ、なんでもいいでしょ
260:nobodyさん
09/02/21 22:00:32
バリデート
検証。入力値などに問題が無いかをチェックする(チェックした後どうするかは知らない)。
フィルタ
入力値をチェックし、ヤバいものは除去する、ないし弾く(エラーにする、無視する)。
サニタイズ
消毒。転じて無害化。害の無いものにする。変換・置換など無害化の方法は多数あるが。。
エスケープ
ある環境で特殊な意味を持つ値(HTMLならば<など)を、その環境のルールで規定された別の表現(<)に置き換える。
ダブルクォート中で"の前にバックスラッシュを置くのもエスケープ。
どれがベストかというと、どの表現も曖昧さが残るので使うべきではない。
DBへの入力の無害化処理と、HTML出力への無害化処理は違うし、無害化の方法も1通りではない。
設計初期などで抽象度を残した表現をしたい時くらいしか使わないな。
>259は文脈を意図的に曲解した例。
261:nobodyさん
09/02/21 22:01:28
>>257
htmlspecialchars=html適合化っていう具体的かつ正確な言葉があるのに、
曖昧かつ誤解に満ちて見解が分かれるサニタイズなんて言葉にする必要はないだろ。
262:nobodyさん
09/02/21 22:01:39
俺だせえ。
> 別の表現(<)に置き換える。
な。
263:nobodyさん
09/02/21 22:05:41
>>260
> ダブルクォート中で"の前にバックスラッシュを置くのもエスケープ
PHPとかJSならエスケープだが、HTML中でこれができると思ってしまう奴もいるらしいからな。
HTML出力時にaddslashesするやつとか、
DBに入れる前にhtmlspecialcharsする奴とか、
入力時に両方処理する奴とか、
ほんと、ウンコだな
264:nobodyさん
09/02/21 23:03:26
>>263
自分のこといってるんですね
わかります。
265:nobodyさん
09/02/21 23:17:26
>>263はうんこ
266:nobodyさん
09/02/21 23:33:28
ほんと、ウンコだな
267:nobodyさん
09/02/21 23:47:51
叩かれる理由のない>>263を叩いてるのは
昼にhtmlspecialcharsの件で叩かれてたやつだろ
268:nobodyさん
09/02/21 23:49:41
>>263はうんこ
269:nobodyさん
09/02/22 00:00:19
>263
良く分からないけどやーいやーいうんこうんこー
270:nobodyさん
09/02/22 00:13:17
うんこを馬鹿にしたやつ全員明日から便秘に悩む。
271:nobodyさん
09/02/22 00:31:09 bY3v8MvV
>>270
のせいで、便秘ではないがうんこが止まらない。
この1時間で4回うんこにいっている
272:nobodyさん
09/02/22 00:34:34
<?=str_repeat( 'うんこ', date('s') )?>
273:234
09/02/22 00:46:35 JUr+Er3M
リンクやPOSTで受け取るデータの他に、元のページから送られてくるデータって
何か無いかな・・・って考えてたら・・・$_SERVER['HTTP_REFERER']が使え
ないかなぁ?って思ったのですが。どうでしょうか?
例えばheaderのmetaとかでreferer urlを変更して、セッションIDを追加したり
とか出来ないでしょうか。
他にも、何か使えそうなデータって無いでしょうか?
274:nobodyさん
09/02/22 01:01:49
>>273
refererは自由に変えられるし、飛ばさないブラウザもあるし信用ならないよ
まず別セッションにしたい理由がわからん
ユーザーに複数セッションを使わせたいという状況は想像できないし
自分が複数セッション使いたいならブラウザもうひとつ立ち上げればよいだけ
275:234
09/02/22 01:27:54 JUr+Er3M
>>274
refererが信用ならないのはおっしゃる通りです。ご指摘ありがとうございます。
リファラ出さないブラウザは対象外って事で良いのです。
複数セッションを使うために、別のブラウザを立ち上げれば済むのもご指摘通り。
自分だけで使うなら、その方が簡単なのですが。
例を挙げると、ウィンドウ1つに一人分の情報を表示/編集できる、マルチ・
ウィンドウの住所録ソフトみたいなものを想定しています。
ウィンドウ毎に別セッションにしないと無理じゃないかと思いました。
他に、定石があるようでしたら教えて下さい。
よろしくお願いいたします。
276:nobodyさん
09/02/22 02:04:13
あなたがたは無職なのに
なんで質問に回答するときはえらそうな
態度なの?
277:nobodyさん
09/02/22 03:06:25 3nGhqmkB
SQLite3 + PDO で、
1つ目のプロセスがトランザクション張ってて、
2つ目のプロセスがトランザクション張ろうとして、
当然1が既にデーターベースをロックしてるから、
2はロックを取得できなくて、そんで
SQLITE_BUSYが帰ってきて、
database is locked
ってわかったとき、
しばらくsleepさせて、リトライ
って処理、どうやって書けばいいの?
どっかにサンプルコードある?
278:nobodyさん
09/02/22 04:28:08
>>277
そこまで分かってるならforなりでいくらでも書けそうだけど・・
具体的にどこが分からないのよ
279:nobodyさん
09/02/22 18:00:44
例えばURLリンク(test.jp)とういうサイトで、
ユーザ登録(ユーザ名をuserで登録)して、ページを開設する
↓
URLリンク(test.jp) みたいに自分のページができる
↓
このページを誰もがある程度操作できる(お絵かき掲示板とか、ブログのコメ投稿とか)
mixiなどのようにログインページがいらないので次回からこのページは
URLリンク(test.jp)が存在する限り、だれもがこのurlから訪問することができる。
みたいなサイトみて思ったのですが、
1./user/の部分は実際にサイトの鯖でuser専用のディレクトリやそこに.phpなどを作っているのでしょうか?
2.それとも、apacheだったらhttpd.confなんかで、
URLリンク(test.jp) → URLリンク(test.jp) みたいな変換をしているのでしょうか?
しかし2.の方法だと、userというページがあるかどうかをどうやって判断しているんでしょう・・
適当に、userid=tekitouとかしてみたときに、URLリンク(test.jp)となってしまい、そのページが
あるかないかの判断はいろんな方法でできると思うのですが、ユーザ登録が増えれば増えるほど
その判断する速度は落ちるような気がしてしまうのです・・
そもそも2の時点で他の方法でユーザを管理しているかもしれません、
上のようなサイトの、ユーザ管理とその引き出しはどう管理しているのか、
大体でもいいので教えていただけないでしょうか
よろしくお願いします
280:278
09/02/22 18:01:32 euIhPE01
id
281:nobodyさん
09/02/22 18:03:04
>>279
今の主流は動的URLを性的URLに変化する
URLリンク(example.com)→URLリンク(example.com)
DBにデータを保存しておいてページのIDで呼び出す
282:nobodyさん
09/02/22 18:09:47 euIhPE01
すいません>>280の名前は279でした
>>281
なるほど、DBを使ってユーザーのページに誰かが訪れるその度に
検索呼び出ししているということでしょうか。
なんかすっきりしましたありがとうございました
283:nobodyさん
09/02/22 18:12:49
>>282
ちなみに毎回DBから同じ情報ひっぱってくるのは負荷かかるから
キャッシュを使ってるのが多いと思う
(ここはまたSmartyとか覚えたときにやってみるといい)
284:nobodyさん
09/02/22 18:16:29 euIhPE01
>>283
Smartyですか、参考に調べてみます
ありがとうございました!
285:nobodyさん
09/02/22 21:21:50 3nGhqmkB
>>278
while で書いたけど、
deadlockになるのです
286:nobodyさん
09/02/22 21:47:52
具体的にどう書いたか見せたほうが答えてもらいやすいと思うが・・
恥ずかしがらないで
287:nobodyさん
09/02/22 21:50:36 3nGhqmkB
>>286
1.php と 2.php と2つのファイルを用意して、
以下のテストを行いました。
「テスト1」
1.phpを単独で実行する -> OK
「テスト2」
2.phpを単独で実行する -> OK
「テスト3」
1.php -> 2.php という順番で実行する -> deadlock発生
こういう状況です。
288:nobodyさん
09/02/22 21:52:30 3nGhqmkB
1.phpは、トランザクション中に
sleep(10);
をかませて、ゆっくり実行するようにしてあります。
このゆっくりタイムに、いそいで2.phpを実行する、という
テストです。
289:nobodyさん
09/02/22 21:53:36 3nGhqmkB
環境は、PHP5 + PDO + SQLite3 です。
データーベース構造は、
id | name| value
1 | bond | 5
database name = test1
table name= tb1
です。
290:nobodyさん
09/02/22 21:54:35 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さん
09/02/22 21:55:09 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さん
09/02/22 21:57:20 3nGhqmkB
1.phpと2.phpの違いは、sleep(10)があるか、ないかというだけです。
それ以外は全部同じです。
SQLiteはトランザクション中に、別のトランザクションを発生させようとすると
1秒も待たずに「database is locked」になるので、
ウエイト->リトライ、という処理を自分で書かないといけません。
これがイマイチ普及しない最大のポイントだと思いますが、
その処理の書き方についての質問です。
なぜかデッドロックになってしまうのです
293:nobodyさん
09/02/22 21:57:20
え?ループ内にトランザクション?
294:nobodyさん
09/02/22 21:57:55 3nGhqmkB
>>293
だってリトライしないといけないわけだから。
なんか間違ってる?
295:nobodyさん
09/02/22 22:01:33
例外が発生するポイントは、beginかexecか調べた?
296:nobodyさん
09/02/22 22:03:13 3nGhqmkB
>>295
例外は発生しないにょ
ずーーーっと実行中のままになって、
最後にはタイムアウトになるんだにょ
PHPのデフォルトタイムアウトが60秒だから
60秒でタイムアウトになるにょ
297:nobodyさん
09/02/22 22:04:43
>>296
おいおい、
例外にならなかったら、falseが設定されるでしょうが。
例外をcatchして捨ててるだけでしょうが。
298:nobodyさん
09/02/22 22:06:21
beginTransactionでオートコミットモードがオフになる。
execに失敗する。
もう一度、beginTransactionをかけるが、既にbeginされてるので例外発生
で、またループ。
beginをループの外に出すかcatchしたときにロールバックしてみたらどうかね
299:nobodyさん
09/02/22 22:13:32
EC-CUBEのカスタマイズで1000万て安い?
ちなみに1年、5人担当
300:nobodyさん
09/02/22 22:15:02 3nGhqmkB
>>297
そしたら、catchの中で、
例外をprintするように改造して
もう一回試してみるよ
301:nobodyさん
09/02/22 22:15:38 3nGhqmkB
>>299
一人当たり200万円しかもらえないじゃん
302:nobodyさん
09/02/22 22:17:17 3nGhqmkB
例外を補足するようにコードを改造してみました。
一番下のところに
catch (PDOException $e) {
print( $e->getMessage());
}
って入れただけですけど。
そしたら、以下のようになりました。
303:nobodyさん
09/02/22 22:19:02 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さん
09/02/22 22:22:34 3nGhqmkB
>>298
exec ってオートコミットモードがONでないと使えないのですか?
もしかして、
$sql="UPDATE tb1 SET value = value + 1 WHERE id = '1'";
$sth = $dbh->prepare($sql);//プリペアードステートメント
$sth->execute();//エクスキュート
とかってやればOK?
305:nobodyさん
09/02/22 22:26:36
そうじゃなくて、begin済みなのにbeginするなってこと。
1.phpで例外が出ないで無限ループするのはおかしいからチェックしてみ
306:nobodyさん
09/02/22 22:29:18 3nGhqmkB
>>305
biginをループの外に出したら意味ないのでは?
だってリトライできなくなるし。
307:nobodyさん
09/02/22 22:31:48
>>306
ろーるばっくすればいいじゃん
>>298さんが正解でしょ
308:nobodyさん
09/02/22 22:34:36 3nGhqmkB
とりあえずわけわかんなくなってきたので、
改造済みのコードを改めてはります。
309:nobodyさん
09/02/22 22:35:58 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さん
09/02/22 22:46:19
1.php側はループさせると、テストにならんから、
実行中のsleepだけでいいことにして、ループ外した方がよさげ。
それから、ロック以外の例外の時も無限ループしちゃうわけで・・・
まぁ、テストだからいいけど。
311:nobodyさん
09/02/22 22:47:07
例外分かってないのでは?
312:nobodyさん
09/02/22 22:48:00
トランザクションも怪しいw
313:nobodyさん
09/02/22 23:08:50 3nGhqmkB
>>310
そしたらループはずしてみようかな?
314:nobodyさん
09/02/22 23:17:01 3nGhqmkB
よく考えたら、ロールバックしろ、とかいうアドバイスは無意味だな
だってdatabase is lockedっていうエラーが出ているわけだから、
トランザクションをゲットできていないわけだから、
そもそもロールバックなんかしないわけで。
315:nobodyさん
09/02/22 23:19:21 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さん
09/02/22 23:20:11
>>315
前よく「質問」って書いてた人?
317:nobodyさん
09/02/22 23:20:13 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さん
09/02/22 23:22:14 3nGhqmkB
3.php -> 4.php
という順番で実行する流れです
3.php ->10秒待つ
4.php ->待たないですぐに実行
319:nobodyさん
09/02/22 23:22:53 3nGhqmkB
実験結果
3.php エラー無し
カウントアップは成功している
4.php
SQLSTATE[HY000]: General error: 5 database is locked
カウントアップは成功している
320:nobodyさん
09/02/22 23:36:10 3nGhqmkB
あれ?
もしかして、完成?
成功している??
321:nobodyさん
09/02/22 23:38:30
>>314
なんか勘違いしてないかい?
322:nobodyさん
09/02/23 00:01:27 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さん
09/02/23 00:02:02 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さん
09/02/23 00:03:11 DYtiHKsN
でも、8.phpの最後のほうの、
sleep(3);
$oDbCxn->rollback();
これなんだけど、せっかくsleepを入れたのに、
sleepしているようすが見られない。
7.phpの実行が終わると、即座に
間髪いれずに、8.phpの実行も終了している。
なんでだ?
3秒待ってからロールバックしてるんじゃないのか?
325:nobodyさん
09/02/23 00:03:49 DYtiHKsN
あと、トランザクションをゲットしていないのに、
ロールバックするという意味がわからん。
いったいどこに戻っているというのだ?
326:nobodyさん
09/02/23 00:16:50
database is lockedはトランザクション自体ではなく、
その中のUPDATE文に対してのエラーである。
なので、トランザクション自体は開始されているので、
一旦ろーるばっくでトランザクションを改めてトランザクションを開始している。
327:nobodyさん
09/02/23 00:17:43
>一旦ろーるばっくでトランザクションを改めてトランザクションを開始している。
一旦ろーるばっくでトランザクションを閉じて、改めてトランザクションを開始している。
328:nobodyさん
09/02/23 00:19:44 DYtiHKsN
>>326-327
なるほどねー
ようやくわかってきたわぁ
きたわぁ
きたわぁ
329:nobodyさん
09/02/23 00:22:06 DYtiHKsN
やっぱあれだな。
SQLiteの4つのロックのうち、
すぐにロックを獲得できるのを、
明示的に書かないとだめだな。
$oDbCxn->beginTransaction();
↑これがダメってこと。
なぜなら、↑だと、デフォルトのロックが選択される。
SQLiteにおける、デフォルトのロックとは、defferd lockである。
これだと遅延するから、4つの処理をトランザクションではさみたい、
などという場合には不向き。
330:nobodyさん
09/02/23 00:29:36
busy_timeoutの設定をするんじゃだめなのか?
331:nobodyさん
09/02/23 00:45:25 DYtiHKsN
>>330
やったことある?
332:nobodyさん
09/02/23 00:58:26 DYtiHKsN
もう一つの懸念。
SQLiteはNFSというファイルシステムを使っているマシンで実行すると
ぶっこわれるらしい。
NFSとはおもにUNIXで使われるファイルシステムらしい。
特にfreeBSDでよく使われるらしい。
自分が借りているレンタルサーバーはfreeBSDなので、
ひょっとしてSQLiteは使えないんじゃないか?
333:nobodyさん
09/02/23 01:02:31
NFS使ってるレンタルサーバなんてないから安心しろw
334:nobodyさん
09/02/23 01:02:40
URLリンク(jp.php.net)
>ヒント
>NFSパーティションにマウントされたSQLiteデータベースを処理すること は推奨されません。
>ロックに関してNFSは著しい問題があるので、 データベースを全くオープンすることさえできない可能性があります。
>ま た、成功した場合でも、ロックに関する動作は予測できない結果を生む可 能性があります。
だってさ。こっち調べるのが先じゃない?w
335:nobodyさん
09/02/23 01:02:48 DYtiHKsN
SQLiteには、
deferred,
immediate,
exclusive
という3つの種類のロックがあるが、
どれを使うべきか?というのは、考えなくていいの?
$dbh->beginTransaction();
これを使うと、自動的に、デフォルトの、ロックが
選択される。SQLiteにおけるデフォルトのロックとは
deferred ロックである。
もし銀行口座などの実装をしたい場合、
exclusiveにしないとダメなのではないか?
また、immediateって、なんのためにあるんだ?
いつ使うんだ?
336:nobodyさん
09/02/23 01:03:21 DYtiHKsN
>>333
よかった
337:nobodyさん
09/02/23 01:07:02
ロックとトランザクションの違いを勉強してきたほうがいいんじゃないかな?
338:nobodyさん
09/02/23 01:07:46
俺もそう思うw
339:nobodyさん
09/02/23 01:29:03
こいつ前いたキティだろ
通報しましたとかsqlite関連で腐るほど書き込んでた
340:nobodyさん
09/02/23 01:29:11
WikiとCMSってどう違うの
341:nobodyさん
09/02/23 01:36:09
>>316をスルーしてる時点で確定
342:nobodyさん
09/02/23 01:38:00
>>340
WikiもCMSの一種だよ
Wikiが他のCMSと違うのは、不特定多数によるサイト構築を主体とした構成になっている
つかPHP関係ないじゃん
343:nobodyさん
09/02/23 02:23:27 DYtiHKsN
もしかしてwhileいらないんじゃないか?
sleepしてrollbackだけでいいんじゃないか?
344:nobodyさん
09/02/23 03:33:25
こいつプログラム板の方とマルチだった
スレリンク(tech板:284-番)
345:nobodyさん
09/02/23 03:44:00
派遣先の歓迎会などで、趣味を聞かれることがあります。
私の趣味は豊富で下記のとおりです。
・アニメ、エロゲ、同人誌、アニソン
・風俗、ストリップ鑑賞
・声優、秋葉系アイドルイベント参加
しかし、これを言うと、おそらくひかれてしまいます。。。
なんて言えばよいのでしょうか?
休みの日は何をしてる?と聞かれても、声優ライブの最前線で
サイリウムをもって、跳んでいるなんて言えません。
346:nobodyさん
09/02/23 04:39:47 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さん
09/02/23 04:40:33 cBNbBaFX
→$a = "aaa";
348:nobodyさん
09/02/23 04:52:33
>>346
URLリンク(jp.php.net)
349:nobodyさん
09/02/23 05:29:48 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さん
09/02/23 05:30:39 DYtiHKsN
>>349
実行すると、なんでエラーになるの?
PHP5 + PDO + SQLite3
----------------------------------
database structure
id | name| value
1 | value| 5
-------------------------------
database name = test1
table name= tb1
351:nobodyさん
09/02/23 05:33:14 DYtiHKsN
トランザクションをスタートするのに、
$oDbCxn->query("BEGIN EXCLUSIVE TRANSACTION");
はダメで、
$oDbCxn->beginTransaction();
なら良い、というのはおかしい。
なぜエラーになるの?
352:nobodyさん
09/02/23 06:48:25 c878IibK
教えて下さい。
test.txt というutf-8のファイルがあって中に文とかphpの変数とかが書いてあります。
これをsjisのtest.phpで読み込み表示させたいのですがincudeだと文字化けします。
どうすれば表示できますか?
353:nobodyさん
09/02/23 06:59:44
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS" />
を吐いてやる
354:nobodyさん
09/02/23 07:08:52
>>353
その知識で回答しようと思えるなんて素直に感心するよ
355:nobodyさん
09/02/23 07:20:40 cBNbBaFX
>>348
自分なりに調べてみました><
mb_eregでは !== false でいけたので、それも一緒に比べてみたら
返り値のとこが、
mb_ereg
>正規表現に一致しないか、 エラーを発生した場合に FALSE を返します。
preg_match
>preg_match() は、エラーが発生した場合にFALSEを返します。
でした。
preg_matchは正規表現に一致しないときはfalseを返してくれないので、
!== falseがスルーされたということでよいのでしょうか?><
今まで全部!== falseでできると思っててそれでやってたので変更が大変ですが
preg_matchのときは==とか何もつけないバージョンでやっておきます><
ありがとうございました
356:nobodyさん
09/02/23 07:29:25
>>352
逆だUTF-8の方
両方使いたいなら変換かけるべし
357:nobodyさん
09/02/23 16:02:31
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
09/02/23 16:02:51 yJ3BEx4Z
ID出すの忘れ
359:nobodyさん
09/02/23 16:12:39
あれ、流出してる?
360:nobodyさん
09/02/23 16:31:29
>>352
eval(mb_convert_encoding(file_get_contents('test.txt'), 'Shift-JIS', 'UTF-8'));
>>357
構文に間違いはないから
スクリプトのエンコーディングが mbstring.script_encoding と合ってないんでしょう
361:nobodyさん
09/02/23 16:37:17 yJ3BEx4Z
可能の能抜いたらエラー出なかったです・・・
なんなのだろう
362:nobodyさん
09/02/23 16:46:30
>>357
原因は、Shift Jisの5C問題だね。
能のShift Jisのコードが94 5C
5Cはバックスラッシュ(Shift Jisだと¥)なので、
PHPのパーサが、終わりのダブルクォーテーションを文字列と認識してしまう。
結果、文字列が閉じられていないと判断されて、エラーになる。
363:nobodyさん
09/02/23 17:31:12
今時SJISでスクリプト書くやつなんていんの?
話は変わるが
echo '<table ~'.
'~~~~~~~~~'.
'~~~~~~~~~'.
'~~~~~~~~~'.
'~~~~~~~~~';
引継ぎでプログラムのソースコード見たらこうなってた
まじ簡便してくれ・・・orz
あと、同じ要領でechoでJavaScriptとか吐き出してるのもやめてくれ
クエリはまだ許せる
仕事でプログラムするときはほかの人にわかりやすいコードにしてください
これまじでお願い
364:nobodyさん
09/02/23 17:59:46
--enable-zend-multibyte付けてmbstring.script_encodingを設定すりゃ
Shift-JISだろうが何で書こうがそいつの自由だ
雑談スレに行けクズ
365:nobodyさん
09/02/23 21:03:10 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さん
09/02/23 21:21:42
>>365
それ駄目だ、俺も悩んだ
WHERE $AA = ?か、 ? = ?にしたよ
SELECTでbindValueとbindParamは使わない方がいいって
グーグル先生が言ってた
367:nobodyさん
09/02/23 21:33:37
PDO::PARAM_STMT
368:nobodyさん
09/02/23 21:36:22
カラム名にPARAM_STR使うなよ
アホかw
369:nobodyさん
09/02/23 22:03:46 ikSisMyc
【OS名】CentOS 5.0
【PHPのバージョン】php5.2
【連携ソフトウェア】JavaScript Smarty
【質問内容】
ユーザがログインに成功したときにセッションに値をセットして
次にページにアクセスしてきた時にSmartyで値があるか確認して初期化処理
例:
{{if $smarty.session.foo == 'bar'}}
init(); //これはJScriptの関数
{{/if}}
をしたいんですけど、ブラウザを終了するとセッションまで破棄されてしまいます。
ご教授お願いいたします。
370:nobodyさん
09/02/23 22:06:30 cBNbBaFX
>>366
sql文に直接変数入れる方法でしました。できました。
ありがとうございました
>>367,368
やってみたのですが、反応としては356とほぼ同じでした
マニュアルのパラメータ一覧のものをいろいろ代えてやってみたのですが
どうもうまくいきませんでした。
371:nobodyさん
09/02/23 22:12:39
>>369
セッションはブラウザを終了すると破棄されるものです
継続したいならクッキーを使うといいよ
372:nobodyさん
09/02/23 22:28:00
>>370
そのいろいろかえてやってみた、の中に正解が入ってないわけだな。
ビット和はとったのか。まぁ、いいや。メンドクセ
373:nobodyさん
09/02/23 22:55:40 DYtiHKsN
なぜEXCLUSIVEはトランザクション開始直後に
ジャーナルファイルを作成しないのか?
374:nobodyさん
09/02/23 22:59:36
アホか
375:369
09/02/23 23:03:42
>>371
PHPSESSIDをクッキーに格納する仕様と勘違いしてました。
ありがとうございました。
376:nobodyさん
09/02/24 00:24:39 r/vu3Jnx
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ <ココまでアホばかり
彡、 |∪| /
/ __ ヽノ /
(___) /
377:nobodyさん
09/02/24 07:08:35
pdoで急にinsertできなくなった・・
エラーなしで何事もなく終わってるのに肝心のinsertだけできていない・・