如何使用php将多个订单项输入mysql数据库

时间:2011-06-12 18:05:49

标签: php mysql

我正在尝试创建一个RMA表单。我们的想法是能够在一个页面上输入多行。我遇到的问题是,如果我有多行的表单,它只提交顶行数据。我环顾四周,读到我应该使用foreach()和implode()函数,但我似乎无法让它工作。

这是我目前使用单行工作的整个PHP代码。如果有人可以请帮助我获得多行,这将是伟大的。另外我对php / mysql没有多少经验,所以如果你能列出一个例子,而不是说“使用x,y,z函数”,因为到目前为止这对我没有帮助。

非常感谢所有的帮助。感谢

<html><head><title> TEST - RMA</title></head>
<body>
<h1>RMA Screen</h1>
<h2>Order Results</h2>
<?php
  $controller_serial = $_POST['controller'];
  $sample_holder_serial = $_POST['sampleholder'];
  $first_name = $_POST['firstname'];
  $last_name = $_POST['lastname'];
  $randomnumber = $_POST['RMAnum'];


  $link = mysql_connect('localhost', 'user', 'abcd'); 
  if (!$link) 
  {
    die('Could not connect: ' . mysql_error()); 
  }
  echo 'Connected successfully';

  mysql_select_db(rma);

  $randomnumber = mt_rand(1,100);
  while( $fetch = mysql_fetch_array( 
    mysql_query("SELECT `RMAnum` FROM `rma` 
                 WHERE `RMAnum` = $randomnumber") ) ) {
    $randomnumber = mt_rand(1,10);

  }

  mysql_query("INSERT INTO `rma` 
            (`controller_serial`, `sample_holder_serial`
            , `first_name`, `last_name`, `RMAnum`)
            VALUES('$controller_serial','$sample_holder_serial'
            , '$first_name', '$last_name', '$randomnumber')") 
    or die(mysql_error());
  mysql_close($link);


  echo 'Thanks for submitting the form.<br />';
  echo 'RMA NUMBER: ' . $randomnumber . '<br />';
  echo 'Controller Serial Number: ' . $controller_serial . '<br />';
  echo 'Sample Holder Serial Number: ' . $sample_holder_serial . '<br />';
  echo 'First Name: ' . $first_name . '<br />';
  echo 'Last Name: ' . $last_name . '<br />';
?>

</body></html>

5 个答案:

答案 0 :(得分:2)

您需要将表单视为数组。它可以很简单,只需在每个表单字段的末尾附加一个数字,然后在发布表单时获取该数字。

为了让它尽可能简单和老派,直到你理解了数组的概念,让我们使用数字后缀方法:

<input type="text" name="controller_serial_1" value="foobar" />

...

<input type="text" name="controller_serial_2" value="otherfoobar" />

..等等。

创建隐藏字段max_records

<input type="hidden" name="max_records" value="2" />

然后在你的PHP中:

for($i=1; $i<$_POST['max_records']; $i++)
{
    mysql_query("INSERT INTO `rma` (`controller_serial`, `sample_holder_serial`, `first_name`, `last_name`, `RMAnum`) VALUES($_POST['controller_serial_'].$i,$_POST['sample_holder_serial_'].$i, $_POST['first_name_'].$i, $_POST['last_name_'].$i, $_POST['randomnumber_'].$i)");
}

一旦掌握了这个概念,优化代码的下一步就是使每个字段数组成为一个foreach()。

答案 1 :(得分:1)

您的代码仅适用于一行,因为它只获取一行的信息。第一步是获取要插入的多行的信息:

$controller_serials = array("controller1", "controller2", "controller3"); // etc... an array of your controllers
$sample_holder_serials = array("sampleholder1", "sampleholder3", "sampleholder3"); // etc.. an array of sampleholders
$first_names; // array of firstnames in the same format
$last_name; // array of lastnames
$randomnumber; // array of randomnumbers

(或者你可以把它全部放到一个大的多维数组中。)

然后,写一个foreach:

foreach ($controller_serials as $key => $value){
    mysql_query("INSERT INTO `rma` (`controller_serial`, `sample_holder_serial`, `first_name`, `last_name`, `RMAnum`) VALUES('{$value}','{$sample_holder_serials[$key]}', '$first_names[$key]', '$last_names[$key]', '$randomnumbers[$key]')");

}

这应该在基本级别上工作,但它很容易受到sql注入。消除你的输入并且你很好。

编辑:另外,我不确定随机数字在哪里。如果您要使用1-100中的随机数来确定将值输入数据库的位置,您应该知道有时您将覆盖自己的条目。为什么不直接插入新行?

答案 2 :(得分:0)

您需要将表单元素作为数组提交,然后迭代它们,随时插入新行。

答案 3 :(得分:0)

问题在于echo语句,它们应该在while()循环中,因为如果你结束循环,你只会留下一个值。相反,你应该回显循环的每一步的值。

答案 4 :(得分:0)

您面临SQL注入风险:

更改此代码

enter image description here 编码恐怖

  $controller_serial = $_POST['controller'];
  $sample_holder_serial = $_POST['sampleholder'];
  $first_name = $_POST['firstname'];
  $last_name = $_POST['lastname'];
  $randomnumber = $_POST['RMAnum'];
  .....
  mysql_query("SELECT RMAnum FROM rma WHERE RMAnum = '$randomnumber' ")

进入这个安全的代码:

  $controller_serial = mysql_real_escape_string($_POST['controller']);
  $sample_holder_serial = mysql_real_escape_string($_POST['sampleholder']);
  $first_name = mysql_real_escape_string($_POST['firstname']);
  $last_name = mysql_real_escape_string($_POST['lastname']);
  $randomnumber = mysql_real_escape_string($_POST['RMAnum']);
  .....
  mysql_query("SELECT RMAnum FROM rma WHERE RMAnum = '$randomnumber' ")  
  // single quotes are vital, dont forget them       ^             ^

您需要在查询文本中的所有'周围放置单引号$vars,否则mysql_real_escape_string()将无效!

有关详细信息,请参阅此问题:How does the SQL injection from the "Bobby Tables" XKCD comic work?