0

我正在尝试为下拉菜单选择的值发布到我的数据库表中。但由于某种原因,它没有将值输入数据库。我正在尝试发布cat_id到我的数据库中。所以我使用下面的代码从数据库中的值中生成我的下拉列表。然后在下面我有将信息插入数据库的功能。但由于某种原因,它不起作用。我想把什么放在select name=""正确的地方?

<select name="cat[<?=$row['pk_id']?>]">
              <?php $cat = dbConnect("SELECT * FROM category");
                    if(empty($row['cat_id'])){
                    ?>
                    <option value="">Select Category</option>
                    <?php
                    }
 
              ?>
                       
                  
              <?php while($cat_r = mysql_fetch_array($cat)){ 
              
              if($row['cat_id'] == $cat_r['cat_id']){
              ?>
              <option value="<?=$cat_r[cat_id]?>" selected="selected"><?=stripslashes($cat_r[cat_name])?></option>
              <?php
              continue;
              }
              
              ?>
             <option value="<?=$cat_r[cat_id]?>"><?=stripslashes($cat_r[cat_name])?></option>
<?php }  ?>
</select>

这是我对 MySQL 的插入

dbConnect("INSERT INTO post_info(add_to_random, show_home, source, display_vote_page, cat_id) values(1,1,1,0,cat[.$row['pk_id'].])");

我在这里为价值做错了cat_id吗?我把 cat[.$row['pk_id'].]) 放在select name=""那个下拉列表中。

从评论移植的代码:

if($_POST and $_POST['action'] == 'submit'){ 
  foreach($_POST as $k=>$v){
    $$k = $v;
  } 
  foreach($cat as $k=>$v){
    if($v =='') continue;
    dbConnect("UPDATE twit_info set cat_id=" . $v . " where pk_id =". $k ); 
  }
  if(count($pkid)>0){
    $pid = implode(',',$pkid); 
    dbConnect("UPDATE twit_info set add_to_vote = 1, display_vote_page = 1 where pk_id in(". $pid .")"); 
  }
}
4

1 回答 1

0

因此,在您的foreach循环中,您将通过 variable 变量将所有 post 键提取到全局变量中$$k(我将在一秒钟内了解这一点)。在您的dbConnect()电话中,报价不正确。你应该在$cat.

dbConnect("
  INSERT INTO post_info
    (add_to_random, show_home, source, display_vote_page, cat_id) 
    values(1,1,1,0, '" . mysql_real_escape_string($cat[$row['pk_id']]) . "')" );

我已经添加了对mysql_real_escape_string(). 这至少是必要的,以保护您的所有查询免受 SQL 注入。此时您的其他UPDATE语句也很容易受到攻击,您也必须对它们执行一些转义。

关于提取$_POST到全局变量中 - 我强烈建议不要这样做。您实际上是在模仿register_globals被认为非常危险的行为。危险在于,除了您实际希望收到的密钥之外,任何人都可能将任何$_POST密钥发布到您的表单中,这可能会将脚本中的另一个变量初始化为您的脚本不期望它发送的值。

虽然我真的只是建议$_POST直接操作,而不是提取到全局变量,如果你必须将它们提取到全局变量,我建议你使用可接受$_POST键的白名单:

// Make an array of allowed keys
$good_keys = ('action', 'cat', 'otherformkey');
foreach($cat as $k=>$v){
  // Only extract if it is one of the allowed keys
  if($v =='' || !in_array($k, $good_keys) continue;

  // Cast to an integer
  $v = intval($v);
  $k = intval($k);
  // Non-integer strings will cast to zero, so don't do the db action.
  if ($v > 0 && $k > 0) {
    dbConnect("UPDATE twit_info set cat_id=" . $v . " where pk_id =". $k ); 
  }
  // For string values which are quoted in the SQL (unlike the int values above)
  // escape them with mysql_real_escape_string()
  // $v = mysql_real_escape_string($v)
}
于 2012-10-28T22:15:34.117 回答