作りたいもの:SQLを使って1日1回だけ投票(そのうち複数回に変えるかも)できるWebページ
問題:
スマホからリロードや戻るボタンを連打すると2重登録できてしまいます。
コード通りに動いてくれれば防げるような気もするのですが、原因が分からず困っています。
原因と対策方法を教えていただけないでしょうか。
※今のところPCは2重登録ができない。
2重登録の対策でセッションを使用してみようと思ってコードを変更してみたところ、
「不正なリクエストです」となってしまいます。
echoで確認しても両方空のようでうまく動きません・・・
ほぼ参考サイトのコピペなのですがなぜでしょうか。
※index側では値が入っているのは確認できました。
ついでに質問:
■下のような書き方をしたいのですが、取得できなかった時どうなるのか分からずうまく動きません。
書き方を教えていただけたらと思います。
$res = $pdo -> query($sql);
if ( $res == 0 ) {
} else {
}
■以下の処理が想定通りに動いてない?
同じ日付とIPが既にあったら票だけ上書きしたい。けど増殖する・・・
$sql = "INSERT INTO point_idolclass (日付, IP, 票) VALUES ('".date("Y-m-d")."', '".$ip."', 1 ) ON DUPLICATE KEY UPDATE 票
■index.php
PHP
1session_start(); 2$toke_byte = openssl_random_pseudo_bytes(16); 3$csrf_token = bin2hex($toke_byte); 4$_SESSION['csrf_token'] = $csrf_token; 5 6$ip = $_SERVER['REMOTE_ADDR']; 7$point = 0; 8$sql = "SELECT 票 FROM point WHERE IP = '".$ip."' AND 日付 = '".date("Y-m-d")."'"; 9$res = $pdo -> query($sql); 10foreach( $res as $value ) { 11 $point = $value[票]; 12} 13 14 15if( $point < 1 ) { 16 echo '<form action="./touroku.php" method="POST">'; 17 echo ' <input type="hidden" name="csrf_token" value="<?=$csrf_token?>">'; 18 echo ' <label><input type="radio" name="text" value="A"> A</label><br>'; 19 echo ' <label><input type="radio" name="text" value="B"> B</label><br>'; 20 echo ' <input type="submit">; 21 echo '</form>'; 22}
■touroku.php
PHP
1$ip = $_SERVER['REMOTE_ADDR']; 2 3$point = 0; 4$sql = "SELECT 票 FROM point WHERE IP = '".$ip."' AND 日付 = '".date("Y-m-d")."'"; 5$res = $pdo -> query($sql); 6foreach( $res as $value ) { 7 $point = $value[票]; 8 9if ( $point < 1 && $text != "" ) { 10 $sql = "INSERT INTO point_idolclass (日付, IP, 票) VALUES ('".date("Y-m-d")."', '".$ip."', 1 ) ON DUPLICATE KEY UPDATE 票 = VALUES(票)"; 11 $sth = $pdo -> query($sql); 12 $sql = "INSERT INTO unofficial_rank (日付, 名前, 票) VALUES ('".date("Y-m-d")."', '".$text."', 1 )"; 13 $sth = $pdo -> query($sql); 14 $member = $text; 15} 16header('Location: ./index.php?member='.$member);
■touroku.php 確認用
PHP
1 2<?php 3 session_start(); 4 echo $_POST["csrf_token"]; 5 echo $_SESSION['csrf_token']; 6 7 if ( $_POST['csrf_token'] === $_SESSION['csrf_token']) { 8 echo "aaa"; 9 } else { 10 echo "不正なリクエストです"; 11 } 12?>
回答3件
あなたの回答
tips
プレビュー