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か? select name=""そのドロップダウンリストの cat[.$row['pk_id'].]) を置きます。

コメントから移植されたコード:

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ループでは、変数変数を介してすべてのポスト キーをグローバル変数に抽出しています$$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 に答える