Объединение двух переменных PHP для запроса MySQL

0

У меня есть переменная formvar, которая увеличивается каждый раз, когда пользователь добавляет дополнительное поле в HTML-форму. Эта переменная отправляется на PHP script с целью прокрутки всех добавленных полей.

Я пытаюсь объединить две переменные в запросе MySQL, чтобы соответствовать тому, что находится в моей HTML-форме. Я хотел бы, чтобы запрос MySQL переходил вверх upc0, upc1 и т.д. До тех пор, пока цикл for не завершится.

for($i=0;$i<=$_POST[formvar];$i++)
{
mysql_select_db("bits", $con);
$sql="INSERT INTO report (UPC, Quantity, Comment)
VALUES ('$_POST[upc].$i','$_POST[quantity].$i','$_POST[comment].$i')";
if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
else echo "Records added successfully";
}

Извините, если этот код плохой, я новичок в веб-программировании.

Спасибо!

Теги:

4 ответа

2
Лучший ответ

Хорошо, так как каждый ответ намекал на экранирование (но не привел пример):

$sql = "INSERT INTO report (UPC, Quantity, Comment) VALUES
       ('" . mysql_real_escape_string($_POST["upc".$i]) .  "','" . 
       mysql_real_escape_string($_POST["quantity" . $i]) .  "','" . 
       mysql_real_escape_string($_POST["comment" . $i]) .  "')";

Это должно защитить вас от SQL Injection и является одним из подходящих методов создания sql-запросов. Лучшим методом было бы использовать параметризованные запросы (там тонна информации там, поэтому я предлагаю, чтобы хороший поиск Google был лучше, чем я пытался объяснить это здесь)...

  • 0
    Очень, очень хороший подход ... давайте напишем 1к раз наш код :)
  • 2
    @AlberT: Дело не в LOC (наименьшее возможное количество кода не является целью). Речь идет о написании ремонтопригодной и безопасной системы. Используя эти стилистические запросы, любой может быстро прочитать и увидеть, что происходит. Беглый взгляд скажет любому, кто читает, что все правильно сбежало. И меньше LOC не всегда лучше. Всегда есть компромисс между удобочитаемостью и ремонтопригодностью и эффективностью при написании. Поэтому я с радостью принимаю некоторое увеличение LOC, если это необходимо для улучшения читабельности и удобства обслуживания ...
Показать ещё 2 комментария
1

Прежде всего. В своем HTML создайте поля ввода, такие как:

<input type="foo" name="upc[]">
<input type="foo" name="quantity[]">
<input type="foo" name="comment[]">

Затем в вашем PHP- Script вы выполните следующее:

<?php
# Choose DB
mysql_select_db("bits", $con);

# Iterates the Form-Data
$data_arr = array();
foreach($_POST['upc'] as $k=>$v) {
  # Makes sure all needed data is available
  if(isset($_POST['quantity'][$k], $_POST['comment'][$k])) {
    $data_arr[] = array(
      'upc' => $v,
      'quantity' => $_POST['quantity'][$k],
      'comment' => $_POST['comment'][$k]
    );
  }
}

# Build mysql insert string
foreach($data_arr as $k=>$v) {
  # Escapes each field
  $v = array_map('mysql_real_escape_string', $v);
  # Maps array to value set
  $data_arr[$k] = '('. implode(',', $v). ')';
}

$sql = 'INSERT INTO report (UPC, Quantity, Comment) VALUES '. implode(', ', $data_arr);

# Perform mysql query
mysql_query($sql, $con) or die('Error: ' . mysql_error());

echo 'Records added successfully';

Написал это на моем iPad, я на самолете... так что не нужно. Удачи.; О)

0

Поскольку рецепты так приветствуются, я собираюсь дать свои собственные, касающиеся фактического вопроса:

<?php 
for ($i=0; $i<=$_POST['formvar']; ++$i) {
  mysql_select_db("bits", $con);
  $v = array_map(mysql_real_escape_string(array(_POST["upc{$i}"], $_POST["quantity{$i}"], $_POST["comment{$i}"])));
  $sql = "INSERT INTO report (UPC, Quantity, Comment) VALUES('"
       . implode("', '", $v)
       . "')";

  if (!mysql_query($sql,$con)) {
    trigger_error(html_entities('Error: ' . mysql_error()));
  }
}
?>
0

Не уверен, что я хорошо понимаю вопрос, но это то, что я думаю:

$sql="INSERT INTO report (UPC, Quantity, Comment) VALUES
           ('" . $_POST["upc".$i] .  "','" . $_POST["quantity" . $i] .  "','" . $_POST["comment" . $i] .  "')";

Примечание: это короткая версия, вы должны добавить mysql_real_escape_string и т.д. и т.д.

Также я предположил, что каждая переменная может быть строкой, поэтому я окружил их символом ".".

$_ POST [ "name". $i] позволяет вам циклически переносить переменные POST, начиная с имени "имя", за которым следует число, это должно быть вставлено в цикл for.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню