【问题标题】:Storing checkbox data存储复选框数据
【发布时间】:2009-08-29 06:21:48
【问题描述】:

我目前正在编写一个脚本,其中显示一组复选框:

<?
  while($i = mysqli_fetch_array($get_perms)){

  $pname = $i[pname];
  $id = $i[id];
?>
  <div>
    <input type="checkbox" tabindex="1" name="<? echo("$id");?>" value="1" <? if($permissionid[$id] == '1') {echo ' checked="checked" ';}?> /><?echo(" $pname");?>
  </div>
<? } ?>     

不过,我也有另一部分在做类似的事情,但对于Sget_perms 是不同的sql 来获取不同的数据。

现在,很明显,在将数据回发到表单/脚本时,在区分表单中的两个数据位之间会出现问题。

这是更新表单给出的数据的 SQL:

$insert = mysql_query("UPDATE `perms` SET
    `title`='$_POST[title]',
    `1` ='$_POST[1]',
    `2` ='$_POST[2]',
    `3` ='$_POST[3]',
    `4` ='$_POST[4]',
    `5` ='$_POST[5]',
    `user` ='$_POST[username]'
     WHERE `userid` = '$valued_user_show[id]'
")

那么我到底如何正确区分这两者,并且能够正确输入SQL呢?

表的schema基本上是:

7 列,userid, user, 1, 2, 3, 4 ,6 userid 是表单之前已发布到脚本的用户的用户标识。用户是名称。 数字是权限号。

$get_perm 是用于从数组中的表中加载有关用户的当前信息的 sql。

【问题讨论】:

  • 您可以添加表模式以及您尝试使用 Sget_perms 函数做什么吗?这将有助于找到解决方案。

标签: php mysql forms checkbox


【解决方案1】:

首先:从不在 SQL 语句中包含用户提交的数据而不进行转义!恶意用户可以利用它来破坏您的数据,未经授权检索数据,并造成各种伤害。始终使用 mysql_real_escape_string() 转义提交到查询中的值。

关于您的实际问题:要区分两组相似的字段,只需给它们不同的名称。也许第一个会被称为permsA,第二个会被称为permsB。然后你会得到这样的 HTML:

<input type="checkbox" tabindex="1" name="permsA_<? echo $id;?>" value="1" <? if($permissionid[$id] == '1') {echo ' checked="checked" ';}?> /><?echo htmlspecialchars($pname);?>

请注意,我还包括对 htmlspecialchars() 的调用以正确转义 $pname 值以在 HTML 中使用,并且我省略了 "$id" 周围不必要的引号(将变量放在引号中只会使 PHP 做额外的处理以解析字符串;您可以不带引号回显变量本身)。

然后在你的 SQl 语句中:

$insert = mysql_query("UPDATE `perms` SET
    `title`='" . mysql_real_escape_string($_POST[title]) . "',
    `1` ='" . mysql_real_escape_string($_POST['permsA_1'] . "',
    `2` ='" . mysql_real_escape_string($_POST['permsA_2'] . "',
    `3` ='" . mysql_real_escape_string($_POST['permsA_3'] . "',
    `4` ='" . mysql_real_escape_string($_POST['permsA_4'] . "',
    `5` ='" . mysql_real_escape_string($_POST['permsA_5'] . "',
    `user` ='" . mysql_real_escape_string($_POST['username']) . "'
     WHERE `userid` = '$valued_user_show[id]'
")

这里唯一的变化是添加permsA_前缀,并正确转义所有用户提交的值。

【讨论】:

  • 很抱歉,所有其他实时脚本在数据之前都有转义字符串,我通常在主要脚本开发完成之前不包括转义:)
  • 有趣的是……表单正在提交给 Array/useredit.php(脚本名为 useredit.php……它不在“Array”文件夹中。
【解决方案2】:

使用您的复选框创建一个数组:

<input type="checkbox" name="mycheckbox[]"/>

“mycheckbox”将在您的 _POST 数据中作为数组提供。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多