вставить несколько строк из массива в таблицу с уникальным идентификатором - PullRequest
0 голосов
/ 02 октября 2011

Я скопировал и изменил скрипт из интернета.Сценарий первоначально удалил выбранные записи из запроса таблицы MySQL.Я изменил сценарий для вставки выбранных записей в другую таблицу с оператором вставки в.

Я хотел бы знать, как можно вставить все выбранные записи из массива mysql в другую таблицу с таким же идентификатором.

Логика аналогична логике таблицы '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>

1 Ответ

1 голос
/ 02 октября 2011

Ваш код имеет несколько проблем:

A- У вас есть отверстия для SQL-инъекций: Используйте mysql_real_escape_string()
B- У вас есть возможные уязвимости XSS: используйте htmlspecialchars, чтобы экранировать все $ vars, которые вы выводите.
C- Использование select *, когда вы собираетесь использовать только поля catID, category напрасно. Всегда назовите поля, которые вы выбрали явно.

См:
Как работает SQL-инъекция из комикса XKCD "Таблицы Бобби"?
Каковы оптимальные методы предотвращения атак xss на сайте PHP
В чем причина не использовать 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.
...