0

インターネットからスクリプトをコピーして変更しました。スクリプトは、最初に mysql テーブル クエリから選択されたレコードを削除しました。insert into ステートメントを使用して、選択したレコードを別のテーブルに挿入するようにスクリプトを変更しました。

選択したすべてのレコードを mysql 配列から同じ ID を持つ他のテーブルに挿入する方法を知りたいです。

ロジックは、「orderdetails」テーブルのロジックと似ています。注文したすべての製品に同じ注文番号を付けて、共通の値を共有するようにします。

以下のスクリプトを変更して、配列からすべての値を一意の番号で挿入するにはどうすればよいですか?

<?php
mysql_connect("localhost", "user", "pass")or die("cannot connect");    
mysql_select_db("db")or die("cannot select DB");
$sql="SELECT * FROM category";
$result=mysql_query($sql);
$count=mysql_num_rows($result);
?>
<table width="400" border="0" cellspacing="1" cellpadding="0">
<tr><td><form name="form1" method="post">
<table width="400" border="0" cellpadding="3" cellspacing="1" bgcolor="#CCCCCC">
<tr><td bgcolor="#FFFFFF">&nbsp;</td>
    <td colspan="4" bgcolor="#FFFFFF"><strong>Insert multiple rows in mysql</strong></td></tr>
<tr><td align="center" bgcolor="#FFFFFF">#</td>
    <td align="center" bgcolor="#FFFFFF"><strong>Category ID</strong></td>
    <td align="center" bgcolor="#FFFFFF"><strong>Category</strong></td></tr>
<?php
while($rows=mysql_fetch_array($result)){
?>
<tr><td align="center" bgcolor="#FFFFFF"><input type="checkbox" name=check[]  value="
<?php echo $rows['cat_id']; ?>"></td>
<td bgcolor="#FFFFFF"><?php echo $rows['cat_id']; ?></td>
<td bgcolor="#FFFFFF"><?php echo $rows['category']; ?></td></tr>

<?php
}
?>
<tr><td colspan="3" align="center" bgcolor="#FFFFFF"><input name="delete" type="submit" id="delete" value="Delete"></td></tr>
<?php
$check=$_POST['check'];
if($_REQUEST['delete']=='Delete'){
  {
    $sql="INSERT INTO category1 (cat_id,category) 
             SELECT cat_ID, category 
             FROM category 
             WHERE cat_id='$val'";

    foreach($check as $key=>$value)
    {
      $sql="INSERT INTO category1 (cat_id,category) 
              SELECT cat_ID, category 
              FROM category 
              WHERE cat_id='$value'";
      $final = mysql_query($sql);
      if($final) {
        echo "<meta http-equiv=\"refresh\" content=\"0;URL=php.php\">";
      }
    } 
  }
}
// Check if delete button active, start this   
// if successful redirect to php.php

mysql_close();
?>
</table></form></td></tr></table>
4

1 に答える 1

1

コードにはいくつかの問題があります。

A- SQL インジェクション ホールがあります: 使用しますmysql_real_escape_string()
B- XSS 脆弱性の可能性があります:htmlspecialcharsエコーするすべての $vars をエスケープするために使用します。
C-select *フィールドのみを使用する場合に使用するとcatIDcategory無駄がいっぱいになります。選択したフィールドには常に明示的に名前を付けてください。

参照:
「Bobby Tables」XKCD コミックの SQL インジェクションはどのように機能しますか?
PHP サイトで xss 攻撃を回避するためのベスト プラクティスは
何ですか? select * を使用しない理由は何ですか?

あなたの質問
に答えるには、次のようなコードを使用します

$check = $_POST['check'];
if (is_array($check)) {
  //simple test to see if an array is multi-dimensional.
  if (count($array) != count($array, COUNT_RECURSIVE)) 
  {
     //die("multidimensional array's are not allowed");
     //insert code to reask the array, or work around the issue.
     //you really should not use `die` in production code.
  } else {
  //escape what's inside the array, not the array itself.
  $check = array_walk($check, 'mysql_real_escape_string');
  $check = "'".implode("','",$check)."'"; //1,2,3 => '1','2','3'
} else { //not an array
  $check = "'".mysql_real_escape_string($check)."'";
}
//Inserts all $check's in one go.
$sql = "INSERT INTO category1 (cat_id,category) 
          SELECT cat_ID, category 
          FROM category 
          WHERE cat_id IN ($check) ";  //$check is already quoted.
于 2011-10-02T06:22:53.930 に答える