MYSQLI准备的语句插入和查找值来自其他表

时间:2019-06-12 23:54:40

标签: php mysql mysqli

我有一个准备好的语句,该语句基本上将数组中的数据插入表中。但是我需要从数据库中的另一张表中获得一列。到目前为止,我想到了这个。

$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语句以获取帖子ID并将其设置为静态值,它将很好地工作。但是我现在不确定采取哪种最佳方法。如果它只是表的直接副本,但我只是从列中获取一个值,我不太确定,我知道该怎么做。

1 个答案:

答案 0 :(得分:0)

我真的不确定您正在使用该SELECT语句做什么,尤其是由于要插入si.sku = pm.meta_value表中而获得si的地方。 / p>

无论如何,您都可以尝试使用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();
    }
}