質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

1056閲覧

PHPとJQueryで作った投票システムで、投票回数を一日一回にcookieで設定したい

pokkun

総合スコア11

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2020/06/10 11:13

PHPとJQueryで作った投票システムを一日一回の投票に制限したいと思っております。MariaDBを使って一応は作動するのですが、cookieとsessionに値を保存させてif文を作っても反映されません。。

試したこと
if文とelseif文を書き、jqueryで、ボタンが押されたらsubmitを送信してanswerを取得して分岐させました。その際、cookieがあった場合はelseifで警告文を出すようにしましたが、警告文は出るが何回も投票できてしまいます。。ちなみにcookieの値は保存が確認できました。投票ボタンを押すとresult.phpに遷移します。

↓(toppage.php)

PHP

1<?php 2require('nndbconnect.php'); 3 4//投票時の処理 5if 6($_SERVER['REQUEST_METHOD'] === 'POST' && 7isset($_COOKIE['answer']) && 8in_array($_POST['answer'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) 9|| !isset($_COOKIE['answer'])) { 10$save = $db->prepare('INSERT INTO poll_system SET answers=?,created=NOW()'); 11 $save->execute(array($_POST['answer'])); 12   setcookie("useable_cookie",'true',time()+60*60*24*1); 13 14 header('Location:result.php'); 15 $db = null; 16 17 18 19}else if( 20 $_SERVER['REQUEST_METHOD'] === 'POST' && 21 !isset($_POST['answer']) || $_SERVER['REQUEST_METHOD'] === 'POST' && 22!in_array($_POST['answer'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) 23|| isset($_COOKIE['useable_cookie']) && $_SERVER['REQUEST_METHOD'] === 'POST' ) 24 25{ 26 $err = 'エラー発生!!!!!( ^)o(^ )'; 27 28}else{ 29 30 //なにもしない 31} 32 33 34//投票時のアクセストークン 35if(!isset($_SESSION['token'])){ 36 $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(16)); 37} 38 39if( 40 !isset($_SESSION['token']) && 41 !isset($_POST['token']) && 42 $_SESSION['token'] !== $_POST['token'] 43 ) { 44 $err = '不正な投票。。。(;^ω^)'; 45} 46//ここまで 47?> 48 49<!DOCTYPE html> 50<html lang="ja"> 51 <head> 52<meta charset="UTF-8"> 53<link rel="stylesheet" href="style.css"> 54<title>なぜなにぷろぐら民</title> 55</head> 56<body> 57<!-- header --> 58<header> 59  <h1 class="headline"> 60   <a>なぜなにぷろぐら民</a> 61 </h1> 62 <b><p class="subtitle">~プログラマーのSNS~</p></b> 63 <ul class="nav-list"> 64 <li class="nav-list-item"> 65 <a href="toppage.php">ホーム |</a> 66 </li> 67 <li class="nav-list-item"><a href="result.php">人気投票|</b></a></li> 68 <li class="nav-list-item"><a href="toppage.php">イベント|</a></li> 69 <li class="nav-list-item"><a href="contact.php">お問い合わせ</a></li> 70 </ul> 71 <img src="member_picture/top_image.png" alt=TOP画像 height="480" width="480"> 72 <b><p><span class="bbs_enter"><a href="bbs.php">なぜなに掲示板へ</a></p></span> 73 </b> 74 </header> 75 <!-- サイトの中身部分 --> 76 <?php if(isset($err)): ?> 77 <div class="error"><?php print(htmlspecialchars($err,ENT_QUOTES)); ?></div> 78 <?php endif; ?> 79 <div id="vote"> 80 <p><img src="member_picture/toilet.png" alt=TOP画像 height="80" width="95"> 81 最も気に入っているプログラミング言語を1つ教えてください<img src="member_picture/toilet.png" alt=TOP画像 height="80" width="95"></p> 82 <form action="" method="post"> 83<div class="row"> 84<div class="box" id="box_0" data-id="0"></div> 85<div class="box" id="box_1" data-id="1"></div> 86<div class="box" id="box_2" data-id="2"></div> 87<div class="box" id="box_3" data-id="3"></div> 88<div class="box" id="box_4" data-id="4"></div><br> 89<div class="box" id="box_5" data-id="5"></div> 90<div class="box" id="box_6" data-id="6"></div> 91<div class="box" id="box_7" data-id="7"></div> 92<div class="box" id="box_8" data-id="8"></div> 93<div class="box" id="box_9" data-id="9"></div><br> 94<div class="box" id="box_10" data-id="10"></div> 95<div class="box" id="box_11" data-id="11"></div> 96<div class="box" id="box_12" data-id="12"></div> 97<div class="box" id="box_13" data-id="13"></div> 98<div class="box" id="box_14" data-id="14"></div> 99 100 101<input type="hidden" id="answer" name="answer" value=""> 102<input type="hidden" name="thanks"> 103<input type="hidden" name="token" 104value="<?php print(htmlspecialchars($_SESSION['token'],ENT_QUOTES)); ?>"> 105</div> 106<div id="btn">投票する</div> 107 </form> 108 </div> 109 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> 110 <script> 111 $(function() { 112 'use strict'; 113 114 $('.box').on('click',function() { 115 $('.box').removeClass('selected'); 116 $(this).addClass('selected'); 117 $('#answer').val($(this).data('id')); 118 }); 119 120 $('#btn').on('click', function() { 121 if ($('#answer').val() === '') { 122 alert('どれか一つを選んでください!'); 123 124 } else { 125 $('form').submit(); 126 } 127 }); 128 $('.error').fadeOut(7000); 129 }); 130 </script> 131 132 <div class="eventtitle"> 133 <p>新着ITイベント</p> 134 <img src="member_picture/junbichu.png" alt=準備中 height="200" width="300"> 135 </div> 136<!-- footer --> 137 <footer> 138   <ul class="footer-menu"> 139 <li>ホーム |</li> 140 <li>人気投票 |</li> 141 <li>イベント |</li> 142 <li>お問い合わせ</li> 143 </ul> 144 <p>© All rights reserved by ぽっくん</p> 145 </footer> 146 </body> 147 148 </html>

↓result.php

PHP

1<?php 2 3require('nndbconnect.php'); 4 5$data1 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=0'); 6$cnt1 = $data1->fetch(); 7$data2 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=1'); 8$cnt2 = $data2->fetch(); 9$data3 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=2'); 10$cnt3 = $data3->fetch(); 11$data4 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=3'); 12$cnt4 = $data4->fetch(); 13$data5 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=4'); 14$cnt5 = $data5->fetch(); 15$data6 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=5'); 16$cnt6 = $data6->fetch(); 17$data7 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=6'); 18$cnt7 = $data7->fetch(); 19$data8 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=7'); 20$cnt8 = $data8->fetch(); 21$data9 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=8'); 22$cnt9 = $data9->fetch(); 23$data10 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=9'); 24$cnt10 = $data10->fetch(); 25$data11 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=10'); 26$cnt11 = $data11->fetch(); 27$data12 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=11'); 28$cnt12 = $data12->fetch(); 29$data13 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=12'); 30$cnt13 = $data13->fetch(); 31$data14 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=13'); 32$cnt14 = $data14->fetch(); 33$data15 = $db->query('SELECT COUNT(*) AS cnt FROM poll_system WHERE answers=14'); 34$cnt15 = $data15->fetch(); 35 36$allPoll = array( 37 'PHP'. ' ' .$cnt1[0]. '票', 38 'Javascript'. ' ' . $cnt2[0].'票', 39 'Python'. ' ' .$cnt3[0].'票', 40 'Java'. ' ' .$cnt4[0].'票', 41 'Ruby'. ' ' .$cnt5[0].'票', 42 'C++'. ' ' .$cnt6[0].'票', 43 'C#'. ' ' .$cnt7[0].'票', 44 'Swift'. ' ' .$cnt8[0].'票', 45 'Kotlin'. ' ' .$cnt9[0].'票', 46 'Go'. ' ' .$cnt10[0].'票', 47 'Scala'. ' ' .$cnt11[0].'票', 48 'Perl'. ' ' .$cnt12[0].'票', 49 'COBOL'. ' ' .$cnt13[0].'票', 50 'VBA'. ' ' .$cnt14[0].'票', 51 'その他'. ' ' .$cnt15[0].'票' 52); 53 54?> 55 56<!DOCTYPE html> 57<html lang="ja"> 58 <head> 59<meta charset="UTF-8"> 60<link rel="stylesheet" href="style.css"> 61<title>投票結果</title> 62</head> 63<body> 64<!-- header --> 65<header> 66  <h1 class="headline"> 67   <a>投票結果</a> 68 </h1> 69 <div class="pollarea"> 70 <?php foreach($allPoll as $poll): ?> 71 <p><?php print($poll); ?></p> 72 <?php endforeach; ?> 73 </div> 74 <p class="backtop"><a href="toppage.php">TOPへ戻る</a></p> 75 </b> 76 </header> 77 <!-- サイトの中身部分 --> 78 79<!-- footer --> 80 <footer> 81   <ul class="footer-menu"> 82 <li>ホーム |</li> 83 <li>本サイトについて |</li> 84 <li>イベント |</li> 85 <li>お問い合わせ</li> 86 </ul> 87 <p>© All rights reserved by ぽっくん</p> 88 </footer> 89 </body> 90 91 </html>

お手数ですが、ご回答をいただけますとありがたいです(';')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

条件がとても見づらい&記載されてるソース全角スペースなどありエラー出るだろうけどとりあえずは

php

1if 2($_SERVER['REQUEST_METHOD'] === 'POST' && 3isset($_COOKIE['answer']) && 4in_array($_POST['answer'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) 5|| !isset($_COOKIE['answer'])) {

この条件、!isset($_COOKIE['answer'])でクッキーセットされてなかったら全部trueになりますよね…

書いたとおり、条件がとても見づらいのでまず整理するのをおすすめします。

php

1// POSTかどうかでまずは分岐 2if($_SERVER['REQUEST_METHOD'] === 'POST') { 3 // POSTだったので送られてきたパラメータを見る 4 if(in_array($_POST['answer'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) !== false) { 5 // パラメータもあってたので次のチェック 6 } 7 else { 8 // パラメータがおかしい 9 } 10} 11else { 12 // POSTじゃないとき 13}

まずは整理しましょう&
header('Location:result.php');
header
でLocationしたならexitするべきだと思う

※result.phpのSQLはGROUP使えない?

投稿2020/06/10 16:51

編集2020/06/10 16:54
rururu3

総合スコア5545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pokkun

2020/06/11 00:10

ずっと悩んでおりましたが、おかげさまで解決できました!コードを整理したら投票を一回にでき、さらに他にif文を追加してクリック時にクッキーがあった場合はメッセージを出すことができました!SQLは最近学んだばっかりで、GROUP構文があることを知らなかったので、コードをまとめるためにも活用してみたいと思います! また、プログラマーのSNSを作ってみましたので、しょぼいですが、遊びにきてくださると嬉しいです。まだSSLも設定してませんし、テスト段階なので独自ドメインではないですが( ;∀;)一緒にSNSを作る仲間も同時に募集しております。 http://yumeblog.pinoko.jp/nazenani/toppage.php 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問