2012-01-30 125 views
0

我使用的MySQL產生在我的形式複選框未知量的未知量,這個數字將始終變化,處理複選框

$frinfoq = mysql_query($frinfo) or die (mysql_error()); 
    while($frow = mysql_fetch_assoc($frinfoq)) { 
     $username = $frow['username']; 
     $ct = $frow['country']; 
     $fruuid = $frow['uid']; 
     ?> 
    <tr><td><p><?php echo $username; ?></p></td><td><p><?php echo $ct; ?></p></td><td><form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" id="delf"><input type="hidden" value="<?php echo $fruuid; ?>" /><input type="checkbox" name="add[]" value="<?php echo $fruuid; ?>" id="a_t_game" /><form></td></tr> 


    <?php 
    } 
    ?> 

當表單提交,並通過「create.php處理「它應該只將檢查用戶添加到一個mysql表中,每個用戶一行,我確定(我不確定這是否適用於由於我將要解決的問題)這樣的檢查:

if($_POST['add'] == true) { 
    $user_uid = $_POST['add']; 
    } 

然後我嘗試添加像這樣的行:

$arr = array($user_uid); 
foreach($arr as $user_uid) { 
$game = "INSERT INTO wd_game (game_uid,user_uid,lastmove,startcountry) VALUES ('$gid','$user_uid',now(),'none')"; 
$gameq = mysql_query($game) or die (mysql_error()); 
} 

除了設置爲「陣列」的用戶uid之外,所有的數據輸入都很好。它也只創建一行,並且我需要每個用戶一行。

我知道這是我的數組正在處理的方式的一個問題,這很明顯,但我沒有關於如何解決它的最霧的想法。任何幫助/指針將是一個很大的幫助!

+1

是你沒有使用線路中斷?必須寫書面。說真的,把你的字符串分成多行沒什麼問題。 – 2012-01-30 15:31:12

+0

請不要在if語句中使用「== true」。他們100%是多餘的。 – 2012-01-30 15:37:29

+0

您確實知道[未檢查的複選框將不會在POST/GET數據中定義](http://stackoverflow.com/questions/2520952/how-come-checkbox-state-is-not-always-passed-along-到PHP腳本)? – 2012-01-30 15:40:19

回答

0

$arr = array($user_uid);是你的問題。試試$arr = $user_uid;,或者甚至刪除中間人,只使用$arr = $_POST["add"];


編輯

有許多的那也可以用你的代碼改進其他的事情。首先,它很難閱讀。我建議將它清理一下,並避免在HTML和PHP之間跳躍。

另一件事是,你應該轉義任何數據進入數據庫,可能來自用戶輸入(如$ _POST)。你應該使用mysql_real_escape_string

第三件事情是,指向$_SERVER["PHP_SELF"]的動作的表單不安全。它容易受到跨站點腳本(XSS)的影響。有關此漏洞的更詳細描述,請參閱this blog

我建議你做更多的事情是這樣的:

<?php 

if ($_POST["add"]) 
{ 
    $arr = $_POST["add"]; 

    foreach ((array)$arr as $user_uid) 
    { 
     $game = "INSERT INTO wd_game (game_uid,user_uid,lastmove,startcountry) VALUES ('". mysql_real_escape_string($gid) ."','". mysql_real_escape_string($user_uid) ."', now(), 'none')"; 
     $gameq = mysql_query($game) or die (mysql_error()); 
    } 
} 

$frinfoq = mysql_query($frinfo) or die (mysql_error()); 

while($frow = mysql_fetch_assoc($frinfoq)) 
{ 
    $username = $frow['username']; 
    $ct = $frow['country']; 
    $fruuid = $frow['uid']; 
    echo " <tr> 
     <td> 
      <p>{$username}</p> 
     </td> 
     <td> 
      <p>{$ct}</p> 
     </td> 
     <td> 
      <form method=\"post\" action=\"". htmlentities($_SERVER['PHP_SELF']) ."\" id=\"delf\"> 
       <input type=\"hidden\" value=\"{$fruuid}\" /> 
       <input type=\"checkbox\" name=\"add[]\" value=\"{$fruuid}\" id=\"a_t_game\" /> 
      <form> 
     </td> 
    </tr>\n"; 
    } 
?> 
+0

這是一個很好的工作,你修復了我的代碼,服務器的自我部分,這是另一種形式,它不應該在那裏 - 刪除它,現在整個事情運行,謝謝你的提示,非常感謝! – AviateX14 2012-01-30 15:57:51

0

你的問題是在這裏:

$arr = array($user_uid); 

的$ user_uid已經在$ _POST數組;再次將它轉換爲數組將使其成爲二維。

試試這個。

if($_POST['add'] == true) { 
    $user_uid = $_POST['add']; 
} 
foreach($user_uid as $userId) { .... 
+0

這會拋出一個錯誤: 爲foreach()提供的參數無效 – AviateX14 2012-01-30 15:51:00

0

看來$ user_uid已經是一個數組,並且你將它包裝成一個數組(再次),從而產生一個多維數組。考慮測試$ user_uid,看看它是否是一個數組:

if(!is_array($user_uid)) { 
    $arr = array($user_uid); 
} else { 
    $arr = $user_uid; 
} 

然後,我相信你的代碼將做你的期望。