MYSQLI Prepared Statement Вставка и поиск значения Из другой таблицы - PullRequest
2 голосов
/ 13 июня 2019

У меня есть подготовленный оператор, который в основном вставляет данные из массива в таблицу. но один из столбцов мне нужно получить из другой таблицы в базе данных. До сих пор я придумал это.

$query = "INSERT INTO stockimp si (sku,stock,status,productID) 
          VALUES (?,?,?,(SELECT post_id FROM postmeta pm  
          WHERE si.sku = pm.meta_value AND pm.meta_key = '_sku')) ";

$stmt = $mysqli->prepare($query);
$stmt ->bind_param("sss", $dbSKU, $dbStock, $dbStatus);
$mysqli->query("START TRANSACTION");

Это будет работать нормально, если я уберу оператор select, чтобы получить идентификатор записи, и просто установлю его в статическое значение. Но сейчас я неуверен в лучшем подходе, чтобы принять здесь. Я знаю, как это сделать, если это просто прямая копия таблицы, но, просто взяв одно значение из столбца, я не уверен.

1 Ответ

0 голосов
/ 13 июня 2019

Я действительно не уверен в том, что вы делаете с этим оператором SELECT, особенно там, где у вас есть si.sku = pm.meta_value, так как вы вставляете в таблицу si.

Вв любом случае вы можете попробовать использовать INSERT...SELECT вместо некоторых параметризованных значений в SELECT.

Например,

$sql = <<<_SQL
INSERT INTO stockimp (sku, stock, status, productID)
SELECT ?, ?, ?, pm.post_id
FROM postmeta pm
WHERE pm.meta_key = '_sku' AND pm.meta_value = ?
_SQL;

$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ssss', $dbSKU, $dbStock, $dbStatus, $dbSKU);
foreach ($arrayValues as list($dbSKU, $dbStock, $dbStatus)) {
    $stmt->execute();
}

Обратите внимание на повторение $dbSKU в списке параметров.


Лично я бы просто использовал пару утверждений.Предполагая, что ваши $db* значения получены из массива значений ...

// Prepare first, then loop for best performance
$postStmt = $mysqli->prepare(
        "SELECT post_id FROM postmeta WHERE meta_key = '_sku' AND meta_value = ?");
$postStmt->bind_param('s', $dbSKU);

$inStmt = $mysqli->prepare(
        'INSERT INTO stockimp (sku, stock, status, productID) VALUES (?, ?, ?, ?)');
$inStmt->bind_param('sssi', $dbSKU, $dbStock, $dbStatus, $postId);

foreach($arrayOfValues as list($dbSKU, $dbStock, $dbStatus)) {
    $postStmt->execute();
    $postStmt->bind_result($postId);
    while($postStmt->fetch()) {
        $inStmt->execute();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...