2017-07-06 15 views
1

我試圖從我的數據庫動態生成單選按鈕,但我被卡在需要限制的位置(檢查用戶是否至少選擇了5個組(5個不同的遊戲)如何驗證並限制一個while循環內的動態單選按鈕

<?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

+0

這裏有幾點,你不應該像''''''''那樣逃脫你的''和''''。您不應該使用'@'來壓制警告,而應該使用'isset()'和/或'empty()'。停止使用'mysql_ *'funcitions,從PHP 7中刪除它們,最後停止在您的sql語句中使用變量。那些是注射危害。研究綁定參數。最後,你的問題有點寬泛,哪部分不適用於你的代碼? – Rasclatt

+0

我真的很感激@Rasclatt。我會糾正這一點。回到問題中,我最終想要實現的是使用if語句來檢查用戶是否從許多列表中選擇至少5個不同的遊戲。我無法做到這一點,它會讓用戶選擇低於我要求的目標的遊戲。此外,每當我提交遊戲時,我都觀察到,儘管事實上我使用了一個提交輸入,但每個遊戲都會在數據庫中輸入新行。 – Fatherhero

+0

#拉斯拉特,請幫助我。謝謝 – Fatherhero

回答

0

實現圖像只是你有什麼,我實際上不能「修復」你良心良知的東西。mysql_*庫已被棄用(已刪除在> = 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注入,儘管你必須研究一些這方面的內容正在做...

+0

謝謝先生#Rasclatt。我非常感謝你的努力,但如果我不會欺騙我自己,我必須向你承認我不是OOP。我可以通過您的電子郵件將整個代碼發送給您(如果您不介意給我)並導出我的mysql表。謝謝#Rasclatt – Fatherhero