2016-10-30 10 views
0

Я не могу запускать запросы INSERT INTO и SELECT в одном выражении.PHP PDO не может запускать запрос INSERT INTO с SELECT

есть проблемы с этим 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, запрос возвращает пустой, но когда я запускаю $ SQL заявление непосредственно в PHPMyAdmin, она работает ,
Это эхо $ 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')

Что случилось со мной? Может быть, это моя дб подключение:

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

Можно ли запустить "INSERT INTO ... SELECT ..." запрос с PDO? Если да, то как, если нет, почему?

P.S: Он работает, когда я ввожу любое целое число вместо запроса (SELECT ....). Поэтому проблем с соединением DB нет.

+0

Не могли бы вы поделиться и выходом эха $ sql? Это может помочь нам понять вашу ситуацию. – tanaydin

+0

Да, вы можете запустить insert ... select ... in pdo. Вы запускаете его так же, как и любой другой оператор sql. – Shadow

+0

PDO здесь не имеет никакого отношения. –

ответ

1

Вы должны установить соединения кодировку для правильной одного уведомления о доставке, как

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

(Это для UTF-8, вы должны установить его для кодировки ваших таблиц)

+1

Thx. Вы спасете мои часы :) – Kuvalya

0

вар должен быть внутри выберите

Таким образом

"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

Я хочу получить только market_table_id с (SELECT ...), а не ценой, информацией, пользователем. – Kuvalya

+0

Почему бы и нет ... Если вы используете этот выбор, вы заполняете столбец вставки напрямую ... в элементе select вы выбираете содержимое переменных var $ id, $ price, $ info .. это значение не выбрано из таблицы. , но передал .. (ввел) внутри оператора sql .. – scaisEdge

Смежные вопросы