首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP单mySQL表加上未定义数量的通过单个HTML表单的多个mySQL表条目

PHP单mySQL表加上未定义数量的通过单个HTML表单的多个mySQL表条目
EN

Stack Overflow用户
提问于 2012-08-26 08:33:42
回答 1查看 388关注 0票数 0

这是我在互联网上发布的第一个问题,我通常能找到某种解决方案,但现在我要么不得不用其他更基本的方法来解决这个问题,要么就像我希望在Stack Overflow上得到某人的帮助一样。我有一个想法,如何以另一种方式来做,但我真的希望我可以让它这样工作。

我正在尝试建立一个互联网应用程序,人们或组织可以通过它来通知避难所他们想要捐赠的衣服,以供避难所的流动小组领取。

我现在放了一个简化版本的HTML form、PHP script、JavaScript函数和mySQL,用来制作表格,我想在这些表格中存储来自HTML form的信息。

HTML表单:

代码语言:javascript
复制
<form action="apply.php" method="post">
<p>Please enter your personal info so we can make contact with you:<br />
Name: <input type="text" name="name" /><br />
Address: <input type="text" name="addr" /><br />
Phone: <input type="text" name="phon" /><br />
e-mail: <input type="text" name="emai" /><br /><br />
<!--previous part of the form needs to be entered only once in a table named
"application" in real form there are more fields-->     
<div id="dod">
<p><b>I wish to donate:</b> (in case you wish to donate more stuff click on
"Add more"):</p>
<p> <select name="kind">
<option value="Jacket">Jacket</option>
<option value="Shirt">Shirt</option>
<option value="Pants">Pants</option>
</select></p>
<!--there are more options in the actual form-->
<p>How many items of this type would you like to donate?
<input type="text" name="piec"></p>      
<p>Size of the items: <select name="size">
<option value="S">S</option>
<option value="M">M</option>
<option value="L">L</option>
<option value="Other">Other</option>
<option value="Various">Various</option>
</select></p><br />
<!--This part should be entered several times depending on how many types of clothes
and in which sizes people wish to donate. There are more options in actual form-->
</div>
<center>
<a href="#" onclick="JavaScript:addClothes()" style="font-family: 'verdana'">Add more
</a><br /><br />
<input type="submit" value="Submit"></input>
</center>
</form>

这是JavaScript的简化版本,它将表单域添加到

代码语言:javascript
复制
function addClothes() {
document.getElementById('dod').innerHTML+="<p><select name='kind'><option\n\
value='Jacket'>Jacket</option>\n\
<option value='Shirt'>Shirt</option>\n\
<option value='Pants'>Pants</option>\n\
</select>\n\
</p><p>How many items of this type would you like to donate? <input type='text'\n\
name='piec'></p>
<p>Size: <select name='size'><option value='S'>S</option>\n\
<option value='M'>M</option>\n\
<option value='L'>L</option>\n\
<option value='Other'>Other</option>\n\
<option value='Various'>Various</option></select></p><br />";
}

以下是用于在shelter_db数据库中创建表的mySQL表达式:

代码语言:javascript
复制
CREATE TABLE shelter_db.application
(
Name varchar(80) NOT NULL,
Address varchar(80) NOT NULL,
Phone varchar(20) NOT NULL,
Email varchar(50) NOT NULL,
Stamp timestamp NOT NULL,
PRIMARY KEY (Stamp)
);

CREATE TABLE shelter_db.clothes
(
Kind varchar(40) NOT NULL,
Pieces integer(6) NOT NULL,
Size varchar(20),
Stamp timestamp,
FOREIGN KEY (Stamp)
REFERENCES application (Stamp)
);

我的想法是将这两个表中的数据通过创建记录时的时间戳连接起来,因为肯定不会有来自不同方的同时条目。然后,被指派联系捐赠者的人可以看到特定各方希望捐赠什么,并可以相应地派遣一支配备汽车或皮卡的流动团队。

我正在苦苦思索的是如何构建php/sql页面,在浏览了几十个网页之后,我找不到一个适合我需求的解决方案。我假设我应该使用内爆函数,但在尝试了各种解决方案后,我无法找到正确的解决方案。代码如下:

代码语言:javascript
复制
<?php
$con = mysql_connect('localhost','root','');
if (!$con) {die('Unable to connect: ' . mysql_error());}
mysql_select_db('shelter_db', $con);
//the following part needs only one entry into application table of the db
$sql="INSERT INTO application (Name, Address, Phone, Email, Stamp)
VALUES
('$_POST[name]','$_POST[addr]','$_POST[phone]','$_POST[emai]',time());
//the following part needs multiple entries depending on how many times the Add more 
//button in the HTML form has been clicked
INSERT INTO clothes (Kind, Pieces, Size, Stamp)
VALUES
('$_POST[kind]','$_POST[piec]','$_POST[size]',time())";
if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); }
else {
echo 'Database entry successful.';
}
mysql_close($con)
?>

如果任何人能提供适合我的示例的代码,我将不胜感激。对于较长的帖子,很抱歉,但他们说要彻底。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-26 10:38:21

首先,通过时间戳进行关联绝对不是一个好主意。首先,有可能两个人同时使用你的网站,而他们提交的内容可能会被混淆。其次,插入到应用程序表和衣服表之间的时间可能会发生变化(日期时间精确到秒,可能第一次插入的时间是T.999,第二次插入的时间是T+1.000;第二个问题可以通过为脚本开头的时间分配一个变量并在所有插入中使用该变量来解决。但是由于第一个问题,您仍然不应该为此使用时间戳。

相反,您应该为应用程序分配一个唯一的ID。在mysql中,这很容易做到,因为它有一个ID列和auto-increment选项。当您向表中添加一行时,您省略了这一列(或将其值设为NULL),服务器将自动分配一个比上一次分配的值大1的值。函数mysql_insert_id()将返回您在最后一次插入中分配的值。在clothes表中,添加一个包含该ID的application_id列,用于关联这两个表。

您必须处理的下一件事是如何处理表单中的多个服装栏。在添加的每一行中,表单元素的名称与前一行中的名称相同。当PHP处理表单时,$_POST['kind']只能获取其中的一个。处理这种情况的方法是给它们命名,以[]结尾,例如<select name="kind[]">。这告诉PHP应该创建一个包含这些输入的数组。然后,您可以获得第一行的类型为$_GET['kind'][0],第二行为$_GET['kind'][1],依此类推。所以当你写数据库的时候,你可以这样做:

代码语言:javascript
复制
foreach ($_GET['kind'] as $i => $kind) {
  $sql = "INSERT INTO clothes (Application_ID, Kind, Pieces, Size) VALUES ($id, ".$kind.", "$_GET['piec'][$i]", '"$_GET['size'][$i]"')";
  mysql_query($sql, $con) or die ('Error: ' . mysql_error());
}

$id包含您从mysql_insert_id()获得的值。

最后,如果我没有指出mysql_XXX函数已被弃用,并且不应该在任何新代码中使用,那么我就没有尽到作为SO回答者的责任。它们已经被mysqli_XXX和PDO所取代。它们允许您创建“准备好的”语句,因此您不必像上面那样将变量替换到字符串中,这可能会导致SQL注入攻击,除非您仔细清理数据(为了方便起见,我在上面没有这样做)。

顺便说一句,我还没看你的JavaScript呢。它看起来并没有太多的意义。如果别人注意到了其中的问题,请大声说出来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12126787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档