2012-12-18 3 views
1

mysql과 PDO에 몇 가지 어려움이 있습니다.외래 키가있는 테이블에 PDO 삽입

제품 테이블에 외래 키가 포함되어 있지만 제품을 데이터베이스에 삽입하려고합니다. 물론 삽입 할 때 외래 키 ID를 알지 못합니다. 내가이 일을 제대로하고 있니? 이 문제를 해결할 더 좋은 방법이 있습니까?

TABLE 제품

  • 아이디 PK AI INT
  • 이름 VARCHAR (20)
  • 카테고리 ID Int 인 FK
  • 유형 ID Int 인 FK

표 카테고리

  • 아이디 Int 인 PK는
  • 고양이 VARCHAR (20)

표 유형

  • 아이디 지능 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)); 
    

언급 한 바와 같이 아래의 코멘트에서 : 일반적으로, 나는 D 선택 상자에서. 사용자가 아니라 쿼리를 실행하는 스크립트이기 때문에이 작업을 수행 할 수 없습니다.

+1

당신 것 목록 또는 유효한 옵션을 추구하고 ID를 반환 다른 위젯 드롭 다운에서 일반적으로 선택 범주와 종류. 베어 본 입력 상자에 의존하십니까? –

+0

선택 상자에서 ID를 얻을 수 있기 때문에이 사실을 알고 있습니다 ... 자동화 작업을 시도하고 있습니다 ... 스크립트가 아닌 제품을 삽입 할 사용자가 될 것입니다. – Gravy

+0

솔직히 스크립트가 ID 처리를 방해하는 것을 볼 수는 없지만 어쨌든 대답을 제공했습니다. –

답변

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)' 
MySQL은 단일 쿼리에 SELECT + INSERT의 조합을 할 수 있습니다
+0

테이블에 새 행을 삽입하려고합니다. 쿼리가 외부 키에 대한 올바른 ID를 감지하기를 바랍니다. 예 : 타입 장갑이 id가 1이고 카테고리 의류가 id가 5 인 경우 ... 제품 테이블에 삽입하고 싶습니다. (이름 : childrens pink glove, typeid : 1, categoryid : 5) – Gravy

+1

MySQL은'WHERE '삽입 문에 다음 링크를 확인하십시오. http://stackoverflow.com/questions/485039/mysql-insert-where-query – jcho360

1

:

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

...하지만 걱정하지 않을 그것. 단일 쿼리에서 세 가지 다른 작업을 수행하는 경우 적절한 오류 검사를 수행 할 수 없습니다.

제 조언은 먼저 주어진 이름과 일치하는 카테고리와 유형이 있는지 확인하는 것입니다. 이 단계에서 해당 ID를 쉽게 얻을 수 있으므로 간단한 INSERT를 수행 할 수 있습니다. 또한 많은 제품을 삽입해야하는 경우 먼저 유효성 검사를 수행 할 수 있습니다.

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

그러나 나는 항상 존재를 확인합니다 : G. 카리오의 대답 알바 @ 외에도

+0

기존 범주 및 유형을 확인하는 것에 대해 이해했습니다 ... 감사합니다. – Gravy

0

, 당신은 또한 같은 것을 할 수있다 (일반 SQL에서 작품을 내가 바인딩 변수를 시도하지 않은) 카테고리 및 유형을 먼저 삽입하고 필요한 항목을 삽입하고 필요한 항목을 가져옵니다. 내부 선택 항목에 일치 항목이 없으면 예기치 않은 결과가 발생합니다.

+1

이것은 정확히 내가 원했던 것입니다. 그러나 나는 기존 카테고리 및 유형을 먼저 확인하는 것에 대해 무엇을 해야할지 봅니다. – Gravy

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

더 : Get list of possible foreign key values in MySql using PDO

관련 문제