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

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

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

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

◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.5
【連携ソフトウェア】MySQL ImageMagick
【質問内容】

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

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

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

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
01531522014/04/30(水) 20:14:48.33ID:???
>>150
こんな感じはどうだろうか。

function test_rand($min, $max) {
$i = pow(10, strlen($min) - 2);
return mt_rand($min * $i, $max * $i) / $i;
}

このままだったら$minが1以上だとダメだし、桁数が増えるとかなり不安。
というかstrlenの無理やりっぷりがかなりダメっぽいが使えないことはないはず(未検証)
0154nobodyさん2014/04/30(水) 21:32:15.78ID:mmY1oCt0
長い連想配列から、何回もデータを取り出す時、
echo $data['hoge'];を繰り返すのと、

$Hoge = $data['hoge'];
echo $Hoge;を繰り返すのでは
ではどっちが効率がよく早いのですか?
0155nobodyさん2014/04/30(水) 21:42:02.96ID:???
>>154
試せばいいんじゃ?
他人に聞くより面白いよ
0156nobodyさん2014/05/01(木) 00:03:43.86ID:???
ベンチマークのとり方ぐらい覚えろや
0157nobodyさん2014/05/01(木) 00:16:05.95ID:???
>>154
どれも遅いです
これが最速です
class Data{
protected $data;
function __construct($data){
$this->data = $data;
}
protected getData($key){
return $this->data[$key];
}
class Hoge extend Data{}
$hoge = new Hoge($data);
echo $hoge->getData('hoge');
0158nobodyさん2014/05/01(木) 04:00:50.45ID:???
呼び出せませんが。。
0159nobodyさん2014/05/01(木) 07:56:42.77ID:???
覚えたてのクラスを使いたかっただけ
0160nobodyさん2014/05/01(木) 10:41:59.40ID:???
他人に説明できるだけの知識もスキルもないのに自己顕示欲を満たすためだけに書き込むからそういうことになる
0161nobodyさん2014/05/01(木) 11:21:41.98ID:???
え、説明が必要な質問だったの?
0162nobodyさん2014/05/01(木) 12:06:10.20ID:???
>>158
そこかよ
0163nobodyさん2014/05/01(木) 14:59:09.46ID:rJxa+dp0
>>154
変わらない
0164nobodyさん2014/05/01(木) 15:19:40.23ID:???
>>163
馬鹿は引っ込んでろよ
「早い」かどうかの質問なんだから文字数が少なく、
つまり、タイピングコストの低い後者だろ
0165nobodyさん2014/05/01(木) 15:25:35.26ID:???
貶すためには文脈無視した詭弁も厭わない、その意気や良し
0166nobodyさん2014/05/01(木) 16:00:18.39ID:???
プログラマーのくせにベンチの取り方も知らないって恥ずかしいよ
こんな質問できるのは幼稚園児までだね
0167nobodyさん2014/05/01(木) 16:08:07.62ID:???
      ____
     //  \\
   /( ●)  (●)\     ねえ、ゆうにいちゃんちょっと聞きたいんだけど
  /::::::⌒(__人__)⌒::::: \   長い連想配列から、何回もデータを取り出す時、
  |     |r┬-|     |    echo $data['hoge'];を繰り返すのと、
  \      `ー'´     /    $Hoge = $data['hoge'];
   /` ‐- __ - ‐‐ ´ \    echo $Hoge;を繰り返すのでは
  / .l        _,,ヽ ___ 〉、   ではどっちが効率がよく早いの?
  | l       / ,' 3 `ヽーっ
  ヒト- _    l   ⊃ ⌒_つ  おじさん達に聞いてもさっぱりわからないって言われてさ
.   !__   ̄, ̄ `'ー-┬‐'''''"    「ゆうにいちゃんならパソコンの大先生だから聞いてこい」って。
   L  ̄7┘l-─┬┘       ごめんね、こんな初歩的なこと聞いて。
    ノ  ̄/  .! ̄ ヽ
  └‐ '´   ` -┘
0168nobodyさん2014/05/01(木) 16:11:27.03ID:???
$n = 1000000;
$start = microtime(true);
for ($i = 0; $i < $n; $i++) {
//do something
}
$end = microtime(true);
echo $end - $start;
0169nobodyさん2014/05/01(木) 16:15:12.32ID:???
文脈無視も何も書いてある通りに解釈しただけだと思うが。

ああ、底辺ペチパーはそれができないからまともにコードも読めないのか。
これは納得。
0170nobodyさん2014/05/01(木) 16:32:08.88ID:???
効率 前者
早い 後者
0171nobodyさん2014/05/01(木) 17:16:06.08ID:???
microtimeしかしらないバカ
0172nobodyさん2014/05/01(木) 17:22:12.14ID:???
読むのも書くのもめんどくさいなら
他人が作ったもので試す
http://net-beta.net/ubench/
0173nobodyさん2014/05/01(木) 18:14:33.51ID:???
>>170
書く効率がいいのは後者だろ
効率はどっちの意味とも取れるってんなら明確な後者に合わせる必要がある
0174nobodyさん2014/05/01(木) 18:29:18.60ID:???
効率ってメモリのことじゃないのか
0175nobodyさん2014/05/01(木) 18:40:33.56ID:???
効率重視ならそもそもPHPなんか使わなくね

効率重視ならRubyだろjk
0176nobodyさん2014/05/01(木) 18:41:34.14ID:???
華麗にスルー
0177nobodyさん2014/05/01(木) 18:56:25.99ID:???
>>174
プログラミングで、前置きなしに「効率」と言ったら
明確な定義があるよ。
0178nobodyさん2014/05/01(木) 19:30:38.35ID:???
また>>55が暴れてんのか?
きっしょ
0179nobodyさん2014/05/01(木) 19:50:13.76ID:???
>>177
どんな定義?
とりあえず書く効率とか言う人ははじめて見たわ
0180nobodyさん2014/05/01(木) 20:11:33.41ID:???
>>179
JIS X 0129の効率性のところ
0181nobodyさん2014/05/01(木) 22:01:27.22ID:IVC8nsmp
半角括弧の「[」、これだけを置換しようとすると
長音の「ー」、これまで変に置換されます。

文字コードはSJIS。文字コードをUTF-8にすれば大丈夫だと思うのですが、
SJISのまま対応することできますか?
0182nobodyさん2014/05/01(木) 22:04:06.59ID:IVC8nsmp
追記、使用したコードです
$value = str_replace('[', "", $value);
0183nobodyさん2014/05/01(木) 22:55:44.35ID:???
mb_str_replace試した?
0184nobodyさん2014/05/02(金) 00:08:13.50ID:ur7avpqc
>>183
試していないのですが、

mb_strstr($value, "[")

で長音「ー」にヒットするので
mb対応でもだめみたいです
0185nobodyさん2014/05/02(金) 00:13:36.91ID:???
ーを「cho-on」に置換してまた戻せばいいんじゃね
0186nobodyさん2014/05/02(金) 00:17:04.58ID:???
SJISじゃなくてUTF-8にすればいいじゃん
そもそもファイルをSJISにしとくのがおかしい
UTF-8保存してSJISで出力するようにしろ
0187nobodyさん2014/05/02(金) 00:28:34.64ID:ur7avpqc
>>185
>>186
レスありがとうございます。
とりあえず置換で対応して
UTF-8保存してSJIS出力にしてみます
0188nobodyさん2014/05/02(金) 01:54:16.00ID:???
>>187
mb_internal_encodingでSJIS(SJIS-winのほうが好ましい)指定してる?
指定してなくてmb関数系を使用する場合は、引数にencodingを指定しないと正しい結果は得られない。

そもそもこういう現象が起きてる理由分かってるかな?
[の文字コードがーに使われているからなんだけど。

だから>>185の回答は、[とー以外にもそういった現象が起きる可能性があるから意味が無い。
というかこの件に限らず、こういう時は他の文字列に変換するとか普通はやったらダメ。
絶対に使用されない文字列に変換するとかなら考えないことはないけど、「cho-on」って絶対に入力されない文字なの?

また>>186も意味が無い。
理由としては上に書いたのと同じで、[とー以外の文字でこういった事が起きる場合があるから。
というか個人的に言わせてもらうと、UTF-8が好ましいって言うだけならまだしも、SJISにしとくのがおかしいっていうのは単なる偏見。
内容によってはSJISでも良いよ。
0189nobodyさん2014/05/02(金) 03:06:34.56ID:???
知ったか乙
偏見もクソあるか
デメリットだらけのSJISを使う必要はない
0190nobodyさん2014/05/02(金) 03:24:42.72ID:ur7avpqc
>>188
mb_internal_encodingはよく理解していませんでした
mb_strstrにencoding設定もしていなかったので正しく処理できていなかったと思います

参考になりました。ありがとうございます
0191nobodyさん2014/05/02(金) 03:36:24.09ID:???
>>188
mb_internal_encodingを設定することで
mb_strstr、mb_ereg_replaceで希望する処理になりました
ありがとうございます

>>189
5C問題で何度かエラーが出たことがあるので
UTF-8保存してSJISで出力に対応しようと思います
ありがとうございます
0192nobodyさん2014/05/02(金) 04:29:58.32ID:qs7JG5q/
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
0193nobodyさん2014/05/02(金) 11:19:50.80ID:???
SJISを使ってはいけないのは5C問題だけじゃないんだけどな
0194nobodyさん2014/05/02(金) 14:00:12.59ID:???
>>188
>理由としては上に書いたのと同じで、[とー以外の文字でこういった事が起きる場合があるから。

具体的にどの文字を指しているのかkwsk
0195nobodyさん2014/05/02(金) 14:15:00.69ID:???
2バイト目がprintableなコード全てだろw
つか、質問ならid出してくれ
0196nobodyさん2014/05/02(金) 15:10:06.98ID:???
それはsjisの話でしょ
utf-8のについてなんだけど
0197nobodyさん2014/05/02(金) 15:16:36.39ID:???
188はSJISの話だね
0198nobodyさん2014/05/02(金) 16:53:49.64ID:???
utf-8にすれば解決するってことだな
0199nobodyさん2014/05/02(金) 17:15:15.98ID:???
なんでutf-8にしても意味がないって>>188は言ってるの?
02001882014/05/02(金) 20:08:58.05ID:???
調べたらUTF-8は問題なかった。
>>186は本当にすまんかった。
以前UTF-16扱ってる時にでバグが出てたから勘違いしてた。
0201nobodyさん2014/05/02(金) 20:27:24.10ID:???
ファイル名がS-JISなのはどうにかならんのか
windows使うのがいかんのだろあが
で、UTF-8は何も問題なし?
0202nobodyさん2014/05/02(金) 20:31:09.78ID:???
>>189
なんでSJISだけそんなに食い付くの?
このスレで出てる回答の9割は嘘やいい加減な内容なのに。

基本的に質問者を騙して楽しむって暗黙の了解があるんだから水をさすなよ。
0203nobodyさん2014/05/02(金) 20:36:57.02ID:???
何こいつきっしょー
0204nobodyさん2014/05/02(金) 22:32:39.44ID:???
>>202
多分>>186は普段いないGW厨だろwたまたま来て覗いたけどそういう了解を知らないから間違った内容が目に入って思わず突っ込んだんだろw
0205nobodyさん2014/05/03(土) 13:22:28.77ID:dwgODfUZ
<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
$stmt->execute(array($_GET['name']));

// プレースホルダは、値全体に対して使用しなければなりません
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?");
$stmt->execute(array("%$_GET[name]%"));
?>


↑これプリペアドステートメントの間違った使い方なんですが、
どっちが間違ってるんですか?
0206nobodyさん2014/05/03(土) 13:34:58.30ID:dwgODfUZ
すいません↑は解決しました。
追加で質問なんですが、

PDOのexecuteで配列で値を渡すのと、
bindParamで値を渡すのは何が違うんでしょうか?


あと静的プレースホルダと動的プレースホルダの違いを教えて下さい。
0207nobodyさん2014/05/03(土) 13:41:51.51ID:???
>>206
lmgtfy . com/?q=php+%E9%9D%99%E7%9A%84+%E5%8B%95%E7%9A%84+%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80+%E9%81%95%E3%81%84
0208nobodyさん2014/05/03(土) 16:05:22.50ID:???
>>206
http://jp1.php.net/manual/ja/pdostatement.execute.php
http://jp1.php.net/manual/ja/pdostatement.bindvalue.php
http://jp1.php.net/manual/ja/pdostatement.bindparam.php
ついでにbindParamとbindValueの違い。
http://webmaster.chielog.com/php/133.html

http://www.atmarkit.co.jp/fsecurity/column/ueno/60.html
0209nobodyさん2014/05/03(土) 16:56:02.72ID:dwgODfUZ
なるほど
たぶんなんとなくわかりました
ありがとうございました
0210nobodyさん2014/05/03(土) 17:07:55.71ID:???
executeで渡すと全部PDO::PARAM_STRになるんじゃなかったっけ
そんな記憶がある
0211nobodyさん2014/05/03(土) 19:22:09.61ID:???
明示しなければ、デフォルトの PARAM_STR になるだけの話
0212nobodyさん2014/05/03(土) 20:30:18.66ID:SAeP1+WO
>167あたり
echo $data['hoge'];
でここまで白熱してくれるとは思わんかったぉ。
今は会員データをすべて一度変数にいれてるんだけど、
連想配列にすれば、一行で終わって簡単だから、
そっちにしようか迷ったわけですが、
後者今のままのほうがよさそうなので、今のままでいきやす。
どもでしたのでした。
0213nobodyさん2014/05/03(土) 22:04:17.12ID:???
「一致します」と表示されてしまう理由わかりますか?

<?php
$a = "10円";
$b = 10;

if ($a == $b) {
echo "一致します";
}else{
echo "一致しません";
}
?>
0214nobodyさん2014/05/03(土) 22:11:57.25ID:???
<?php
$a = "10円";
$b = 10;

if ($a === $b) {
echo "一致します";
}else{
echo "一致しません";
}
?>
0215nobodyさん2014/05/03(土) 22:43:41.22ID:qufEmRhb
>>151、>>153
ありがとうございます
>>151のものはユーザーが入力した値を使えないし、
>>152だと1以上の値は使えない、だと痛いです…
とりあえず今すぐ作らなければいけないプログラムではないので、
時間があれば>>152のものを改造するなりどうしても分からなければ再度質問することにします。

それと、また聞きたい事がが出来てしまったのでまとまれば質問します、いつもすみません…
0216nobodyさん2014/05/03(土) 22:54:12.96ID:qufEmRhb
すみません、>>215訂正
>> 152ではなく>>153です…
0217nobodyさん2014/05/04(日) 12:51:19.54ID:SSVjx9p2
>215
乱数は基本のmd5とかshなんとかとかを適当にやって、
後はネットで検索するとランダムで英数字を作れる
サンプルが山ほどあるので、多くは桁数を指定できるので、
んで、基本の乱数にプラスでつければけっこう使える。
少数以下はなんに使うかわからないけど、
過激な重複がなければ、マイクロ秒をちびちびと
応用すれば、だいたい現場で使えるかと。
0218nobodyさん2014/05/04(日) 16:22:19.43ID:???
>>217
md5とかはハッシュ値を作るものであって乱数を決めるものじゃない。
ハッシュ値を出力するにしろ0-9a-fの範囲しか文字が存在しないから質問の回答としては不適切じゃね?
0219nobodyさん2014/05/04(日) 17:25:16.70ID:i3JfacAa
添付ファイルの維持について質問したいです。
下の流れで処理するフォームを作りました。

1.送信フォーム
↓
2.確認画面
↓
3.送信完了

確認画面のエラー処理などで送信フォームに戻る処理をすると
参照したファイルがリセットされ「ファイルが選択されていません。」の状態に戻るのですが、
添付したファイルを維持するにはどうすればいいのでしょうか?
0220nobodyさん2014/05/04(日) 18:15:16.16ID:???
>>219
ようゴミ
スレタイすら読めないゴミには無理
0221nobodyさん2014/05/04(日) 18:21:29.98ID:???
>>219
添付ファイルのみを別フォームで送信する
0222nobodyさん2014/05/04(日) 18:44:10.10ID:i3JfacAa
>>221
ありがとうございます
0223nobodyさん2014/05/04(日) 20:37:31.77ID:???
>>217
現場で使わないでください。というか、現場に来ないでください。
というレベルなんですけど。
0224nobodyさん2014/05/04(日) 20:48:58.88ID:???
まあ工事現場の話なんだけどな
0225nobodyさん2014/05/04(日) 21:18:35.04ID:???
>>223
文句だけは一人前だな
0226nobodyさん2014/05/04(日) 21:32:48.44ID:SSVjx9p2
>223
たしかに、会員サイトは長くやってるけど、
全部辞書とか見たりした独学でやってるんで、
プロっていうか企業のレベルは
わかりません。資格もないので。
現場っていうのは、まあ。そういうレベルではないけど
あるいみ実践なレベルです。
見方かえればごみかもしれません。はい。
0227nobodyさん2014/05/04(日) 22:20:52.80ID:???
俺も同じだがmd5で乱数っていう発想は無かった
0228nobodyさん2014/05/04(日) 22:39:55.11ID:???
>227
乱数は基本のmd5とかを適用にやって現場で使えるかと。
ネットで検索するとサンプルが山ほどあるのでけっこう使える。
0229nobodyさん2014/05/04(日) 22:45:25.19ID:???
   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |        J
/     ∩ノ ⊃  ヽ
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
0230nobodyさん2014/05/05(月) 04:28:54.11ID:???
>>225
ネットで検索すると(略)サンプルが山ほどある

↑PHPでこれをやるとどうなるか分かってるならいいんだけど。
PHPをけなすいつもの人と勘違いしないで欲しいんだけど、ネットのサンプルのひどさは有名だろ
0231nobodyさん2014/05/05(月) 12:06:39.29ID:???
>>229
md5が乱数には適さないという
論理的な反論があるならどうぞ。
0232nobodyさん2014/05/05(月) 12:39:07.88ID:???
>>231
MD5は衝突を無視すると、与えた入力と一意に対応するので、
解析用の辞書が出回っており、入力が文字列や数列になっていると、
わりと簡単にクラックされるので、用途に注意。
とかかな。
0233nobodyさん2014/05/05(月) 13:09:01.46ID:???
>>231
229じゃないけどハッシュ関数と乱数生成器の違いが判らないので教えて欲しいの?
0234nobodyさん2014/05/05(月) 13:17:15.51ID:???
>>232
ありがとう。

>>233
黙って。
0235nobodyさん2014/05/05(月) 13:34:45.54ID:???
>>234
いや…。
>>232 がありがとうなら、
>>233 に教えてもらえ。マジで。
0236nobodyさん2014/05/05(月) 15:47:10.22ID:CeNcO2Ei
list($a,$b)=
みたいな感じで連想配列に突っ込みたいんだけどできる?
02372292014/05/05(月) 17:32:37.81ID:???
>>231
非常にネタ臭いというかネタであってほしいけどマジレスするよ。

////間違いその1
md5はハッシュ関数。
ハッシュ関数の詳細は下記のURL参照。
http://www.atmarkit.co.jp/aig/02security/hashfunction.html

一方乱数はランダムな数値。
だから「md5などハッシュ関数で乱数を作る」というのは間違い。
「乱数を用いてmd5などのハッシュ関数でランダムな文字列を作る」なら話は分かる。

////間違いその2
話の元ネタである質問は
「暗号論的に良い疑似乱数や真の乱数はないのか?」
といった質問をしている。
「ランダムな文字列」のことは一切聞いていない。
0238nobodyさん2014/05/05(月) 18:24:10.11ID:???
>>237
下らないAA貼らずに最初からそう答えればよかったのに
ガキかよ
02392372014/05/05(月) 19:51:12.62ID:???
>>238
初めに>>218を書いてるんだよおっさん。残念なことにな。
0240nobodyさん2014/05/05(月) 19:55:45.79ID:???
>>236
list($arr['a'], $arr['b']) = explode()
こういうこと?
0241nobodyさん2014/05/05(月) 20:15:40.42ID:eyH3xZ+U
俺は乱数「意味不明で一意の数字」ときいたら、
それで対処しちゃうけどね。
何年もおkだし、ユーザーに迷惑かけたこともない。
大手のセキュリティーなんて、どこも似たレベルで
小学生が考えるくらいの工夫もない。
だから毎日ニュースに大手の不正アクセスが乗る。
どれがプロレベルかは難しい。
ま、運用が目的で、中身はどうでもいっかくらいだからから、
間違いの手法でも気にならないんだろう。
0242nobodyさん2014/05/05(月) 21:50:42.34ID:???
飲酒運転しているやつの言い訳にありそうなやつだなって思った(小並感)
0243nobodyさん2014/05/06(火) 10:03:03.23ID:Nk4oF//+
PHPとMySQLの質問です
mysqliを使って
___________________
|giftcode  .|←※カラム名「giftcode」
|0000-0000|←※ここから下は値
|0000-0001|
|1516-9247|
   ・
   ・
   ・

のようなテーブルから1つ(上からでもランダムでも良いです)値を取りだしてからその行を消したいのですが、その場合
アクセスが集中した際に、SELECT文を実行して値を取得するときからDELETE文を実行するときまでの時間に
他のアクセスが来て、同じ値を取得してしまうことは無いのでしょうか?
入っている値はgiftcodeのように1人にしか教えてはいけないものなので、
上記のようなことが起こりうるなら解決策を教えてほしいのです…よろしくお願いします
0244nobodyさん2014/05/06(火) 10:46:55.38ID:???
>>243
そういうロック処理をしてもらうのがデータベース。
トランザクションと排他ロックを使うことで同じ値をつかむのを防止できる。

必要なSQL文一式を START TRANSACTION と COMMIT 文で挟んでひとまとまりにし
FOR UPDATE でロックをかける。こうすることで、SELECT で取得したレコードは
COMMIT (またはROLLBACK)するまで、ほかのクライアントから一切読めなくなる。

START TRANSACTION;
SELECT 〜〜〜〜 FOR UPDATE;
DELETE 〜〜〜;
COMMIT;
0245nobodyさん2014/05/06(火) 11:21:59.78ID:Nk4oF//+
>>244
ありがとうございます。
ですが、ランダムに選ぶ場合は偶然あたった場合、
上から順の場合は他が使っていた場合のエラー処理はどうすれば良いのでしょうか?
できればmysqliで説明してくれると助かるのですが…
0246nobodyさん2014/05/06(火) 11:23:40.40ID:xK4xRkfj
【OS名】CentOS
【PHPのバージョン】6.5
【連携ソフトウェア】MySQL
【質問内容】
小さいというか小規模向けのフレームワークというのはないのでしょうか?
現在Codeigniterを使ったりしているのですが、MVCとして分けるほどのものでもないので
小規模向けのそういったフレームワークを探しています。
検索しても大きなものしか出てこないのですが無いので出てこないということでしょうか。
0247nobodyさん2014/05/06(火) 11:35:39.86ID:Nk4oF//+
>>245の続きです
流石に排他ロックされていないものを自動でSELECTできればいいなと思ったんですが、
giftcodeカラムの他にlockedカラムを作り、排他ロックする前にその行lockedをtrueにする、とプログラムを作れば
WHERE文で「lockedカラムがtrueでないもの」で探せば良いのではないかと考えました。
この考えはセキュリティ的に大丈夫でしょうか?
0248nobodyさん2014/05/06(火) 11:37:03.97ID:Nk4oF//+
>>247の「流石に」は無視でお願いします
流石に「排他ロックされていないものを自動でSELECT」は無理ですよね?
の書きかけです…
0249nobodyさん2014/05/06(火) 11:40:27.33ID:???
http://toro.2ch.net/test/read.cgi/db/1376466127/

こちらで聞いたら?
0250nobodyさん2014/05/06(火) 11:46:47.89ID:Nk4oF//+
>>249
データベース関係のですが、PHPで操作しているので
PHPの質問として質問してました…
次からはデータベースに近い質問はそちらでします…ありがとうございました
0251nobodyさん2014/05/06(火) 12:37:05.69ID:???
>>240
そう
でもそれだと書く量多いので工夫したい
02522442014/05/06(火) 12:45:16.85ID:???
>>245
詳しく言うと、>>244 の処理は、データベースから値を取りだして消すまで
ほかのアクセスを待たせます。そのため順序付けやランダムに関係なく、同時アクセスで
偶然同じ値を取得してしまうことは起こりえないわけです。

mysqli で書くとこんな感じ(手続き型で書いている場合は適宜書き換えてね)
$mysqli->begin_transaction();
$mysqli->query('SELECT giftcode FROM table_name WHERE 〜〜 FOR UPDATE;');
$mysqli->query('DELETE FROM table_name WHERE diftcode=○○');
$mysqli->commit();

>>247 のような "locked" フラグをいけると思いますが、
結局はそのフラグにも排他ロックが必要なのは同じなので、だったら無駄なことはせず、
上記のようなコードでいいと思います。
■ このスレッドは過去ログ倉庫に格納されています