处理未知数量的复选框

时间:2012-01-30 15:30:22

标签: php mysql arrays checkbox html-form

我使用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());
}

除了设置为“Array”的用户uid之外,所有数据输入都很好。它也只创建一行,每个用户需要一行。

我知道我的数组处理方式存在问题,这很明显,但我对如何修复它并不是最模糊的想法。任何帮助/指针都会有很大的帮助!

3 个答案:

答案 0 :(得分: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";
    }
?>

答案 1 :(得分:0)

你的问题在这里:

$arr = array($user_uid);

$ user_uid已经是$ _POST中的一个数组;再次将它转换为数组将使其成为二维。

试试这个。

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

答案 2 :(得分:0)

似乎$ user_uid已经是一个数组,你将它包装在一个数组中(再次),从而产生一个多维数组。考虑测试$ user_uid以查看它是否是一个数组:

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

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