2 回答

TA貢獻1946條經(jīng)驗 獲得超3個贊
我在您的查詢中檢測到兩個錯誤:
您插入 5 個字段,但只有 4 個值。
在值中,如果值字符串,則不添加 '' char
示例:如果所有數(shù)據(jù)類型為字符串的字段
VALUES ('$products[$i]', '$ids_product_attribute[$i]', '$references[$i]', '$stocks[$i]', 'Field 5')

TA貢獻1804條經(jīng)驗 獲得超8個贊
我會這樣寫這個函數(shù):
public function hookActionValidateOrder()
{
$defaults = [
'id_product' => null,
'id_product_attribute' => null,
'reference' => 0,
'stock_quantity' => 0
];
$stmt = Db::getInstance()->prepare("
INSERT INTO cart_log
SET products = :id_product,
ids_product_attribute = :id_product_attribute,
references = :reference,
stocks = :stock_quantity");
$products = Context::getContext()->cart->getProducts();
foreach ($products as $product) {
$values = array_merge($defaults, array_intersect_key($product, $defaults));
$stmt->execute($values);
}
}
此示例顯示了在準備好的語句中查詢參數(shù)的用法,因此您不要嘗試將 PHP 變量直接插入到 SQL 查詢中。查詢參數(shù)使編寫無錯誤的 SQL 代碼變得更加容易,并且它們可以保護您免受意外 SQL 注入錯誤(也包括惡意攻擊)的影響。
我建議您調(diào)用cart->getProducts()一次,并將結(jié)果保存在局部變量中。我不確定該函數(shù)的作用,但我想它正在運行另一個 SQL 查詢。您不應(yīng)該為每個循環(huán)多次運行相同的 SQL 查詢,這會增加數(shù)據(jù)庫服務(wù)器的負載。
要做的事情array_merge(array_intersect_key())是確保 values 數(shù)組具有所有需要的鍵,并且除了需要的鍵之外沒有其他鍵。然后它可以按原樣傳遞給PDOStatement::execute().
我正在使用MySQL 支持的INSERT 替代形式,使用SET column = value ...語法。我發(fā)現(xiàn)這可以更輕松地確保我已將一列與每個值匹配,反之亦然。
正如上面評論中提到的,您必須在數(shù)據(jù)庫連接器中啟用異常。我假設(shè)您的getInstance()函數(shù)返回一個 PDO 連接,因此您可以將參數(shù)數(shù)組傳遞給execute(). 您需要按照此處所述啟用 PDO 異常:https ://www.php.net/manual/en/pdo.error-handling.php
如果您不啟用異常,則應(yīng)檢查 和 的返回值prepare()是否為 ,execute()如果是=== false,則記錄errorInfo()(閱讀我鏈接到的關(guān)于錯誤處理的 PHP 文檔)。
- 2 回答
- 0 關(guān)注
- 250 瀏覽
添加回答
舉報