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

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

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

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

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

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

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

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

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0428nobodyさん2012/01/07(土) 13:30:43.65ID:???
>>426
PHP + MySQLってことなんでその範囲で
とりあえずMySQLは目的に関係ない
PHPでCookieを使うかSESSIONを使え
1回目の投稿で投稿日時を保存
2回目の投稿の時に前の投稿から一定時間が経過していない場合はエラーを返すかDBに登録しない

教えてやったからコーラ買ってこいよ
0429nobodyさん2012/01/07(土) 13:32:01.36ID:???
IPやクッキーや携帯固有番号とかつかえ
0430nobodyさん2012/01/07(土) 13:39:14.31ID:???
>>384
ありがとうございます。
0431nobodyさん2012/01/07(土) 13:44:51.23ID:???
このPHPソースで情報とれたぞ。
このサイトで実験した。

http://gogomo.site90.net/

<?php
$ip = getenv("REMOTE_ADDR");
$host = getenv("REMOTE_HOST");
if ($host == null || $host == $ip) $host = gethostbyaddr($ip);
echo "IP = $ip</br>\n";
echo "HOST = $host</br>\n";
?>
0432nobodyさん2012/01/07(土) 13:53:19.27ID:???
またおっさん頓珍漢なこと書いてるし
マジで頭おかしいんじゃねーの
0433nobodyさん2012/01/07(土) 14:06:41.50ID:4WAxjW+f
>>428-429
ありがとうございます
しかしながら投稿時間とIPアドレスを保存して一定時間経過してない場合はエラーを返して終了する処理をしても多重投票されてしまいます。
国内サーバーの場合は問題ないのですが海外サーバーの場合レスポンスが遅いのでそれが原因でしょうか?
0434nobodyさん2012/01/07(土) 14:13:32.73ID:???
ソース晒したら問題に答えるよ
0435nobodyさん2012/01/07(土) 14:20:46.31ID:???
ただのPC向けサイトだったら

session_start();

$delay = 120; // 120秒制限

if($_SERVER['REQUEST_TIME'] - $_SESSION['posttime'] < $delay) {
echo '120秒の間隔をあけてくださいね';
exit;
}

// 初回もしくは120秒以上経過している
$_SESSION['posttime'] = $_SERVER['REQUEST_TIME'];
# ここでDBに投入
echo '投票しました';

こんだけ
コーラ買ってこいよ
0436nobodyさん2012/01/07(土) 14:33:49.61ID:???
sessionだとブラウザ再起動で再投票できてしまうかもな
ボット避けにimgタグでcookie食わせるのもいいかもね
あと 焼きそばパン買って来い
0437nobodyさん2012/01/07(土) 14:37:49.94ID:???
sessionを拒否してる場合は連投できるけど、初心者の習作だと思ってそこは説明しなかった
ややこしくなるだけだし
0438nobodyさん2012/01/07(土) 14:40:19.64ID:???
ソース無い時点で丸投げか釣り
まともに答える必要はない
0439nobodyさん2012/01/07(土) 15:25:05.07ID:4WAxjW+f
>>435
ありがとう。しかしながら

>>436-437
なるほど、sessionは使ってはいけないのですね
DBに投票時間とIPアドレス保存してそれをチェックが普通ですよね?

>>438
恥ずかしながらソース晒します笑わないでください
0440nobodyさん2012/01/07(土) 15:27:18.81ID:4WAxjW+f
ソースです

$regtime = time();
$ip = GETENV("REMOTE_ADDR");

# テーブルロック
$sql = "LOCK TABLES touhyou WRITE";
$rst = mysql_query($sql,$con);

# 多重投票チェック
$delay = time() - 10;
$sql = "SELECT * FROM touhyou WHERE (regtime > '$delay') AND (ip = '$ip')";
$rst = mysql_query($sql,$con);
$rec = mysql_num_rows($rst);
if($rec){ errorpage("多重投票禁止"); exit(); }

# 投票
$sql = "UPDATE touhyou SET count = ifnull(count,0) + 1,regtime = '$regtime',ip = '$ip' WHERE (code = '$code')";
$rst = mysql_query($sql,$con);

# テーブルロック解除
$sql = "UNLOCK TABLES";
$rst = mysql_query($sql,$con);
0441nobodyさん2012/01/07(土) 15:34:21.95ID:???
>>440
438じゃないけど
regtimeと$delayの比較が逆じゃない?

あとそのロジックだと1codeにregtimeとIPが1つずつしかないから
違うIPの人が交互に投票すれば制限なくなりそうだけど
0442nobodyさん2012/01/07(土) 15:36:45.34ID:???
あごめん、引っかかったらエラーだからいいのか。
0443nobodyさん2012/01/07(土) 15:47:58.06ID:4WAxjW+f
>>441
ありがとうございます
IPアドレスと投票時間だけのテーブルを別途作りました
これで多重投票はできない?

# 多重投票チェック
$delay = time() - 10;
$sql = "SELECT * FROM ipaddress WHERE (regtime > '$delay') AND (ip = '$ip')";
$rst = mysql_query($sql,$con);
$rec = mysql_num_rows($rst);
if($rec){ errorpage("多重投票禁止"); exit(); }

# テーブルロック
$sql = "LOCK TABLES touhyou WRITE";
$rst = mysql_query($sql,$con);

# IPアドレス追加
$sql = "INSERT INTO ipaddress (regtime,ip) values ('$regtime','$ip')";
$rst = mysql_query($sql,$con);

# 投票
$sql = "UPDATE touhyou SET count = ifnull(count,0) + 1 WHERE (code = '$code')";
$rst = mysql_query($sql,$con);

# テーブルロック解除
$sql = "UNLOCK TABLES";
$rst = mysql_query($sql,$con);
0444nobodyさん2012/01/07(土) 15:54:48.70ID:???
>>443
440のソースでやってみたらF5連打しても多重投票されなかったけど
0445nobodyさん2012/01/07(土) 15:56:38.23ID:???
ipだけ記録して24時間毎にデータベースを初期化すれば良い。
0446nobodyさん2012/01/07(土) 15:57:13.89ID:???
>>445
それだと初期化する1分前に投票して初期化後にまた投票できるぞ
0447nobodyさん2012/01/07(土) 16:00:43.57ID:???
いつ初期化されるのか確認するやつもいないだろ。
サーバーの処理が少ない方がいいんだ。
1分後に投票できたとしても次にできるまで24時間かかる。大した不正にならない。
0448nobodyさん2012/01/07(土) 16:33:03.74ID:4WAxjW+f
>>444
はい自宅の環境でも問題なかったです
しかしながら海外のレスポンス遅いサーバーでやると多重投票されてしまうのです

>>445-447も上と同じだと思います

テーブルロックするタイミングとか問題なのかな?と思っているのですがよくわかりません
0449nobodyさん2012/01/07(土) 16:54:16.52ID:???
>>448
そういうことなんで先に言わないの?
0450nobodyさん2012/01/07(土) 17:18:09.00ID:???
センスないなー

テーブルを
ip(IP入れる) post(投票IDを入れる)
ipがプライマリーキー

# 投票
INSERT IGNORE INTO tableName (ip,post) VALUES ($ip, $postid);

# 投票結果集計
SELECT COUNT(ip) AS n FROM tableName WHERE post=?;

これだけでいいじゃん
0451nobodyさん2012/01/07(土) 17:28:01.88ID:???
ちなみに>>450だとそのテーブルは投票イベントごとのテーブルね
1つのテーブルで何回も投票イベントを管理する場合はプライマリキーを組み合わせたり工夫すること

さっさとコーラ買ってこいよ
さっきから待ってんだけど
0452nobodyさん2012/01/07(土) 17:46:08.75ID:???
さらに付け加えておくと
1つのレコードを不特定多数のユーザーがupdateかけるような設計は最低だから覚えといてね

カレーパン追加な
0453nobodyさん2012/01/07(土) 18:02:56.85ID:???
同時アクセスの問題を処理するためのデータベースだろう。
あとテーブルのロックは不要だろ。それを命令することで不具合でないか?
それって一気に更新するトランザクション処理するとき用だろ。
0454nobodyさん2012/01/07(土) 18:08:29.88ID:???
データベースは同時アクセス来ても待ち行列にいれて順に処理するから問題でないはずだろう。
調べてみたらロック命令が付いてるほうが特殊で、SQLiteだとトランザクションモードに入ったら勝手にロックがかかって他所から更新できないようだぞ。


http://www.advancesoft.co.jp/wiki/?SQLite-LOCK-CHECK
接続Aでトランザクションが開始されている時に接続BでもINSERTを実行すると「SQL error: database is locked」とエラーになります。
0455nobodyさん2012/01/07(土) 18:13:41.39ID:???
便利なやつ作ったよ。SQLite(PDO)を使ったMap。
これでデータベースを意識しないでデータベースを利用できる。
このサイトではPDOは動かずSQLITE2は動くようだがそれに対応するのは後回しにする。

http://ideone.com/DmggH
0456nobodyさん2012/01/07(土) 18:20:31.25ID:???
だから>>450で済むだろーが
トランザクションかんけーねーしテーブルロックいらねーし
0457nobodyさん2012/01/07(土) 18:22:54.07ID:???
>>455
なんだこのクソみたいなソース
よく恥ずかしげもなくこんなもん晒せるな
0458nobodyさん2012/01/07(土) 18:27:53.31ID:???
ブルックスの法則だな
人脳を連結しても処理速度は上がらない が 出力が多様化する
0459nobodyさん2012/01/07(土) 19:53:46.80ID:4WAxjW+f
>>450
1つのIPで(何分待っても)1回しか投票できないってことですか?
うーん、よくわからないです
0460nobodyさん2012/01/07(土) 19:59:52.15ID:???
>>459
>1つのIPで(何分待っても)1回しか投票できないってことですか?
そう
もし何回でも投票可能にしたいならまた他の方法になる

いずれにしても1レコードを不特定多数ユーザーでupdateかける設計はウンコなのでそこは考えなおす
そんな設計してたらオレならリストラ候補の先頭に登録しとく
0461nobodyさん2012/01/07(土) 20:11:43.08ID:???
仕様の打ち合わせからとかw
0462nobodyさん2012/01/07(土) 20:39:54.59ID:???
どうせだから最強のアクセスカウンタ作ろうぜ
攻性防壁付きでステマをゲイツ砲で火達磨にしようぜ
0463nobodyさん2012/01/07(土) 20:41:38.53ID:???
正確にカウントするには、取得できたIPだけの判定ではダメ。
携帯やプロキシやモデム再起動に対応しないと同じ人が何度も投稿できる。
0464nobodyさん2012/01/07(土) 20:43:16.13ID:???
>>459
ルータ再起動でアドレス変わるから何度でも投票できます
0465nobodyさん2012/01/07(土) 20:49:07.13ID:???
大阪市長選やAKB総選挙など不正が一大事になるようなものに対応できるようにするんだ。
IDとパスワードで認証すれば1度しかできないことは確定するが、そういう手間の掛かる認証はないの方向で。
0466nobodyさん2012/01/07(土) 21:00:48.87ID:???
>>465
選挙だと同じ回線で複数の有権者の投票が考えられる たとえば2世帯住宅とか
IDパスワードより手軽というと生体認証となる が インフラ整備が大変そう
今 生体認証の変換で思いついたんだが VoIPで声帯認証ってどうだろか
0467nobodyさん2012/01/07(土) 21:08:38.36ID:???
馬鹿の考え休むに似たり
認証うんぬん言ってる奴は他所でやれ
0468nobodyさん2012/01/07(土) 21:31:52.64ID:???
だな
0469nobodyさん2012/01/07(土) 21:34:52.36ID:???
おい>>450 おまえがIP認証のコードなんか書くから>>467が怒ってるぞ ちゃんとあやまっとけよ
0470nobodyさん2012/01/07(土) 21:59:58.40ID:???
IPアドレス
0471nobodyさん2012/01/07(土) 22:01:22.84ID:???
PHPer、レベル低くっ!
なんだこのスレ。
0472nobodyさん2012/01/07(土) 22:01:37.59ID:???
>>455を利用して、プロキシチェックとアクセス数のカウントしてみた。

サイト
http://gogomo.site90.net/
ソース
http://ideone.com/aDkpu
0473nobodyさん2012/01/07(土) 22:18:10.36ID:???
また人生詰んだプログラマにもなれなかったおっさんが一人で暴れてるな
0474nobodyさん2012/01/07(土) 22:18:31.53ID:???
>>472はここの公開プロキシを判定できずすり抜けてしまったよ。

http://www.cybersyndrome.net/
0475nobodyさん2012/01/07(土) 22:29:20.11ID:???
ここも抜けられた。直IPとは違ってるから設定ミスはない。


http://taruo.net/e/
総合評価:?(A 以上 or 生 IP。下記参照) 疑惑 0%:proxy の兆候は全く見られません。


http://fula.jp/cgi-bin/env/
総合判定 直接アクセスされているか、プロクシなら匿名での接続を確認しました。プロクシの可能性は低いです。
0476nobodyさん2012/01/07(土) 22:34:40.92ID:???
2chのプロキシチェッカーは強力だった。突破できず。この精度まで持って行けないと不正を防げないなあ。


ERROR:公開PROXYからの投稿は受け付けていません!!
0477nobodyさん2012/01/07(土) 22:39:41.39ID:???
>>449
>>433
0478nobodyさん2012/01/07(土) 22:40:59.21ID:???
mixiとかの、ページがグーグル、ヤフーなどの検索サービスで
引っかからない仕様はphpっでどうやるのですか?
0479nobodyさん2012/01/07(土) 22:42:14.56ID:???
ロボットにクロールさせない命令出してるか、ログイン必須サイト。
0480nobodyさん2012/01/07(土) 22:46:10.95ID:???
BBQ使えば
0481nobodyさん2012/01/07(土) 22:48:27.79ID:???
2chのチェッカーって一般人も使えるのか。今知った。
0482nobodyさん2012/01/07(土) 22:48:37.01ID:qev3DgRj
abstractとinterfaceとtraitはどんな風に使い分ければいいですか?
0483nobodyさん2012/01/07(土) 23:10:52.85ID:???
niku.2ch.netか
2shレベルの串規制だと簡単な投票には使えそうだな
0484nobodyさん2012/01/07(土) 23:11:07.59ID:???
>>482
全然違うもんだろ。基礎勉強すれ。
0485nobodyさん2012/01/07(土) 23:11:50.13ID:???
レベル低すぎ。
0486nobodyさん2012/01/07(土) 23:18:01.62ID:???
>>484
分かんないならレスしないでもらえます?
0487nobodyさん2012/01/07(土) 23:19:40.32ID:???
キーワードでしか語れないニートのオッサンか。
具体的に細かいとこ突っ込んだらすぐにボロを出して、顔真っ赤にして釣り宣言して逃亡するのがオチだろ。
0488nobodyさん2012/01/07(土) 23:37:41.72ID:???
おっさんはそろそろブログでやるといいと思うぞ
もしかしたらファンがつくかもよ
アフィ貼ったら収入に!

もしくは早めに諦めて吊ったほうがいい
0489nobodyさん2012/01/08(日) 00:47:02.84ID:???
>>482
class と interface は型の定義手段
abstract class と trait は差分プログラミングという名の手抜き手段の一つ
0490nobodyさん2012/01/08(日) 00:52:14.60ID:5w8ZM1Tv
capthca 使うとかですかね?
0491nobodyさん2012/01/08(日) 00:53:12.04ID:5w8ZM1Tv
captchaだった。。。
0492nobodyさん2012/01/08(日) 11:20:03.75ID:phv4PYdF
PHPでアプリケーションスコープはどのように実装すればよろしいでしょうか?
0493nobodyさん2012/01/08(日) 13:14:37.31ID:???
あきた
0494nobodyさん2012/01/08(日) 13:27:05.48ID:???
無限ループってこわいよね
0495nobodyさん2012/01/08(日) 13:40:15.60ID:???
まぁもうそろそろ吊る予定だろうから最期くらい多少好きにさせてあげなよ
0496nobodyさん2012/01/08(日) 15:39:24.13ID:???
なんだこのスレ。
0497nobodyさん2012/01/08(日) 17:49:54.61ID:???
何故動かないんだ、っとよく見たら$が抜けてる。
変数に$つけるのって忘れない? php歴2年目のオレが言ってみる。
0498nobodyさん2012/01/08(日) 18:16:51.26ID:???
ASやJS弄った後にPHP使うとたまに忘れる
0499nobodyさん2012/01/08(日) 18:54:15.86ID:???
変数の後ろに$付けちゃうことない?
0500nobodyさん2012/01/08(日) 19:06:00.92ID:???
$this->$dataみたいに余計に$つけてエラーになる
0501nobodyさん2012/01/08(日) 19:46:27.97ID:???
>>489
abstractとinterfaceの具体的な使い分けはどうしてますか?
実装が書きたかったらabstractっていうのはあまりにもアレなので
哲学とまでは言いませんが、確固たる理由をつけて使い分けたいんです
0502nobodyさん2012/01/08(日) 19:49:55.78ID:???
確固たる理由が2chのカキコとかw
0503nobodyさん2012/01/08(日) 20:09:47.40ID:???
>>502
分かんないならレスしないでもらえます?
0504nobodyさん2012/01/08(日) 20:16:41.16ID:???
>>501
>>1
0505nobodyさん2012/01/08(日) 22:55:18.22ID:???
PHPでできないことはJavaでできる
JavaでできないことはPHPでできる
一長一短だな
0506nobodyさん2012/01/08(日) 23:48:20.26ID:???
PHPでできることはJavaでもできる
JavaでできることはPHPではできないかもしれない
0507nobodyさん2012/01/08(日) 23:54:20.13ID:???
>>506
Javaってインタプリタで動作させることできるん?
0508nobodyさん2012/01/08(日) 23:56:40.83ID:???
JavaでPHPは実装できる。
PHPでJavaは実装できない。
0509nobodyさん2012/01/09(月) 00:04:39.31ID:???
>>507
できないJavaの完敗です
0510nobodyさん2012/01/09(月) 00:07:08.56ID:???
>>507
当たり前だが、
Javaで実装されたPHPで可能。
最終的にJavaのクラスに変換されるので
ちょっと違うがmod_phpよりも早いよ。
0511nobodyさん2012/01/09(月) 00:58:52.24ID:???
なんだこのスレ。バカばっかり。
0512nobodyさん2012/01/09(月) 01:04:55.75ID:???
>>510
えっその理屈でいくとphpでもjava実装できるじゃん
0513nobodyさん2012/01/09(月) 01:14:15.07ID:???
>>512
Javaで実装されたPHPはすでにあるから。

Quercus
http://www.caucho.com/resin-3.0/quercus/

WordPressなんかで試してみたら?

とかJavaで実装されることは別に珍しい話じゃないと思うけど。
PHPで実装された言語は知らないけど、
Javaで実装された言語だったら他にもあるじゃん。
JRubyとかJython、Rhinoとか。
0514nobodyさん2012/01/09(月) 01:17:33.12ID:???
phpだろうがJavaだろうがどうでもいいけど、
変な対抗意識を持つ前に両方を
経験してみたらいいかがだろうか?
0515nobodyさん2012/01/09(月) 01:18:12.56ID:???
そもそもJavaで実装されたphpはphpそのものじゃん
Java と PHP そのものでできる・できないの話なのに
0516nobodyさん2012/01/09(月) 01:20:20.67ID:???
>>512

こっちに詳しく書いてあるから、勉強してね。
http://quercus.caucho.com/quercus-3.1/doc/quercus.xtp
0517nobodyさん2012/01/09(月) 01:23:11.79ID:???
>>515
変なこと書いているけど
Javaで実装されたphpではJavaとして最終的に動く。

メリットは以下のとおり(公式サイトより)。
Security: since Quercus and its modules are entirely in Java, C pointer overruns and segmentation violations are no longer possible.
Scalability: PHP programs can take advantage of distributed sessions in PHP and load balancing.
Performance: Quercus outperforms a straight mod_php implementation by about 4x (for Mediawiki and Drupal). Quercus roughly matches PHP performance with accelerators like APC.
Caching: PHP applications using Quercus can immediately take advantage of Resin's proxy caching. They can also use the PHP APC caching API since the APC functions are included with Quercus.
Connection pooling, transactions, JMS: PHP programs using Quercus automatically take advantage of Resin's connection pooling, and can use the full distributation transactions, and Java capabilities like JMS.
Java tools: PHP developers can use Java tools like profilers to get in-depth information about the PHP program performance.

0518nobodyさん2012/01/09(月) 01:27:24.62ID:???
>>515
PHPはC言語やJavaで実装されているわけでしょ?
ということはPHPでできることはCやJavaでできるでしょ?
逆は無理の場合が多いことは想像つくでしょ?
0519nobodyさん2012/01/09(月) 01:30:44.14ID:???
>>518
少ないの間違いね。
↓
逆は無理の場合が多いことは想像つくでしょ?
0520nobodyさん2012/01/09(月) 01:36:42.65ID:???
>>515
横レスで悪いが、
たとえば、PHPはC言語で実装されているのに、
PHPはC言語よりも優れているのですか?実装元よりも優れるのですか?
便宜上優れることはあってもパフォーマンスで優れることはないよ。
0521nobodyさん2012/01/09(月) 01:40:05.31ID:???
そんなこと言ったらアセンブリ/Cが最強って話になるじゃん
0522nobodyさん2012/01/09(月) 01:45:46.42ID:???
>>521
パフォーマンス上はマシン語が最高です。

>>515
C言語で実装されたPHPでC言語を実装し、
PHPで実装されたC言語でPHPを実装する・・・無限ループ
最高か?wwww

やっぱりこのスレ、次元低すぎ。
0523nobodyさん2012/01/09(月) 01:47:48.94ID:???
>>521
当たり前やん。
0524nobodyさん2012/01/09(月) 02:00:28.99ID:???
phpがjavaに劣ってるならこんなに普及しないさ
perl/phpが普及したのには理由がある



0525nobodyさん2012/01/09(月) 02:08:44.11ID:???
すなわちその理由がjavaにできないこと
0526nobodyさん2012/01/09(月) 02:09:01.17ID:???
>>512
あなたの一生涯をかけてphpでJavaを実装します?
C言語で実装されたphpでJava仮想マシンとJava言語を構築、
phpで構築されたJava仮想マシン上でJavaで実装されたphpが動き、
Java仮想マシン上で動くphpでさらにJava仮想マシンを動かすわけですか。
またmod_phpとしてAndroidやユニバーサルなV2CやEclipseみたいな
デスクトップアプリまでとして動いちゃったりするんですか?

>>524
それはすべてのプログラミング言語に当てはまるから議論にならない。
でなきゃすべてマシン語で書けということになる。

いや愉快だな。
0527nobodyさん2012/01/09(月) 02:11:31.73ID:???
多言語覚えれば変な対抗心をなくなる。
こんな議論は時間のムダ。
0528nobodyさん2012/01/09(月) 02:12:57.81ID:???
で結局javaはインタプリタで動かせるの?
phpのソースではなくjavaのソースをね
■ このスレッドは過去ログ倉庫に格納されています