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

これがあなたが望むものであると確信していますか?

$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 に答える
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;

...しかし、私はそれを気にしません。1つのクエリで3つの異なることを行うと、適切なエラーチェックを行うことができません。

私のアドバイスは、最初に、指定された名前に一致するカテゴリとタイプがあることを検証することです。そのステップでは、対応するIDを簡単に取得できます。これにより、単純なINSERTを実行できます。さらに、多くの製品を挿入する必要がある場合は、最初に一度だけ検証できます。

于 2012-12-18T16:44:04.853 に答える
0

@ÁlvaroG。Vicarioの回答に加えて、次のようなこともできます(通常の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 に答える
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 に答える