我有以下完美運行的 PHP 代碼($qry_str 實際上是在 PHP 中生成的):
$qry_str = <<<'QRY'
FIND_IN_SET('6-47', attributes)
AND FIND_IN_SET('4-176', attributes)
AND FIND_IN_SET('9-218', attributes)
QRY;
$pdo->query('DROP TEMPORARY TABLE IF EXISTS `temp_attr`');
$temp_sql = <<<"TEMP"
CREATE TEMPORARY TABLE IF NOT EXISTS `temp_attr` (
SELECT product_id, GROUP_CONCAT(CONCAT(group_id, '-', IF (custom_value != '', custom_value, value_id)) SEPARATOR ',') AS attributes
FROM `products_attributes`
GROUP BY `product_id`
HAVING $qry_str
);
TEMP;
$pdo->query($temp_sql);
$sql = "SELECT
m.recommended_price AS msrp,
m.purchase_price AS cost,
pp.USD AS regular_price,
pc.USD AS special_price,
pc.start_date AS start_date,
pc.end_date AS end_date,
pl.permalink AS permalink,
pi.name AS description,
m.sku AS sku,
m.default_category_id AS cat,
m.id AS prod_id
FROM `products` AS m
LEFT JOIN `products_prices` AS pp ON m.id = pp.product_id
LEFT JOIN `products_campaigns` AS pc ON m.id = pc.product_id
LEFT JOIN `permalinks` AS pl ON (m.id = pl.resource_id AND pl.resource = 'product')
LEFT JOIN `products_info` AS pi ON (m.id = pi.product_id)
LEFT JOIN `products_to_categories` AS ptc ON (m.id = ptc.product_id)
INNER JOIN `temp_attr` AS pa
WHERE ptc.category_id = :cat
AND m.status = 1
AND m.id = pa.product_id
LIMIT 55;
";
$data = $pdo->prepare($sql)
->bindValue('cat', 100)
->execute()
->fetchAll();
但是,當我在臨時表代碼中使用占位符時,即
$temp_sql = <<<"TEMP"
CREATE TEMPORARY TABLE IF NOT EXISTS `temp_attr` (
SELECT product_id, GROUP_CONCAT(CONCAT(group_id, '-', IF (custom_value != '', custom_value, value_id)) SEPARATOR ',') AS attributes
FROM `products_attributes`
GROUP BY `product_id`
HAVING :qry_str
);
TEMP;
$sth = $pdo->prepare($temp_sql);
$sth->bindValue('qry_str', $qry_str, PDO::PARAM_STR);
$sth->execute();
我收到以下錯誤:
PHP 致命錯誤:未捕獲的 PDOException:SQLSTATE [22007]:無效的日期時間格式:1292 截斷不正確的 DOUBLE 值:'FIND_IN_SET('6-47', attributes) A??ND FIND_IN_SET('4-176', attributes) A??ND FIND_IN_SET('9- 218',屬性)和 FIND_IN_SET(...'
此表中沒有日期時間列。
group_id并且value_id是整數列
由于代碼在沒有占位符的情況下作業正常,我不知道為什么使用占位符會破壞代碼。主 SQL 中的占位符作業正常。
PHP 8.0
uj5u.com熱心網友回復:
https://dev.mysql.com/doc/refman/8.0/en/prepare.html解釋:
引數標記只能用于應出現資料值的地方,不能用于 SQL 關鍵字、識別符號等。
在您的情況下,您顯然是在嘗試將運算式與 FIND_IN_SET()函式系結。你不能那樣做。在您準備查詢時,所有運算式和其他 SQL 語法都必須在查詢中固定。您只能在您將使用標量文字值的地方使用引數。也就是說,帶引號的字串或數字文字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/531959.html
