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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/02/18(水) 21:09:16ID:xNLzAD7T
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。

◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 80
http://pc11.2ch.net/test/read.cgi/php/1233479457/

◆質問用テンプレ
【OS名】vine linux
【PHPのバージョン】php5.26
【連携ソフトウェア】mysql
【質問内容】

◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)

◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)

◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
0202nobodyさん2009/02/21(土) 13:41:28ID:???
>>198
してるわけないだろ。関数の使いどころすらわかってないんだから
0203nobodyさん2009/02/21(土) 13:41:54ID:???
>>201
それでOKなんだけど、>>191はフィルターやバリデーターとDB登録時のエスケープを混同してるらしいからw
0204nobodyさん2009/02/21(土) 14:03:40ID:???

俺が使ってるサービスで
↓を混同してるプログラマがコード書いてませんように・・・

・DB入力時(SQLインジェクション)
・画面出力時(Scriptインジェクション)
0205nobodyさん2009/02/21(土) 14:14:16ID:???
>>193
雑談はネタ不足気味な雑談スレで。
http://pc11.2ch.net/test/read.cgi/php/1200314111/
0206nobodyさん2009/02/21(土) 14:20:49ID:???
>>198
ああ。実際に>>201が書いているようなことはしているよ。
例として>>185みたいな簡単な1行ソース出したから
「こいつ何も知らない馬鹿だなwww」と煽りたい気持ちも分かる。
だが、1から10までここに書けないだろ。

入力時、出力時にそれぞれ適切に変換するのは、初歩中の初歩だと思う。
201がああだこうだ書いてるが、俺は自作クラス作ってDB処理をしているから
変換ミスがどうのこうのはない。

ま、そういう自分の事はどうでも良くて、>>185の意見を出しただけなんだが
なぜか俺自身を煽りたい馬鹿がいるな。そんな事しても無駄だろ
0207nobodyさん2009/02/21(土) 14:22:00ID:???
>>185みたいなコードが出てくる時点でお前が一番馬鹿だよ
0208nobodyさん2009/02/21(土) 14:26:20ID:???
>>207
>だが、1から10までここに書けないだろ。

ちゃんと読めよ・・・わかりやすいように簡単に書いたって言ってるだろ

それに、htmlspecialcharsで変換しないでそのまま格納したとする
その場合、phpMyAdminなどで管理する時。どうなるかわかるよな?
0209nobodyさん2009/02/21(土) 14:27:37ID:???
>>208
こんだけ書かれてまだわかんないのか。
そこでhtmlspecialcharsはおかしいってことだろ。
代わりに何を使うべきか考えてみろ
0210nobodyさん2009/02/21(土) 14:28:10ID:???
>>206
荒れるだけだから黙っててくれ。
0211nobodyさん2009/02/21(土) 14:28:10ID:???
>>185>>191みたいなこと書いてたら馬鹿にされるのあたりまえだろ
>>206が仕事ではなく趣味でPHPいじってるだけであることを祈る
0212nobodyさん2009/02/21(土) 14:28:18ID:???
>>208
うん、あれはhtmlspecialcharsで変換されて出力されるね
ってかphpMyAdminなんか使ってるのかよ
0213nobodyさん2009/02/21(土) 14:28:48ID:???
>>209
わかる・わかんないの、俺に対しての批判はどうでも良いんだよ。
「なぜhtmlspecialcharsは駄目なんだ」って事だ

0214nobodyさん2009/02/21(土) 14:29:08ID:???
>>208
phpMyAdminをなめてんの?
別にスクリプトが混入したって何もおきないよ。
もし、そこでスクリプトインジェクションされんならIPA行きだお
0215nobodyさん2009/02/21(土) 14:30:21ID:???
>>213
> 「なぜhtmlspecialcharsは駄目なんだ」
既出
0216nobodyさん2009/02/21(土) 14:30:27ID:???
お前ら、自分の視野で物事考えすぎだよ。

「phpMyAdminなんて使ってるの?」って言葉がここで出てくると思わなかったぜw
ここのスレの役割考えろや。どうせ個人叩きしかできないくせに。
0217nobodyさん2009/02/21(土) 14:30:31ID:???
>>208
全部わかったうえで一部分だけ簡単に書いてます、って言ってるやつの文章じゃないよそれ
結局DB格納時にhtmlspecialchars使ってるんじゃん
0218nobodyさん2009/02/21(土) 14:31:22ID:???
>>216
phpMyAdmin → 画面出力時のお話

SQLインジェクションからかけ離れてきました・・・
0219nobodyさん2009/02/21(土) 14:32:07ID:???
>>206
> 俺は自作クラス作ってDB処理をしているから変換ミスがどうのこうのはない。
変換とか言ってる段階で、その自作クラスが穴だらけに1000カノッサ
0220nobodyさん2009/02/21(土) 14:36:47ID:???
> それに、htmlspecialcharsで変換しないでそのまま格納したとする
> その場合、phpMyAdminなどで管理する時。どうなるかわかるよな?

phpMyAdminは出力時サニタイズをすっかり忘れてる、ってこと?
0221nobodyさん2009/02/21(土) 14:38:07ID:???
サニタイズってトイレにでも行く気?
0222nobodyさん2009/02/21(土) 14:38:47ID:???
>>185
ENTQUOTES
ENTQUOTES
ENTQUOTES
ENTQUOTES
ENTQUOTES
ENTQUOTES
ENTQUOTES
ENTQUOTES
0223nobodyさん2009/02/21(土) 14:40:08ID:???
おまえらとどめは刺さないよなww
0224nobodyさん2009/02/21(土) 14:40:18ID:???
>>219
>>201が「俺はMySQLでの危険文字を全て列挙すら出来ない低能」と
言ってる意味を理解できていない、に1000カノッサ上乗せ
0225nobodyさん2009/02/21(土) 14:46:08ID:???
>>185
語る以前にエラーになる件
0226nobodyさん2009/02/21(土) 15:07:41ID:???
↓アクセスするとGoogleに飛ぶんですがどういう仕組みですか?
http://www.yahoo.xxco.jp/
0227nobodyさん2009/02/21(土) 15:11:56ID:???
%はあんまり伝わらなかったみたいだなー。
SQLとHTMLでは、特殊な扱いになる文字が違うよってことだけど。

htmlspecialchar()でも問題なく見えるのは、たまたま、だと思ったほうがいいよ。
偶然にも、置き換え対象になる文字がSQLでエスケープが必要な文字と同じだったってこと。

ついでに言えば、エスケープの仕方は実際はDB依存だから
addslashes()じゃなく、DB専用の関数を使ったほうがいい。
0228nobodyさん2009/02/21(土) 15:13:44ID:???
>>160 からの流れ、断ち切っておくか・・・

・DBに渡す際にPDOのプレースホルダで渡す、または専用関数(mysql_real_escape_string)でクエリを構成。
・html出力時にhtmlspecialchars(,ENT_QUOTES)をする。

※DBに渡す際にhtmlspecialcharsするのは間違い。
→ 理由 >>188
→ それでも分からない。 >>163の本を読め。
0229nobodyさん2009/02/21(土) 15:18:48ID:???
>>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: http://www.google.co.jp/
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8
0230nobodyさん2009/02/21(土) 16:10:53ID:???
素人だけど、俺より酷いプロらしき人が入るのを見て安心したような不安になったような…
0231nobodyさん2009/02/21(土) 16:11:49ID:???
>>226
xxco.jpの管理人が、
www.yahooo.xxco.jpへアクセスした場合に
「Location: http://www.google.co.jp/」へリダイレクト(302)するようにしているだけ。

<?php
header('Location: http://www.google.co.jp/', True, 302);
?>
0232nobodyさん2009/02/21(土) 16:25:04ID:???
>>231
サンクス
xxcoってドメインか
0233nobodyさん2009/02/21(土) 16:35:25ID:???
べ・・・別に!
僕レンタルサーバー使ってるからね!
エスケープしなくても安全よっ!
0234nobodyさん2009/02/21(土) 19:59:23ID:230PJjNE
【OS名】MacOS X (MAMP)
【PHPのバージョン】php5.2.5
【連携ソフトウェア】mysql
【質問内容】
Webアプリケーションで、ウィンドウ毎に違う情報を引き継いで処理をしていく物を作っています。
uniqid()でセッションIDを割り振って、formのhiddenに入れると引き継げるのは分かりました。
しかしこれだと、link(aタグ)で機能を選択した場合に、セッションIDが引き継げないように
思います。ですよね??何か良い方法はありませんか?
リンクのパラメータに追加するとなると、全部のリンクに書き足す必要があって大変だし、
POSTとGETの両方の評価が必要になると煩雑だし、そもそもurlにセッションIDを出すのが
微妙に避けたいので・・・。
お知恵を拝借したいです。よろしくお願いいたします。
0235教えて2009/02/21(土) 20:15:36ID: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";
}
?>
0236nobodyさん2009/02/21(土) 20:16:32ID:???
ふつうセッションIDはCOOKIEで渡す
ケータイの場合はGET渡ししかない
0237nobodyさん2009/02/21(土) 20:17:25ID:???
>>235
出したんなら良かったな
0238nobodyさん2009/02/21(土) 20:21:23ID:???
モバゲーで鳴らした俺はこの程度の日本語崩壊くらいなんて事は無い
モバゲーではこの程度の言語障害者珍しくも無い
マジ日本はどこへ向かうんだ

$numbers = range(1, 20);
shuffle($numbers);

echo array_pop($number);
// なんか処理
echo array_pop($number);
// なんか処理
echo array_pop($number);

1ページ内の処理ならこれでいける。
2枚以上の画面にわたって変数を持って行きたいならセッションを使うしかない。
02392342009/02/21(土) 20:33:28ID:230PJjNE
>>236
COOKIEですか・・・ちょっと調べてみます。ありがとうございます。
クライアントはパソコンなので、GETでもPOSTでも使えます。
COOKIEでもウィンドウ毎って可能なんですか?
0240nobodyさん2009/02/21(土) 20:38:24ID:???
>>239
パソコンならhiddenを使う必要ない。セッションはクッキーが勝手に確立してくれる
GETやらPOSTも意識する必要ない。セッションに少し慣れればすべて解決する

別ウインドウのことを言ってるのだとしても
リンクやフォームから作成された別ウインドウは同一セッションとなる
02412342009/02/21(土) 20:51:05ID:???
>>240
同一セッションでは困るんですが・・・ウィンドウ毎に分けたいので・・・
0242nobodyさん2009/02/21(土) 20:54:07ID:???
>>241
であればウインドウごとにID発行してそれをセッションで持ちまわす
02432422009/02/21(土) 20:58:18ID:???
ごめん、うそついた
同一セッションで別ID発行してもセッションが上書きされるだけだからダメか
0244nobodyさん2009/02/21(土) 20:59:36ID:???
入力->フィルター->エスケープ->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 ++; } ?>
でまわしてはいかんのかね?
0245nobodyさん2009/02/21(土) 21:09:52ID:???
>>244
俺も取り出しのあとのフィルターってのはよくわからん
DBには正しいものが入ってるはずだしな
でもhtml適合化は必要だろ。そのコードだとScript実行されるよ
02462342009/02/21(土) 21:10:06ID:???
>>243
そうなんです。>234の様にformかurlに入れれば、
とりあえずウィンドウ毎に別の情報を引き継げます。
だけど、formとurlの両立が難しい。
何か、簡単にウィンドウ毎を識別する方法があれば・・・
0247244です。2009/02/21(土) 21:15:34ID:???
htmlspecialcharsか
0248nobodyさん2009/02/21(土) 21:17:49ID:???
>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で漏れる)。
0249nobodyさん2009/02/21(土) 21:20:12ID:???
>>244
>入力->フィルター->エスケープ->DB -> 取り出し-> フィルター -> html適合化 -> 表示
どこにそんなことが書いてある?

入力 -> エスケープ -> DB -> 取り出し -> サニタイズ -> 表示
これでいい
0250nobodyさん2009/02/21(土) 21:26:33ID:???
>>249
サニタイズってのは、入力値に不正な値や壊れた文字列が入っていないかをチェックするもの。
やるなら、入力の直後だが、サニタイズって言うと、>>249みたいな誤解をするやつがいるから、
入力後にやるのが、バリデート+フィルター。
0251nobodyさん2009/02/21(土) 21:28:51ID:???
DBからの取り出し後にフィルターを書ける理由
DBってのはデータストア。
収録されたデータをすべて出力していいとは限らないし、
形式によってはフィルターをかける必要がある。jk
0252nobodyさん2009/02/21(土) 21:33:13ID:???
>>250
入力段階でチェックするのはvalidate
sanitizeは表示段階で、浄化、つまり悪意のあるスクリプトやタグを無効にするもの
0253nobodyさん2009/02/21(土) 21:43:54ID:???
フィルターって要するにバリデートだろ。
エスケープやサニタイズとは別の話題。
0254nobodyさん2009/02/21(土) 21:44:23ID:???
>>252
まぁ、そう思っててもいいけどな。
それは、htmlspecialcharsをサニタイズだと思っている子たちの誤解
悪意と善意を確実に識別できるのはどこかを考えれば正解はどっちかわかるはずだが、
困ったことに、サニタイズ≒出力フィルタだと書いちまってるサイトやら本があるからなぁ。

要するに、サニタイズなんて曖昧なメタファーでプログラムを語るなってことだ。
0255nobodyさん2009/02/21(土) 21:45:32ID:???
>>253
バリデートはフィルターに含まれる。
エスケープとは別。
で、何が言いたいの?
0256nobodyさん2009/02/21(土) 21:46:05ID:???
>>251
具体的にどういうデータだったらそのフィルターとやらをかけるの?放送禁止用語とか?
0257nobodyさん2009/02/21(土) 21:47:37ID:???
>>254
htmlspecialcharsもサニタイズの一種だろ。話を難しくしすぎ
02582342009/02/21(土) 21:48:33ID:???
>>248
そうですよね。ありがとうございます。
固有URLの実装方法は分かりませんし、
そもそもフレームワークにCakePHPを使うので、そういうURLなのです。
リンクじゃなくて、全てformのボタンにするのも手ですかねぇ・・・。
0259nobodyさん2009/02/21(土) 21:49:18ID:???
>>256
放禁みたいなNGフィルター、SNS用の権限フィルター
多端末対策で文字コード変換フィルター
スクリプト許可端末、スクリプト拒否端末用の変換フィルター
タグ許可・不許可
まぁ、なんでもいいでしょ
0260nobodyさん2009/02/21(土) 22:00:32ID:???
バリデート
 検証。入力値などに問題が無いかをチェックする(チェックした後どうするかは知らない)。
フィルタ
 入力値をチェックし、ヤバいものは除去する、ないし弾く(エラーにする、無視する)。
サニタイズ
 消毒。転じて無害化。害の無いものにする。変換・置換など無害化の方法は多数あるが。。
エスケープ
 ある環境で特殊な意味を持つ値(HTMLならば<など)を、その環境のルールで規定された別の表現(<)に置き換える。
 ダブルクォート中で"の前にバックスラッシュを置くのもエスケープ。

どれがベストかというと、どの表現も曖昧さが残るので使うべきではない。
DBへの入力の無害化処理と、HTML出力への無害化処理は違うし、無害化の方法も1通りではない。
設計初期などで抽象度を残した表現をしたい時くらいしか使わないな。
>259は文脈を意図的に曲解した例。
0261nobodyさん2009/02/21(土) 22:01:28ID:???
>>257
htmlspecialchars=html適合化っていう具体的かつ正確な言葉があるのに、
曖昧かつ誤解に満ちて見解が分かれるサニタイズなんて言葉にする必要はないだろ。
0262nobodyさん2009/02/21(土) 22:01:39ID:???
俺だせえ。
> 別の表現(&lt;)に置き換える。
な。
0263nobodyさん2009/02/21(土) 22:05:41ID:???
>>260
> ダブルクォート中で"の前にバックスラッシュを置くのもエスケープ
PHPとかJSならエスケープだが、HTML中でこれができると思ってしまう奴もいるらしいからな。

HTML出力時にaddslashesするやつとか、
DBに入れる前にhtmlspecialcharsする奴とか、
入力時に両方処理する奴とか、
ほんと、ウンコだな
0264nobodyさん2009/02/21(土) 23:03:26ID:???
>>263
自分のこといってるんですね
わかります。
0265nobodyさん2009/02/21(土) 23:17:26ID:???
>>263はうんこ
0266nobodyさん2009/02/21(土) 23:33:28ID:???
ほんと、ウンコだな
0267nobodyさん2009/02/21(土) 23:47:51ID:???
叩かれる理由のない>>263を叩いてるのは
昼にhtmlspecialcharsの件で叩かれてたやつだろ
0268nobodyさん2009/02/21(土) 23:49:41ID:???
>>263はうんこ
0269nobodyさん2009/02/22(日) 00:00:19ID:???
>263
良く分からないけどやーいやーいうんこうんこー
0270nobodyさん2009/02/22(日) 00:13:17ID:???
うんこを馬鹿にしたやつ全員明日から便秘に悩む。

0271nobodyさん2009/02/22(日) 00:31:09ID:bY3v8MvV
>>270
のせいで、便秘ではないがうんこが止まらない。
この1時間で4回うんこにいっている
0272nobodyさん2009/02/22(日) 00:34:34ID:???
<?=str_repeat( 'うんこ', date('s') )?>
02732342009/02/22(日) 00:46:35ID:JUr+Er3M
リンクやPOSTで受け取るデータの他に、元のページから送られてくるデータって
何か無いかな・・・って考えてたら・・・$_SERVER['HTTP_REFERER']が使え
ないかなぁ?って思ったのですが。どうでしょうか?
例えばheaderのmetaとかでreferer urlを変更して、セッションIDを追加したり
とか出来ないでしょうか。
他にも、何か使えそうなデータって無いでしょうか?
0274nobodyさん2009/02/22(日) 01:01:49ID:???
>>273
refererは自由に変えられるし、飛ばさないブラウザもあるし信用ならないよ

まず別セッションにしたい理由がわからん
ユーザーに複数セッションを使わせたいという状況は想像できないし
自分が複数セッション使いたいならブラウザもうひとつ立ち上げればよいだけ
02752342009/02/22(日) 01:27:54ID:JUr+Er3M
>>274
refererが信用ならないのはおっしゃる通りです。ご指摘ありがとうございます。
リファラ出さないブラウザは対象外って事で良いのです。

複数セッションを使うために、別のブラウザを立ち上げれば済むのもご指摘通り。
自分だけで使うなら、その方が簡単なのですが。

例を挙げると、ウィンドウ1つに一人分の情報を表示/編集できる、マルチ・
ウィンドウの住所録ソフトみたいなものを想定しています。
ウィンドウ毎に別セッションにしないと無理じゃないかと思いました。
他に、定石があるようでしたら教えて下さい。
よろしくお願いいたします。
0276nobodyさん2009/02/22(日) 02:04:13ID:???
あなたがたは無職なのに
なんで質問に回答するときはえらそうな
態度なの?
0277nobodyさん2009/02/22(日) 03:06:25ID:3nGhqmkB
SQLite3 + PDO で、

1つ目のプロセスがトランザクション張ってて、
2つ目のプロセスがトランザクション張ろうとして、
当然1が既にデーターベースをロックしてるから、
2はロックを取得できなくて、そんで
SQLITE_BUSYが帰ってきて、
database is locked
ってわかったとき、
しばらくsleepさせて、リトライ
って処理、どうやって書けばいいの?

どっかにサンプルコードある?
0278nobodyさん2009/02/22(日) 04:28:08ID:???
>>277
そこまで分かってるならforなりでいくらでも書けそうだけど・・
具体的にどこが分からないのよ
0279nobodyさん2009/02/22(日) 18:00:44ID:???
例えば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の時点で他の方法でユーザを管理しているかもしれません、
上のようなサイトの、ユーザ管理とその引き出しはどう管理しているのか、
大体でもいいので教えていただけないでしょうか
よろしくお願いします
02802782009/02/22(日) 18:01:32ID:euIhPE01
id
0281nobodyさん2009/02/22(日) 18:03:04ID:???
>>279
今の主流は動的URLを性的URLに変化する

http://example.com/user/http://example.com/id=user
DBにデータを保存しておいてページのIDで呼び出す
0282nobodyさん2009/02/22(日) 18:09:47ID:euIhPE01
すいません>>280の名前は279でした

>>281
なるほど、DBを使ってユーザーのページに誰かが訪れるその度に
検索呼び出ししているということでしょうか。
なんかすっきりしましたありがとうございました
0283nobodyさん2009/02/22(日) 18:12:49ID:???
>>282
ちなみに毎回DBから同じ情報ひっぱってくるのは負荷かかるから
キャッシュを使ってるのが多いと思う
(ここはまたSmartyとか覚えたときにやってみるといい)
0284nobodyさん2009/02/22(日) 18:16:29ID:euIhPE01
>>283
Smartyですか、参考に調べてみます
ありがとうございました!
0285nobodyさん2009/02/22(日) 21:21:50ID:3nGhqmkB
>>278
while で書いたけど、
deadlockになるのです
0286nobodyさん2009/02/22(日) 21:47:52ID:???
具体的にどう書いたか見せたほうが答えてもらいやすいと思うが・・
恥ずかしがらないで
0287nobodyさん2009/02/22(日) 21:50:36ID:3nGhqmkB
>>286
1.php と 2.php と2つのファイルを用意して、
以下のテストを行いました。

「テスト1」
1.phpを単独で実行する -> OK

「テスト2」
2.phpを単独で実行する -> OK

「テスト3」
1.php -> 2.php という順番で実行する -> deadlock発生

こういう状況です。
0288nobodyさん2009/02/22(日) 21:52:30ID:3nGhqmkB
1.phpは、トランザクション中に
sleep(10);
をかませて、ゆっくり実行するようにしてあります。

このゆっくりタイムに、いそいで2.phpを実行する、という
テストです。
0289nobodyさん2009/02/22(日) 21:53:36ID:3nGhqmkB
環境は、PHP5 + PDO + SQLite3 です。

データーベース構造は、

id | name| value
1 | bond | 5

database name = test1

table name= tb1

です。
0290nobodyさん2009/02/22(日) 21:54:35ID: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
}
}
?>
0291nobodyさん2009/02/22(日) 21:55:09ID: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);
}
}
?>
0292nobodyさん2009/02/22(日) 21:57:20ID:3nGhqmkB
1.phpと2.phpの違いは、sleep(10)があるか、ないかというだけです。
それ以外は全部同じです。

SQLiteはトランザクション中に、別のトランザクションを発生させようとすると
1秒も待たずに「database is locked」になるので、
ウエイト->リトライ、という処理を自分で書かないといけません。

これがイマイチ普及しない最大のポイントだと思いますが、
その処理の書き方についての質問です。

なぜかデッドロックになってしまうのです
0293nobodyさん2009/02/22(日) 21:57:20ID:???
え?ループ内にトランザクション?
0294nobodyさん2009/02/22(日) 21:57:55ID:3nGhqmkB
>>293
だってリトライしないといけないわけだから。
なんか間違ってる?
0295nobodyさん2009/02/22(日) 22:01:33ID:???
例外が発生するポイントは、beginかexecか調べた?
0296nobodyさん2009/02/22(日) 22:03:13ID:3nGhqmkB
>>295
例外は発生しないにょ

ずーーーっと実行中のままになって、
最後にはタイムアウトになるんだにょ

PHPのデフォルトタイムアウトが60秒だから
60秒でタイムアウトになるにょ
0297nobodyさん2009/02/22(日) 22:04:43ID:???
>>296
おいおい、
例外にならなかったら、falseが設定されるでしょうが。
例外をcatchして捨ててるだけでしょうが。
0298nobodyさん2009/02/22(日) 22:06:21ID:???
beginTransactionでオートコミットモードがオフになる。
execに失敗する。
もう一度、beginTransactionをかけるが、既にbeginされてるので例外発生
で、またループ。
beginをループの外に出すかcatchしたときにロールバックしてみたらどうかね
0299nobodyさん2009/02/22(日) 22:13:32ID:???
EC-CUBEのカスタマイズで1000万て安い?
ちなみに1年、5人担当
0300nobodyさん2009/02/22(日) 22:15:02ID:3nGhqmkB
>>297
そしたら、catchの中で、
例外をprintするように改造して
もう一回試してみるよ
0301nobodyさん2009/02/22(日) 22:15:38ID:3nGhqmkB
>>299
一人当たり200万円しかもらえないじゃん
■ このスレッドは過去ログ倉庫に格納されています