2016-10-30 6 views
0

INSERT INTOとSELECTクエリを1つのステートメントで実行することはできません。PHP PDOがSELECTを使用してINSERT INTOを実行できない

は、このPHPコードに問題がいる:

$db = connect_db_marketlist(); 
if($db != null) { 
    $sql = "INSERT INTO items (user_id, market_table_id, price, info)" 
     ." VALUES ('$id', (SELECT table_id FROM markets WHERE city='$city' AND market='$market'), $price, '$info')"; 
    echo $sql; // !!! DEBUG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    try { 
     $db->query($sql); 
     echo "OKAY: ".$db->lastInsertId(); 
    } catch (Exception $e) { 
     echo "ERROR: ".$e->getMessage(); 
    } 
} 

をそして、私はエラーを得た:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'market_table_id' cannot be null

エラーは、SELECTクエリがnullを返すと言うが、私はphpMyAdminを直接$ SQLステートメントを実行すると、それが働いています。
これはエコー$ sqlを出力:私が間違って何

INSERT INTO items (user_id, market_table_id, price, info) VALUES ('12345678', (SELECT table_id FROM markets WHERE city='ANKARA' AND market='MİGROS'), 22.33, 'TEST_INFO_MİGROS')

?多分私のdb接続です:

function connect_db_marketlist() { 
    $servername = "localhost"; 
    $username = "marketuserdb"; 
    $password = "pass1234"; 
    $conn = null; 
    try { 
     $conn = new PDO("mysql:host=$servername;dbname=marketlist", $username, $password); 
     // set the PDO error mode to exception 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } 
    catch(PDOException $e) 
     { 
     echo "Connection failed: " . $e->getMessage(); 
     } 
    return $conn; 
} 

PDOで「INSERT INTO ... SELECT ...」クエリを実行することは可能ですか?はいの場合は、理由がない場合は?

P.S:(SELECT ....)クエリの代わりに整数を入力すると機能します。 DB接続に問題はありません。

+0

あなたもecho $ sqlの出力を共有してください。それはあなたの状況を理解するのに役立ちます。 – tanaydin

+0

はい、pdoでinsert ... select ...を実行できます。他のSQL文と同じ方法で実行します。 – Shadow

+0

PDOには何も関係ありません。 –

答えて

1

する必要がありますあなたは

"mysql:host=$servername;dbname=marketlist;charset=utf8mb4" 

ようDSNに適切なものへの接続の文字セットを設定する必要があります(これは、UTF-8用ですあなたのテーブルのエンコーディングのために設定する必要があります)

+1

Thx。あなたは私の時間を節約する:) – Kuvalya

0

varが選択

の内側にこの方法

"INSERT INTO items (user_id, market_table_id, price, info)" 
." SELECT '$id', table_id , $price, '$info' 
     FROM markets WHERE city= '$city' AND market='$market' ;"; 
+0

価格、情報、ユーザーではなく、(SELECT ...)ステートメントでmarket_table_idだけを取得したいです。 – Kuvalya

+0

なぜか...これを使用すると、挿入列に直接挿入されます... var $ id、$ price、$ infoの内容を選択して選択します。この値はテーブルから選択されません。しかし、SQL文の内側に(注入された).. – scaisEdge

関連する問題