Php PDO使用外键插入到表中
我在使用mysql和PDO时遇到了一些困难 我希望将产品插入数据库,但是产品表包含外键。当然,插入时我不知道外键ID。我这样做对吗???有没有更好的办法解决这个问题 餐桌用品Php PDO使用外键插入到表中,php,mysql,pdo,insert-update,Php,Mysql,Pdo,Insert Update,我在使用mysql和PDO时遇到了一些困难 我希望将产品插入数据库,但是产品表包含外键。当然,插入时我不知道外键ID。我这样做对吗???有没有更好的办法解决这个问题 餐桌用品 Id PK AI int 名称Varchar(20) 类别ID Int FK 类型ID Int FK 表类别 Id Int PK Cat varchar(20) 表类型 Id Int PK varchar型(20) 正如在下面的评论中提到的:通常,我会从选择框中获取ID。我无法执行此操作,因为它将是执行查询的
- Id PK AI int
- 名称Varchar(20)
- 类别ID Int FK
- 类型ID Int FK
- Id Int PK
- Cat varchar(20)
- Id Int PK
- varchar型(20)
正如在下面的评论中提到的:通常,我会从选择框中获取ID。我无法执行此操作,因为它将是执行查询的脚本,而不是用户。您确定这是您想要的吗
$sql = 'INSERT INTO Products
SET Name = :name
WHERE
CategoryId IN (SELECT Id FROM Categories WHERE Cat = :category) AND
TypeId IN (SELECT Id FROM Types WHERE Type = :type)'
我认为您正在尝试使用UPDATE
$sql = 'UPDATE Products
SET Name = :name
WHERE
CategoryId IN (SELECT Id FROM Categories WHERE Cat = :category) AND
TypeId IN (SELECT Id FROM Types WHERE Type = :type)'
MySQL允许在单个查询中组合以下内容:
INSERT INTO tbl_temp2 (fld_id)
SELECT tbl_temp1.fld_order_id
FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
。。。但我不在乎。如果在一个查询中执行三种不同的操作,则无法执行正确的错误检查
我的建议是,首先验证是否存在与给定名称匹配的类别和类型。在该步骤中,您可以很容易地获得相应的ID,这将允许您执行简单的插入。此外,如果需要插入多个产品,可以先验证一次。除了@lvaro G.Vicario的答案外,还可以执行以下操作(在普通sql中工作,我没有使用绑定变量尝试过):
但我总是先检查现有的类别和类型,必要时插入并获取所需的id,因为如果内部选择中没有匹配项,这将导致意外结果。首先,您需要确定哪个表包含外键数据 然后需要从外键表中获取所有可能的值 最后,您需要构建一个下拉列表或类似的列表,以便能够选择可接受的外键
$q=$db->prepare('SELECT ke.referenced_table_name assoc_table,
ke.referenced_column_name assoc_col FROM
information_schema.KEY_COLUMN_USAGE ke WHERE ke.referenced_table_name IS NOT NULL
AND ke.table_schema=:database AND ke.table_name=:tablename AND ke.column_name=:col');
$q->bindValue(':database','mydatabasename'); //Set your database name here
$q->bindValue(':tablename','Departments'); //Set your table name here
$q->bindValue(':col','City'); //Set the column which foreign key values you want to have here
if($q->execute()) {
$foreingtable=$q->fetch(PDO::FETCH_ASSOC);
$q=$db->prepare('SELECT '.$foreingtable['assoc_col'].' FROM '.$foreingtable['assoc_table']);
if($q->execute())
echo json_encode($q->fetchAll(PDO::FETCH_COLUMN));
}
else {
header('http/1.1 500 Internal Server Error');
print_r($q->errorInfo());
exit;
}
更多信息:我想在表中插入新行。我希望查询能够检测外键的正确id。e、 g.假设类型手套id为1,类别服装id为5。。。然后我想在products表中插入(名称:Childrens pink glove,typeid:1,categoryid:5)Mysql不支持insert语句中的
WHERE
,请检查此链接:您通常会从下拉列表或其他寻求有效选项并返回ID的小部件中选择类别和类型。您是否依赖裸骨输入框?我知道这一点,因为我可以从选择框中获取ID。。。我正在尝试使事情自动化。。。这将是一个脚本,而不是插入产品的用户。老实说,我不知道脚本如何阻止您处理ID,但我已经提供了一个答案。这正是我想要的。但我首先了解了yo umean关于检查现有类别和类型的内容。了解检查现有类别和类型的内容。。。非常感谢。
$sql = 'INSERT INTO Products
SET Name = :name,
CategoryId = (SELECT Id FROM Categories WHERE Cat = :category),
TypeId = (SELECT Id FROM Types WHERE Type = :type)';
$q=$db->prepare('SELECT ke.referenced_table_name assoc_table,
ke.referenced_column_name assoc_col FROM
information_schema.KEY_COLUMN_USAGE ke WHERE ke.referenced_table_name IS NOT NULL
AND ke.table_schema=:database AND ke.table_name=:tablename AND ke.column_name=:col');
$q->bindValue(':database','mydatabasename'); //Set your database name here
$q->bindValue(':tablename','Departments'); //Set your table name here
$q->bindValue(':col','City'); //Set the column which foreign key values you want to have here
if($q->execute()) {
$foreingtable=$q->fetch(PDO::FETCH_ASSOC);
$q=$db->prepare('SELECT '.$foreingtable['assoc_col'].' FROM '.$foreingtable['assoc_table']);
if($q->execute())
echo json_encode($q->fetchAll(PDO::FETCH_COLUMN));
}
else {
header('http/1.1 500 Internal Server Error');
print_r($q->errorInfo());
exit;
}