Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO使用外键插入到表中_Php_Mysql_Pdo_Insert Update - Fatal编程技术网

Php PDO使用外键插入到表中

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。我无法执行此操作,因为它将是执行查询的

我在使用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。我无法执行此操作,因为它将是执行查询的脚本,而不是用户。

您确定这是您想要的吗

$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;
 }