

現在ドットインストールで簡単な投票システムを作っています。

<http://dotinstall.com/lessons/poll_php_v2/9710>

下記のif文が上手く動作していないせいか、  
正常に投票しても常に"不正な操作です！"が表示されますが、  
どの箇所が間違っているのでしょうか？

ソースも記載致します。

＜index.php＞  

[code]

    require_once('config.php');
    require_once('functions.php');
    
    session_start();
    
    if ($_SERVER['REQUEST_METHOD'] != 'POST') {
        // 投稿前
    
        // CSRF対策
        if (!isset($_SESSION['token'])) {
            $_SESSION['token'] = sha1(uniqid(mt_rand(), true));
        }
    
    } else {
        // 投稿後
        if (empty($_POST['token']) || $_POST['token'] != $_SESSION['token']) {
            echo "不正な操作です！";
            exit;
        }
    
        // エラーチェック
        if (!in_array($_POST['answer'], array(1, 2, 3, 4))) {
            $err = "写真を選択してください！";
        }
    
        if (empty($err)) {
            $dbh = connectDb();
            $sql = "insert into answers
                    (answer, remote_addr, user_agent, answer_date, created, modified)
                    values
                    (:answer, :remote_addr, :user_agent, :answer_date, now(), now())";
            $stmt = $dbh->prepare($sql);
            $params = array(
                ":answer" => $_POST['answer'],
                ":remote_addr" => $_SERVER['REMOTE_ADDR'],
                ":user_agent" => $_SERVER['HTTP_USER_AGENT'],
                ":answer_date" => date("Y-m-d")
            );
    
            if ($stmt->execute($params)) {
                $msg = "投票ありがとうございました！";
            } else {
                $err = "投票は1日1回までです！";
            }
    
        }
    
    }
    ?>
    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>投票システム</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <style>
        .selected {
            border:4px solid red;
        }
        </style>
    </head>
    <body>
    
    <?php if (!empty($msg)) : ?>
    <p style="color:green"><?php echo h($msg); ?></p>
    <?php endif; ?>
    
    <?php if (!empty($err)) : ?>
    <p style="color:red"><?php echo h($err); ?></p>
    <?php endif; ?>
    
    <h1>お料理コンテスト</h1>
    <form action="" method="POST">
    <img src="photo1.jpg" class="candidate" data-id="1">
    <img src="photo2.jpg" class="candidate" data-id="2">
    <img src="photo3.jpg" class="candidate" data-id="3">
    <img src="photo4.jpg" class="candidate" data-id="4">
    <p><input type="submit" value="投票する！"></p>
    <input type="hidden" id="answer" name="answer" value="">
    <input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>">
    
    </form>
    <script>
    $(function() {
        $('.candidate').click(function() {
            $('.candidate').removeClass('selected');
            $(this).addClass('selected');
            $('#answer').val($(this).data('id'));
        });
    });
    </script>
    </body>
    </html>
    
[/code]

＜config.php＞

[code]

    <?php
    define('DSN', 'mysql:host=localhost;dbname=dotinstall_poll_php');
    define('DB_USER', 'dbuser');
    define('DB_PASSWORD', 'dayama0328');
    
    define('SITE_URL', 'http://localhost/dotinstall/poll_php/');
    
    error_reporting(E_ALL & ~E_NOTICE);
    
    session_set_cookie_params(0, '/poll_php/');
    
    ?>
    
[/code]

＜functions.php＞

[code]

    <?php
    function connectDb(){
      try {
        return new PDO(DSN, DB_USER, DB_PASSWORD);
      } catch (PDOException $e) {
        echo $e->getMessage();
        exit;
      }
    }
    
    function h($s){
      return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
    }
    
    ?>
    
[/code]


CC BY-SA 4.0
2015-09-26T06:13:46.650
16943
2023-10-25T10:05:51.993
2023-10-25T10:05:51.993
3060
7176
question
php mysql session
session が意図した通り保存されない


config.phpにて`session_set_cookie_params`により、session
cookieのpathが`/poll_php/`となっています。  
これはsession
cookieが有効となるpathを`/poll_php/`以下とするためですが、他の記述から、実際にテストしているのは`/dotinstall/poll_php/`以下ではないですか？  
そのため実際の環境が`/dotinstall/poll_php/`であり`/poll_php/`ではないためsession
cookieが有効にはならず、sessionが維持されず、`$_SESSION['token']`が空となって、if文の条件式がfalseとしかならないためと思います。


CC BY-SA 3.0
2015-09-26T12:05:36.310
16959
2015-09-26T12:05:36.310
12301
16943
answer