我有一个提交到MYSQL数据库的表单。
在我的数据库中,我有2个表,Subscribers
和Category_id
。表格结构如下:
订户
subscriber_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(30),
email VARCHAR(30),
phone INT,PRIMARY KEY (id))
CATEGORY_ID
category_id INT,
subscriber_id INT
我想在Subscribers中插入一个新行。我是用下面的声明完成的。
$sql="INSERT INTO subscribers (name, email, phone)
VALUES
('$_POST[name]','$_POST[email]','$_POST[phone]')";
与此同时,我还想在Category_id中插入一个新行,其中Subscribers.subscriber_id = Category_id.subscriber_id
//对于“相同”记录
如何为此编写声明?
答案 0 :(得分:0)
您的数据库设计不正确您需要做的就是拥有两个表Subscriber
和Category
,如下所示:
订阅者=>表强>
SubscriberID PK Auto Increment
Name
Email
Phone
CategoryID FK references Category(CategoryID)
<强>类别=&GT;表强>
CategoryID PK Auto Increment
CategoryName
此处您可以填充多个类别,并且在每个类别中您可以拥有多个订阅者。因此,当您想要插入新订阅者时,您必须确定要插入订阅者的类别,然后填写subscriber
表,保持category
表不变。通过这样做,您可以始终使用订户表上的where
子句获取每个类别的订户。从数据库设计角度来看,这是正确的方法。
使用此设计的P.S您不必为每个订户插入两条记录。
答案 1 :(得分:0)
我不确定你在使用Category_id表做什么。它看起来像Subscribers表和未提及的表之间的多对多表,可能名为Categories。这是对的吗?
无论如何,根据我的想法,这是一个解决方案:
# set up your connection (often set up globally, just like the old style):
$dbh = new PDO('mysql:host=localhost;dbname=my_db_name', $user, $pass);
$dbh->beginTransaction();
$query = "INSERT INTO subscribers (name, email, phone)
VALUES (:NAME, :EMAIL, :PHONE);";
$dbh->prepare($query);
$dbh->bindValue('NAME', $_POST['name']);
$dbh->bindvalue('EMAIL', $_POST['email']);
$dbh->bindValue('PHONE', $_POST['phone']);
$dbh->execute();
$subscriber_id = $dbh->lastInsertId();
$query = "INSERT INTO category_id (subscriber_id, category_id)
VALUES (:SUBSCRIBER_ID, :CATEGORY_ID)
$dbh->prepare($query);
$dbh->bindValue('SUBSCRIBER_ID', $subscriber_id);
$dbh->bindValue('CATEGORY_ID', $value_from_elsewhere); // Determined earlier.
$dbh->execute();
$dbh->commit();
我将您的查询转换为PDO样式的查询。将POST中的变量直接放入SQL查询字符串可能会让您对SQL注入攻击持开放态度。
查看此页面,或者有关如何在PHP中使用PDO样式查询的任何内容: http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/