我有一个准备好的语句,该语句基本上将数组中的数据插入表中。但是我需要从数据库中的另一张表中获得一列。到目前为止,我想到了这个。
$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并将其设置为静态值,它将很好地工作。但是我现在不确定采取哪种最佳方法。如果它只是表的直接副本,但我只是从列中获取一个值,我不太确定,我知道该怎么做。
答案 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();
}
}