gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:18:49 26 4
gpt4 key购买 nike

这是我在互联网上发布的第一个问题,我通常能够找到某种解决方案,但现在我要么必须采用其他更基本的方法,要么,因为我希望得到某人的帮助在堆栈溢出上。我有一个想法如何以另一种方式做到这一点,但我真的很希望我能让它像这样工作。

我正在尝试构建一个互联网应用程序,通过该应用程序,人们或组织可以向避难所告知他们想要捐赠并由避难所移动团队领取的衣服。

我现在正在放置 HTML 表单的简化版本、PHP 脚本、JavaScript 函数和 mySQL,用于制作要在其中存储 HTML 表单信息的表。

HTML 表单:

<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 的简化版本,它将表单字段添加到

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 />";
}

这些是用于在 housing_db 数据库中创建表的 mySQL 表达式:

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 页面,在浏览了数十个网页后,我找不到一个适合我需要的解决方案。我假设我应该使用内爆函数,但在尝试了各种解决方案后,我无法找到正确的解决方案。这是代码:

<?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)
?>

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

最佳答案

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

相反,您应该为应用程序分配一个唯一的 ID。在 mysql 中,通过使用带有 auto-increment 的 ID 列,可以轻松完成此操作。选项。当您向表中添加一行时,您可以忽略此列(或将其值设置为 NULL),服务器将自动分配一个比最后分配的值高 1 的值。函数mysql_insert_id()将返回您上次插入时分配的值。在衣服表中,您添加 application_id列,其中包含该 ID。您可以使用它来关联两个表。

接下来要处理的是如何处理表单中的多个衣服列。在您添加的每一行中,您为表单元素指定了与前一行相同的名称。当 PHP 处理表单时,$_POST['kind']只能得到其中之一。处理这个问题的方法是给它们命名以 [] 结尾。 ,例如<select name="kind[]"> 。这告诉 PHP 它应该创建这些输入的数组。然后您可以获得第一行的类型 $_GET['kind'][0] ,第二行是$_GET['kind'][1] , 等等。因此,当您写入数据库时​​,您可以执行以下操作:

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 注入(inject)攻击,除非您小心地清理数据(上面我没有这样做是为了方便) )。

顺便说一句,我还没看过你的 JavaScript。看起来并没有什么大不了的。如果其他人发现其中有问题,请指出。

关于PHP 单个 mySQL 表加上通过单个 HTML 表单未定义数量的多个 mySQL 表条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12126787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com