【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等)・フレームワークは各該当スレへ
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:???何か設定した方がいいと思うけどね。
0275nobodyさん
2014/05/09(金) 12:43:58.06ID:???とりあえず本当に検索したのか疑問なんだけど
「php micro framework」とか「php フレームワーク 軽量」で検索して好きなものを見つけろ
0278nobodyさん
2014/05/09(金) 14:06:45.07ID:???長くなるけど
<?php
$ary = array();
$idx = a;
foreach(explode() as $item){
$ary[$idx] = $item;
$idx++;
}
// http://secretaccess.seesaa.net/s/article/257600560.html を参考にしました
?>
これでどう?
0282nobodyさん
2014/05/09(金) 18:10:48.44ID:???0283nobodyさん
2014/05/09(金) 18:40:35.27ID:RDgDN0Q7【PHPのバージョン】php5.2.8
【連携ソフトウェア】Pear HTTP_Request2
【質問内容】
・知りたいこと
お気に入りの巡回・更新バッチを作っているのですが、HTTP_Request2 で、
最大受信バイト数を指定する方法はあるでしょうか。調べたけど、バッファの
サイズは指定できるのに、最大バイト数の指定については、リファレンスにも
見当たりません。
もしくは、他に簡単に、URL指定、タイムアウト指定、最大バイト数指定をして
HTTPでコンテンツを取得できる方法はないでしょうか。
最大バイト数を指定したいのは、php 側ではそれほどメモリを使いたくない為、
Allowed memory size of 〜 bytes exhausted エラーで落ちちゃうのをやめたい
ためです。
・他にやってみたこと
代替案として、file_get_contents のバイト数制約を使ってみたのですが、こち
らは、バイト数の制約はできるのですが、条件によっては、http の取得中に、
フリーズする不具合があるので、使えませんでした。(再現URLは、友人の
個人サイトのrssなのですが、不思議と、HTTP_Response2 ではフリーズは
発生しませんでした。調べてみると、response 待機中に無限ループになる
可能性があって改善策はないそうで)
Waitかけつつ、常駐で動かしていきたいので、堅牢なライブラリはない
ものかと考えてます。(そもそもphpは常駐には向いてないのかもしれませんが)
すみませんが、ご存じの方いたら、ご教示くださいませ。
0284nobodyさん
2014/05/09(金) 19:11:18.67ID:???0286nobodyさん
2014/05/09(金) 19:48:05.68ID:???プロトコル的に考えれば、HEADでContent-Lengthを取得、制限したいバイト数と比較して、
Rangeヘッダを付加したGETを送信すればいいだけだと思うよ。
0287nobodyさん
2014/05/09(金) 20:42:30.85ID:???PHP5.2.8使ってるのに堅牢なライブラリがあるわけがない。
あとRSSの取得でAllowed memory size of 〜 bytes exhausted エラーが起きるっておかしい。
どれだけ大きいRSSなんだよと。
データ取得部分より他のところでエラーが起きているかどうか見たほうが良いと思う。
常駐しているって書いてあるから、特にメモリ関係。
http://php.net/manual/ja/features.gc.performance-considerations.php
こんな感じで組んでるんだったら現環境で解決しようとするのは諦めた方がいい。
ループじゃなくてcronで実行するとかなら問題起きないかも。
0288nobodyさん
2014/05/10(土) 00:40:56.41ID:???オフならsession_startする方法ありますか
0289nobodyさん
2014/05/10(土) 01:01:36.90ID:???0291nobodyさん
2014/05/10(土) 01:46:28.65ID:???0292nobodyさん
2014/05/10(土) 01:48:35.52ID:???それで妥協できないならphpにこだわる必要はないかなと
0294nobodyさん
2014/05/10(土) 02:28:41.85ID:???0295nobodyさん
2014/05/10(土) 04:03:17.09ID:???たとえば、$arr['a', 'b'] = explode(' ', 'a_val b_val'); みたいに書くことはできないのかって質問なら、
気持ちは分からんでもないと思うわけで。
0296nobodyさん
2014/05/10(土) 04:41:10.58ID:???そういう書き方を例としてあげられるのは、前提として>>236の質問があったからこそだと思うよ。
PHPの構文でエラーが出るような書き方で質問するのは難しいだろうね。
「pythonではこういう書き方できるけどPHPではこういう書き方できないのか」みたいな一文があれば良いかもしれない。
ただそれもpythonとか他の言語を知っていれば入れられる文章だけど。
0297nobodyさん
2014/05/10(土) 05:00:59.82ID:???0298nobodyさん
2014/05/10(土) 05:58:28.59ID:9ae9/7cJありがとうございます
0299nobodyさん
2014/05/10(土) 06:07:03.28ID:kBl9fngz【OS名】 Windows 7 64bit版
【PHPのバージョン】 5.5 64bit版
【連携ソフトウェア】 SQL Server 2008
【質問内容】
Windows(64ビット機)上で、Apache(64ビット版)+PHP(64ビット版)を動作させています。
この動作環境で、PDOで SQL Server に接続する要件が発生しました。
PHP(64ビット版)でPDOでSQLServerに接続する方法を教えてください。
なお、Microsoft Drivers 3.0 for PHP for SQL Server では上記環境をサポート
していませんでした。
宜しくお願いします。
0301nobodyさん
2014/05/10(土) 09:48:12.05ID:???PHPを32bit版にするのが手っ取り早い。
気もする。
0302nobodyさん
2014/05/10(土) 10:17:38.22ID:???$_GETか$_POST使った方がエラー出にくい?
0303nobodyさん
2014/05/10(土) 10:25:29.58ID:???0305nobodyさん
2014/05/10(土) 11:06:30.41ID:???sum = (a, b) -> a + b
みたいな感じで関数書きたいんだけどできる?
0306nobodyさん
2014/05/10(土) 16:28:19.37ID:???0307nobodyさん
2014/05/10(土) 16:28:38.20ID:???return $a + $b;
};
echo $sum(5, 8);
0308nobodyさん
2014/05/10(土) 16:33:39.88ID:???0309nobodyさん
2014/05/10(土) 17:03:15.48ID:???あれ便利だったのに
0311nobodyさん
2014/05/10(土) 17:18:21.07ID:???そういうあなたにはこれがお勧め
http://hacklang.org/
0312nobodyさん
2014/05/10(土) 20:29:42.73ID:???おまいみたいなカスのタイプ量なんざたかが知れとるわw
0313nobodyさん
2014/05/11(日) 00:14:54.48ID:???>>236がそういう例を挙げればいいのにって話で。
むしろその例を挙げることができたのは>>240のレスがあったからこそですよ。
>>305
ラムダ式が一番近いと思うけど
0316nobodyさん
2014/05/11(日) 02:42:04.55ID:???0317nobodyさん
2014/05/11(日) 04:51:06.22ID:???0319nobodyさん
2014/05/11(日) 15:03:10.57ID:3BaeSEEWテーブル自体を取得するにはどうすればいいのでしょうか?
特定の関数を使うのかそれともクエリを実行して配列に入れるのでしょうか?
0320nobodyさん
2014/05/11(日) 15:15:45.87ID:???テーブルのリストがほしいってこと?
それなら MySQL に INFORMATION_SCHEMA っていうデータベースがあってそこに入ってる。
0321nobodyさん
2014/05/11(日) 15:55:36.35ID:???他の人間にも参考になるし、雰囲気は悪くない板だ
多分、回答者はここのメンバーと重なるけどね
0322nobodyさん
2014/05/11(日) 16:24:57.98ID:???0323nobodyさん
2014/05/11(日) 16:30:06.75ID:3BaeSEEWテーブルのリストがほしいです。
具体的にはテーブルのリストを取得してそれをドロップダウンに反映させたいんです。
ありがとうございました。
0324nobodyさん
2014/05/11(日) 16:40:28.55ID:???0326nobodyさん
2014/05/11(日) 17:40:07.82ID:???まさか、DBのファイルを直接アクセスして自分で解析したいわけじゃないよね?
0327nobodyさん
2014/05/11(日) 17:56:44.34ID:???PHP側で動かすならそう単純でもないんじゃない
テーブル一覧を引っ張ってきても表示でつまずきそうだけどな
そういう関数があれば別だが
0328nobodyさん
2014/05/11(日) 18:04:10.25ID:???0329nobodyさん
2014/05/11(日) 18:05:25.35ID:???聞きたいことはこれなんでそ?
0330nobodyさん
2014/05/11(日) 21:33:26.99ID:???0331nobodyさん
2014/05/11(日) 21:50:44.25ID:???それならDBのスレでいいなw
>>330
危ないか?
業務でそういうの作ってるわけじゃないからよくわからんが
0332nobodyさん
2014/05/11(日) 21:56:22.51ID:???順次テーブルが増えるシステムなんじゃないかな。例えばアクセスログだとか
0334nobodyさん
2014/05/12(月) 03:54:47.50ID:???0335nobodyさん
2014/05/12(月) 06:43:58.16ID:???自動採番で便利だったのに
0336nobodyさん
2014/05/12(月) 07:49:13.34ID:???■ このスレッドは過去ログ倉庫に格納されています