我正在尝试创建一个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>
答案 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注入风险:
更改此代码
编码恐怖
$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?