如何在while循环中验证和限制动态单选按钮

时间:2017-07-06 02:48:40

标签: php

我尝试从我的数据库中动态生成单选按钮,但是我被困在需要限制的位置(检查用户是否在提交到数据库之前选择了生成按钮的至少5组(5种不同游戏)。

<?php while($row =  mysql_fetch_array($query)) : ?>  
    <?php
    $home_team = $row\['home_team'\];
    $away_team = $row\['away_team'\];
    $game_id = $row\['game_id'\];
    $team_joined =  $home_team.' VS '.$away_team;
    $teams =  $home_team.'vs'.$away_team;
    $match_day = @$row\['match_day'\];
    $match_time = @$row\['match_time'\];

    date_default_timezone_set('Africa/Lagos');
     $time = date('l, jS F h:iA'); 
    ?>
     <?php 
    if (isset($_POST\['submit'\])) {
     $amount = mysql_real_escape_string($_POST\['amount'\]);
    $games = @$_POST\[''.$game_id.''\];
    $countGames = count($games);
    echo $countGames;
    /* if ($countGames < 3) {
     $errorfill = "please selecet 3 games";
     } else { */
     if ($amount) {
     foreach ($games as $game) {
    $gameValue = $game;
    if ($amount < $bank_verify) {
    $money_left = $bank_verify - $amount;
     $deduct_query = mysql_query("UPDATE bank SET money_unit='$money_left' WHERE username='$username' ");
    $query_start_game = mysql_query("INSERT INTO bet10_players VALUES('', '$username', '$amount',
                      '$gameValue', '$team_joined', '$game_id','$time', '$pin', '$match_day', '$match_time')") or die(mysql_error());
    header("Location: print.php?pin=$pin&time=$time");
    } else {
    $errorbank = "SORRY!!! You do not have enough units to stake this bet";
    }
    }
    } else {
    $errorfill = "You have not entered any amount";
    }
    //}
    }
    ?>
    <form role="form" action="#" method="post">
    <h5><?php echo $team_joined; ?></h5>
    <h5><?php echo '<span style="color:#f0ad4e;">' . $match_day . ', ' . $match_time . '</span>'; ?></h5>
    <label><input type="radio" name="<?php echo '' . $game_id . '\[' . $game_id . '\]'; ?>" value="<?php echo $home_team; ?>">Home</label>&nbsp;
    <label><input type="radio" name="<?php echo '' . $game_id . '\[' . $game_id . '\]'; ?>" value="Draw ">Draw</label>&nbsp;
    <label><input type="radio" name="<?php echo '' . $game_id . '\[' . $game_id . '\]'; ?>" value="<?php echo $away_team; ?>">Away</label>
    <hr>
    <?php endwhile; ?>

    <div class="form-group">
    <input type="text" name="amount" class="form-control" placeholder="Enter your amount here">
    <input type="submit" name="submit" value="submit" class="btn btn-danger"  style="margin-bottom: 10px;">

这是我想用这些代码https://i.stack.imgur.com/Xif8M.png

实现的图像的链接

1 个答案:

答案 0 :(得分:0)

因为你所拥有的东西有很多问题,所以我实际上无法修复&#34;你有什么良心。不推荐使用mysql_*库(在&gt; = PHP7中删除),正如我所指出的那样,您正在逃避一堆您不需要的东西。此外,如上所述,使用@来消除警告不是一个好主意,您只需要修复它们。如果我这样做,我会创建一系列课程。我还会做一个.htaccessweb.config(Windows)强制一切通过索引页面,但我怀疑你的脚本中有个别页面,所以我会继续这个概念:

首先,我可能会创建一个具有一些简单,有用的功能的基础应用程序。

<强> /vendors/App.php

<?php
class App
    {
        # Easily return post values even if they don't exist without drawing errors
        public  function getPost($key=false)
            {
                if(!empty($key))
                    return (isset($_POST[$key]))? $_POST[$key] : false;

                return $_POST;
            }
        # Easily return session values even if they don't exist without drawing errors
        public  function getSession($key=false)
            {
                if(!empty($key))
                    return (isset($_SESSION[$key]))? $_SESSION[$key] : false;

                return $_SESSION;
            }
        # Used to render pages
        public  function render($file)
            {
                ob_start();
                include($file);
                $data   =   ob_get_contents();
                ob_end_clean();
                return $data;
            }
    }

<强> /vendors/Game.php

如果您创建基础游戏类,您将能够更好地控制与游戏相关的基本功能

<?php
class Game extends App
    {
        protected   $games  =   array();    
        protected   $errors =   array();
        protected   $con;
        # Inject the database
        public  function __construct(\PDO $con)
            {
                $this->con  =   $con;
            }
        # Fetch a list (or just one) game
        public  function gameList($game_id = false)
            {
                $where          =   (!empty($game_id))? " WHERE game_id = '{$game_id}'" : "";
                $this->games    =   array();
                $query          =   $this->con->query("SELECT * FROM games{$where}");
                while($result = $query->fetch(PDO::FETCH_ASSOC)) {
                    $this->games[]  =   $result;
                }

                return $this;
            }
        # Send back the games if stored
        public  function getGames($first = false)
            {
                # If you you only need one row returned
                if($first)
                    return (isset($this->games[0]))? $this->games[0] : false;
                # Return entire list
                return $this->games;
            }
        # Count how many are currently stored
        public  function getCount()
            {
                return count($this->games);
            }
    }

<强> /vendors/Game/Observer.php

如果您创建了一个基本的Game Observer类,您最好能够控制侦听器和处理请求。

<?php
namespace Game;

class Observer extends \Game
    {
        protected   $time;
        # This is a general listener method, listens for the post
        # It needs work, I don't know where you are getting some of these
        # variables from...I am injecting for example-sake
        public  function listen($bank_verify,$pin,$min=5)
            {
                # Listen for the submission
                if(empty($this->getPost('submit')))
                    return $this;
                elseif(empty($this->getSession('username')))
                    return $this;
                # Fetch the post values, fitler empty
                $REQUEST    =   array_filter($this->getPost('game'));
                # See if there are at least 5 submitted
                if(count($REQUEST) < $min) {
                    $this->errors[] =   'You must have at least '.$min.' selected';
                    return $this;
                }

                foreach($REQUEST as $id => $value) {
                    $this->games[$id]   =   $value;
                }

                $username   =   $this->getSession('username');
                $amount     =   $this->getPost('amount');

                if($amount < $bank_verify) {
                    $money_left = $bank_verify - $amount;
                    $this->updateAccount($money_left,$username);

                    foreach($this->games as $id => $value) {
                        $query_start_game = $this->con->prepare("INSERT INTO bet10_players VALUES('',?,?,?,?,?,?,?,?,?)");
                        $query_start_game->execute(array(
                            $username,
                            $amount,
                            $gameValue,
                            $team_joined,
                            $game_id,
                            $time,
                            $pin,
                            $match_day,
                            $match_time
                        ));
                    }
                }
                else {
                    $this->errors[] =   'Not enough money.';
                    return $this;
                }

                header("Location: print.php?pin=$pin&time=$time");
                exit;
            }
        # This sets the timezone (just once)
        public  function setTime($tz = 'Africa/Lagos')
            {
                date_default_timezone_set($tz);
                $this->time =   date('l, jS F h:iA');
                return $this;
            }
        # This will update the account safely
        public  function updateAccount($money_left,$username)
            {
                $sql    =   "UPDATE bank SET money_unit = ? WHERE username = ?";
                $query  =   $this->con->prepare($sql);
                $query->execute(array($money_left,$username));
                return $query;
            }
        # This probably needs work, but you should insert using this method
        public  function addBets($array,$table='bet10_players')
            {
                $fill   =   "'', ".implode(', ',array_fill(0,count($array),'?'));
                $sql    =   "INSERT INTO `{$table}` VALUES({$fill})";
                $query  =   $this->con->prepare($sql);
                $query->execute($array);
                return $query;
            }
        # Returns the time if need be...
        public  function getTime()
            {
                return $this->time;
            }
    }

<强> /config.php

我会创建此页面以包含在顶部的所有页面上。它可以扩展,并且最好保持一致性,如根路径等。

<?php
# start the session
session_start();
# Create some useful defines
define('DS',DIRECTORY_SEPARATOR);
define('ROOT_DIR',__DIR__);
define('CLASSES',ROOT_DIR.DS.'vendors');
define('DB_HOST','localhost');
define('DB_NAME','databasename');
define('DB_USER','root');
define('DB_PASS','');
# Create a class autoloader which turns a \Namespace\Class into a directory
# like /var/html/domain/mydomain/vendor/Namespace/Class.php
spl_autoload_register(function($class) {
    $path   =   str_replace(DS.DS,DS,CLASSES.DS.str_replace('\\',DS,$class).'.php');
    if(is_file($path))
        include_once($path);
});

<强>的index.php

<?php
# Check if we are inside the class, if not, do so
if(!isset($this)) {
    # Include the config file
    require_once(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Create your connection (you should expand on this...)
    $con    =   new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
    # Create a Game object
    echo (new \Game\Observer($con))->render(__FILE__);
    # Stop further execution
    exit;
}
# Now we are inside the \Game\Observer class, so you can now use $this
# Set the time and add a listener for post
$this->setTime();
# Since there is no indication of where some of these variables come from,
# this listen method will need attention...actually all the elements from the
# \Game and \Game\Observer need review, but they should be close enough to figure out
$this->listen($bank_verify,$pin);
?>
<form role="form" action="" method="post">
    <?php
    # $this->gameList()->getGames() should just return an array from your database
    foreach($this->gameList()->getGames() as $row) {
        $team_joined    =   $row['home_team'].' VS '.$row['away_team'];
        $teams          =   $row['home_team'].'vs'.$row['away_team'];
    ?>
    <h5><?php echo $team_joined; ?></h5>
    <h5><span style="color:#f0ad4e;"><?php echo $row['match_day'].', '.$row['match_time'] ?></span></h5>
    <input type="hidden" name="game[<?php echo $row['game_id'] ?>]" value="" />
    <label><input type="radio" name="game[<?php echo $row['game_id'] ?>]" value="<?php echo $row['home_team']; ?>" />Home</label>&nbsp;
    <label><input type="radio" name="game[<?php echo $row['game_id'] ?>]" value="draw" />Draw</label>&nbsp;
    <label><input type="radio" name="game[<?php echo $row['game_id'] ?>]" value="<?php echo $row['away_team']; ?>" />Away</label>
    <hr>
    <?php
    }
    ?>
    <div class="form-group">
        <input type="text" name="amount" class="form-control" placeholder="Enter your amount here" />
        <input type="submit" name="submit" value="submit" class="btn btn-danger"  style="margin-bottom: 10px;" />
    </div>
</form>

当您处理帖子时,您将根据游戏ID从数据库中检索数据,因此您应该获得所需的所有变量,除了脚本中没有原点指示的变量。无论如何,如果我是你,这就是我会做的。最后一点,我还没有测试过这个,有些方法基于我使用的框架,但我认为它是一个更安全版本的脚本,其中涉及sql注入,尽管你将不得不研究什么其中一些是......