1

我在使用 mysql 和 PDO 时遇到了一些困难。

我希望将产品插入数据库,但是产品表包含外键。自然,插入时我不会知道外键ID。我这样做对吗???有没有更好的方法来解决这个问题?

餐桌产品

  • Id PK AI int
  • 名称 Varchar(20)
  • CategoryId Int FK
  • TypeId Int FK

表类别

  • Id Int PK
  • 猫 varchar(20)

表类型

  • Id Int PK
  • 输入 varchar(20)

    $type = 'Gloves';
    $category = 'Clothing';
    $sql = 'INSERT INTO Products
        SET Name = :name, CategoryId = :catId, TypeId = :typeId
        WHERE 
            CategoryId IN (SELECT Id FROM Categories WHERE Cat = :category) AND
            TypeId IN (SELECT Id FROM Types WHERE Type = :type)'
    
    $stmt = $db->prepare($sql); 
    $stmt->execute(array(':name' => 'Pink childrens gloves', ':category' => $category, ':type' => $type));
    

正如下面的评论中提到的:通常,我会从选择框中获取 ID。我不能这样做,因为它将是执行查询的脚本,而不是用户。

4

4 回答 4

1

MySQL 允许在单个查询中组合SELECT + INSERT :

INSERT INTO tbl_temp2 (fld_id)
  SELECT tbl_temp1.fld_order_id
  FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

......但我不会在意它。如果您在单个查询中执行三项不同的操作,则无法进行正确的错误检查。

我的建议是您首先验证是否存在与给定名称匹配的类别和类型。在该步骤中,您可以轻松获取相应的 ID,这将让您执行简单的 INSERT。此外,如果您需要插入许多产品,您可以先验证一次。

于 2012-12-18T16:44:04.853 回答
1

你确定这是你想要的吗?

$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)'
于 2012-12-18T16:29:02.033 回答
0

首先,您需要弄清楚哪个是具有外键数据的表。

然后你需要从外键表中获取所有可能的值。

最后,您需要构建和下拉列表或类似列表以提供选择可接受的外键的能力。

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

有关此的更多信息:使用 PDO 获取 MySql 中可能的外键值列表

于 2013-08-09T09:22:30.547 回答
0

除了@Álvaro G. Vicario's answer之外,您还可以执行以下操作(在普通 sql 中工作,我没有尝试使用绑定变量):

$sql = 'INSERT INTO Products
        SET Name = :name,
            CategoryId = (SELECT Id FROM Categories WHERE Cat = :category),
            TypeId = (SELECT Id FROM Types WHERE Type = :type)';

但我总是会先检查现有的类别和类型,在必要时插入并获取所需的 id,因为如果内部选择中没有匹配项,这将导致意外结果。

于 2012-12-18T16:52:03.707 回答