【PHP】下らねぇ質問はID出して書き込みやがれ 133
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2014/04/19(土) 08:04:54.26ID:???過去スレ、関連スレ、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等)・フレームワークは各該当スレへ
0175nobodyさん
2014/05/01(木) 18:40:33.56ID:???効率重視ならRubyだろjk
0176nobodyさん
2014/05/01(木) 18:41:34.14ID:???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:???0184nobodyさん
2014/05/02(金) 00:08:13.50ID:ur7avpqc試していないのですが、
mb_strstr($value, "[")
で長音「ー」にヒットするので
mb対応でもだめみたいです
0185nobodyさん
2014/05/02(金) 00:13:36.91ID:???0186nobodyさん
2014/05/02(金) 00:17:04.58ID:???そもそもファイルをSJISにしとくのがおかしい
UTF-8保存してSJISで出力するようにしろ
0187nobodyさん
2014/05/02(金) 00:28:34.64ID:ur7avpqc>>186
レスありがとうございます。
とりあえず置換で対応して
UTF-8保存してSJIS出力にしてみます
0188nobodyさん
2014/05/02(金) 01:54:16.00ID:???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:ur7avpqcmb_internal_encodingはよく理解していませんでした
mb_strstrにencoding設定もしていなかったので正しく処理できていなかったと思います
参考になりました。ありがとうございます
0191nobodyさん
2014/05/02(金) 03:36:24.09ID:???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:???0194nobodyさん
2014/05/02(金) 14:00:12.59ID:???>理由としては上に書いたのと同じで、[とー以外の文字でこういった事が起きる場合があるから。
具体的にどの文字を指しているのかkwsk
0195nobodyさん
2014/05/02(金) 14:15:00.69ID:???つか、質問ならid出してくれ
0196nobodyさん
2014/05/02(金) 15:10:06.98ID:???utf-8のについてなんだけど
0197nobodyさん
2014/05/02(金) 15:16:36.39ID:???0198nobodyさん
2014/05/02(金) 16:53:49.64ID:???0200188
2014/05/02(金) 20:08:58.05ID:???>>186は本当にすまんかった。
以前UTF-16扱ってる時にでバグが出てたから勘違いしてた。
0201nobodyさん
2014/05/02(金) 20:27:24.10ID:???windows使うのがいかんのだろあが
で、UTF-8は何も問題なし?
0202nobodyさん
2014/05/02(金) 20:31:09.78ID:???なんでSJISだけそんなに食い付くの?
このスレで出てる回答の9割は嘘やいい加減な内容なのに。
基本的に質問者を騙して楽しむって暗黙の了解があるんだから水をさすなよ。
0203nobodyさん
2014/05/02(金) 20:36:57.02ID:???0204nobodyさん
2014/05/02(金) 22:32:39.44ID:???多分>>186は普段いないGW厨だろwたまたま来て覗いたけどそういう了解を知らないから間違った内容が目に入って思わず突っ込んだんだろw
0205nobodyさん
2014/05/03(土) 13:22:28.77ID:dwgODfUZ$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:???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:???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:???そんな記憶がある
0211nobodyさん
2014/05/03(土) 19:22:09.61ID:???0212nobodyさん
2014/05/03(土) 20:30:18.66ID:SAeP1+WOecho $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:???$a = "10円";
$b = 10;
if ($a === $b) {
echo "一致します";
}else{
echo "一致しません";
}
?>
0215nobodyさん
2014/05/03(土) 22:43:41.22ID:qufEmRhbありがとうございます
>>151のものはユーザーが入力した値を使えないし、
>>152だと1以上の値は使えない、だと痛いです…
とりあえず今すぐ作らなければいけないプログラムではないので、
時間があれば>>152のものを改造するなりどうしても分からなければ再度質問することにします。
それと、また聞きたい事がが出来てしまったのでまとまれば質問します、いつもすみません…
0217nobodyさん
2014/05/04(日) 12:51:19.54ID:SSVjx9p2乱数は基本のmd5とかshなんとかとかを適当にやって、
後はネットで検索するとランダムで英数字を作れる
サンプルが山ほどあるので、多くは桁数を指定できるので、
んで、基本の乱数にプラスでつければけっこう使える。
少数以下はなんに使うかわからないけど、
過激な重複がなければ、マイクロ秒をちびちびと
応用すれば、だいたい現場で使えるかと。
0218nobodyさん
2014/05/04(日) 16:22:19.43ID:???md5とかはハッシュ値を作るものであって乱数を決めるものじゃない。
ハッシュ値を出力するにしろ0-9a-fの範囲しか文字が存在しないから質問の回答としては不適切じゃね?
0219nobodyさん
2014/05/04(日) 17:25:16.70ID:i3JfacAa下の流れで処理するフォームを作りました。
1.送信フォーム
↓
2.確認画面
↓
3.送信完了
確認画面のエラー処理などで送信フォームに戻る処理をすると
参照したファイルがリセットされ「ファイルが選択されていません。」の状態に戻るのですが、
添付したファイルを維持するにはどうすればいいのでしょうか?
0222nobodyさん
2014/05/04(日) 18:44:10.10ID:i3JfacAaありがとうございます
0224nobodyさん
2014/05/04(日) 20:48:58.88ID:???0226nobodyさん
2014/05/04(日) 21:32:48.44ID:SSVjx9p2たしかに、会員サイトは長くやってるけど、
全部辞書とか見たりした独学でやってるんで、
プロっていうか企業のレベルは
わかりません。資格もないので。
現場っていうのは、まあ。そういうレベルではないけど
あるいみ実践なレベルです。
見方かえればごみかもしれません。はい。
0227nobodyさん
2014/05/04(日) 22:20:52.80ID:???0228nobodyさん
2014/05/04(日) 22:39:55.11ID:???乱数は基本のmd5とかを適用にやって現場で使えるかと。
ネットで検索するとサンプルが山ほどあるのでけっこう使える。
0229nobodyさん
2014/05/04(日) 22:45:25.19ID:???| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | J
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
0230nobodyさん
2014/05/05(月) 04:28:54.11ID:???ネットで検索すると(略)サンプルが山ほどある
↑PHPでこれをやるとどうなるか分かってるならいいんだけど。
PHPをけなすいつもの人と勘違いしないで欲しいんだけど、ネットのサンプルのひどさは有名だろ
0232nobodyさん
2014/05/05(月) 12:39:07.88ID:???MD5は衝突を無視すると、与えた入力と一意に対応するので、
解析用の辞書が出回っており、入力が文字列や数列になっていると、
わりと簡単にクラックされるので、用途に注意。
とかかな。
0236nobodyさん
2014/05/05(月) 15:47:10.22ID:CeNcO2Eiみたいな感じで連想配列に突っ込みたいんだけどできる?
0237229
2014/05/05(月) 17:32:37.81ID:???非常にネタ臭いというかネタであってほしいけどマジレスするよ。
////間違いその1
md5はハッシュ関数。
ハッシュ関数の詳細は下記のURL参照。
http://www.atmarkit.co.jp/aig/02security/hashfunction.html
一方乱数はランダムな数値。
だから「md5などハッシュ関数で乱数を作る」というのは間違い。
「乱数を用いてmd5などのハッシュ関数でランダムな文字列を作る」なら話は分かる。
////間違いその2
話の元ネタである質問は
「暗号論的に良い疑似乱数や真の乱数はないのか?」
といった質問をしている。
「ランダムな文字列」のことは一切聞いていない。
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//+mysqliを使って
___________________
|giftcode .|←※カラム名「giftcode」
|0000-0000|←※ここから下は値
|0000-0001|
|1516-9247|
・
・
・
のようなテーブルから1つ(上からでもランダムでも良いです)値を取りだしてからその行を消したいのですが、その場合
アクセスが集中した際に、SELECT文を実行して値を取得するときからDELETE文を実行するときまでの時間に
他のアクセスが来て、同じ値を取得してしまうことは無いのでしょうか?
入っている値はgiftcodeのように1人にしか教えてはいけないものなので、
上記のようなことが起こりうるなら解決策を教えてほしいのです…よろしくお願いします
0244nobodyさん
2014/05/06(火) 10:46:55.38ID:???そういうロック処理をしてもらうのがデータベース。
トランザクションと排他ロックを使うことで同じ値をつかむのを防止できる。
必要な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//+ありがとうございます。
ですが、ランダムに選ぶ場合は偶然あたった場合、
上から順の場合は他が使っていた場合のエラー処理はどうすれば良いのでしょうか?
できればmysqliで説明してくれると助かるのですが…
0246nobodyさん
2014/05/06(火) 11:23:40.40ID:xK4xRkfj【PHPのバージョン】6.5
【連携ソフトウェア】MySQL
【質問内容】
小さいというか小規模向けのフレームワークというのはないのでしょうか?
現在Codeigniterを使ったりしているのですが、MVCとして分けるほどのものでもないので
小規模向けのそういったフレームワークを探しています。
検索しても大きなものしか出てこないのですが無いので出てこないということでしょうか。
0247nobodyさん
2014/05/06(火) 11:35:39.86ID:Nk4oF//+流石に排他ロックされていないものを自動でSELECTできればいいなと思ったんですが、
giftcodeカラムの他にlockedカラムを作り、排他ロックする前にその行lockedをtrueにする、とプログラムを作れば
WHERE文で「lockedカラムがtrueでないもの」で探せば良いのではないかと考えました。
この考えはセキュリティ的に大丈夫でしょうか?
0248nobodyさん
2014/05/06(火) 11:37:03.97ID:Nk4oF//+流石に「排他ロックされていないものを自動でSELECT」は無理ですよね?
の書きかけです…
0249nobodyさん
2014/05/06(火) 11:40:27.33ID:???こちらで聞いたら?
0250nobodyさん
2014/05/06(火) 11:46:47.89ID:Nk4oF//+データベース関係のですが、PHPで操作しているので
PHPの質問として質問してました…
次からはデータベースに近い質問はそちらでします…ありがとうございました
0252244
2014/05/06(火) 12:45:16.85ID:???詳しく言うと、>>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" フラグをいけると思いますが、
結局はそのフラグにも排他ロックが必要なのは同じなので、だったら無駄なことはせず、
上記のようなコードでいいと思います。
0253nobodyさん
2014/05/06(火) 14:11:35.03ID:???コードまでありがとうございます!
でも(SELECT文などの)待機中にDELETEされたら待機してる処理が実行不可能になってしまうのでは…
それとWHERE文で排他ロックされていない行を探すことは出来ないのでしょうか?
そのためにlockedフラグを作ろうとしているのですが…
お願いします
0254nobodyさん
2014/05/06(火) 14:12:51.72ID:Nk4oF//+>>253でIDを忘れてしまいました
0255nobodyさん
2014/05/06(火) 15:53:45.85ID:???トランザクションの理解が不十分に思える。
共有ロックと排他ロックについて自分で調べるといいよ。
SELECT ... FOR UPDATE
SELECT ... LOCK IN SHARE MODE
http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-locking-reads.html
0256nobodyさん
2014/05/06(火) 17:20:52.83ID:???lockedフラグの考え方でいいよ。
排他ロックの話は、ロック解除時に使用済みのギフトカードを取得することになるんじゃないのという懸念のとおり。
update tname set locked = true where giftcode = (select giftcode from tname where locked = false order by random() limit 1);
の結果が、1件になるまで繰り返して、1件になったときのレコードを処理すればいいよ。
0257nobodyさん
2014/05/06(火) 17:21:25.53ID:???0258nobodyさん
2014/05/06(火) 17:27:58.90ID:???mysqlならこうかけるようだ
update tname set locked = true where locked = false order by random() limit 1;
便利ね。ただ、postgresqlのreturning相当のものがないと、結果を取得しないといけないので、
update tname set owner = ユーザIDかなにか where owner is null order by random() limit 1;
select giftcode from tname where owner = ユーザIDかなにか
giftcodeを使った処理
delete from tname where owner = ユーザIDかなにか
という流れでいいと思う。
0259nobodyさん
2014/05/06(火) 17:49:35.47ID:???テーブルにgiftcodeを取得したユーザーIDを格納するカラムに追加(仮にgetid)、初期値は0としておく
最初の取得で
begin transaction;
select 〜 for update where getid=0;
recordがあったら
update 〜 set getid=userid where (取得したgiftcode)
commit
recordがないときは、giftcodeは全部使い切ってる
後続の取得処理は、先行する処理がcommitするまで待たされる。
先行の処理のcommit後は、getidが0でないので、このgiftcodeは除外される
こんな感じかな
だれが取得したか記録しておく必要があるなら、giftcodeの削除は出来ないと思う
0260nobodyさん
2014/05/06(火) 18:57:01.61ID:???チェックデジットとかを付与してバルクアクセスを防止したほうが良さそうだけどどうだろう
0261nobodyさん
2014/05/06(火) 21:24:03.88ID:???0262nobodyさん
2014/05/06(火) 22:07:14.15ID:Nk4oF//+ありがとうございます!
ここで質問するまで、誰かが取得したギフトコードは個別の何かに移動するとか考えてましたが、
>>260の方法を使うことにします、ありがとうございました!
それと、実際に使う場面ではAmazonギフト券のコードを使うのですが、他にセキュリティなどで気をつけることがあればご教授お願いします…
0263nobodyさん
2014/05/07(水) 01:04:31.53ID:q/xRq63h【PHPのバージョン】5.5
【連携ソフトウェア】なし
【質問内容】
標準「入出力」のストリームがほしいのですが
どうしたら作れますか?
0264nobodyさん
2014/05/07(水) 03:36:35.00ID:???http://www.php.net/manual/ja/features.commandline.io-streams.php
0266nobodyさん
2014/05/07(水) 12:59:59.59ID:???264じゃないけど
標準入出力 というものがあると思って言っている?
それともそういう便利に抽象化する何かを期待している?
0267nobodyさん
2014/05/07(水) 14:06:40.85ID:???便利なストリームはないのか、ということだと思うけど、ないと思う
0268nobodyさん
2014/05/07(水) 14:10:00.10ID:???streamWrapperを使えば作れそうに見えるけど、試してみた?
0270nobodyさん
2014/05/09(金) 03:22:37.99ID:f3K0xu9Ltoは省略できないのでしょうか? できないとしたら自分のアドレスを使うのでしょうか
0271270
2014/05/09(金) 03:34:27.28ID:f3K0xu9L0272nobodyさん
2014/05/09(金) 09:56:15.62ID:???何か設定した方がいいと思うけどね。
■ このスレッドは過去ログ倉庫に格納されています