2012-01-30 124 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; 
} 

然后,我相信你的代码将做你的期望。