Php MySQL插件没有显示任何内容
如何使数据库条目代码正常工作?现在,当我运行此代码时,没有显示任何内容Php MySQL插件没有显示任何内容,php,mysql,Php,Mysql,如何使数据库条目代码正常工作?现在,当我运行此代码时,没有显示任何内容 public function hookActionValidateOrder() { $products=[]; $ids_product_attribute=[]; $references=[]; $stocks= []; for($i=0;Context::getContext()->cart
public function hookActionValidateOrder()
{
$products=[];
$ids_product_attribute=[];
$references=[];
$stocks= [];
for($i=0;Context::getContext()->cart->getProducts()[$i]['id_product'];$i++)
{
array_push($products,Context::getContext()->cart->getProducts()[$i]['id_product']);
array_push($ids_product_attribute,Context::getContext()->cart->getProducts()[$i]['id_product_attribute']);
array_push($references,Context::getContext()->cart->getProducts()[$i]['reference']);
array_push($stocks,Context::getContext()->cart->getProducts()[$i]['stock_quantity']);
die(Db::getInstance()->execute("
INSERT INTO cart_log (products, ids_product_attribute, references, stocks, time)
VALUES ($products[$i], $ids_product_attribute[$i], $references[$i], $stocks[$i])"));
}
// var_dump($products);
// var_dump($ids_product_attribute);
// var_dump($references);
// var_dump($products);
}
我在您的查询中检测到两个错误:
VALUES ('$products[$i]', '$ids_product_attribute[$i]', '$references[$i]', '$stocks[$i]', 'Field 5')
我会这样写这个函数:
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);
}
}
这个例子展示了在一个准备好的语句中查询参数的用法,所以您不会试图将PHP变量直接插入到SQL查询中。查询参数使编写无错误的SQL代码变得更容易,并且可以保护您免受意外的SQL注入错误(也包括恶意攻击)的影响
我建议调用您的cart->getProducts()
一次,并将结果保存在局部变量中。我不确定该函数做什么,但我想它正在运行另一个SQL查询。您不应该对每个循环多次运行相同的SQL查询,这会增加数据库服务器的负载
关于array\u merge(array\u intersect\u key())
的业务是确保值数组同时包含所有需要的键,并且除了需要的键之外没有其他键。然后它可以按原样传递给PDOStatement::execute()
我使用了另一种插入形式,即使用SET column=value…
语法。我发现这样可以更容易地确保我已将一列与每个值匹配,反之亦然
如上所述,必须在数据库连接器中启用异常。我假设您的getInstance()
函数返回一个PDO连接,因此您可以将参数数组传递给execute()
。您需要启用PDO异常,如下所述:
如果不启用异常,则应检查
prepare()
和execute()
的返回值,以查看其中一个是否为==false
,如果是,则记录errorInfo()
(阅读我链接的关于错误处理的PHP文档)。您不检查错误。如果不检查错误,您希望如何找到错误?INSERT
需要5列,但值只有4列,时间
不表示。@johncode:True。需要有一个try/catch
当您从PHP获得空白输出时,您需要查看web服务器的错误日志以查找致命错误的详细信息。始终在开发和测试代码时,使用错误报告(E_ALL);ini设置(“显示错误”,1)代码>位于代码顶部(或在php.ini中设置)。在生产环境中,关闭“显示错误”。您的代码会受到相关攻击。甚至不能完全保护它。请学习如何使用。如果字段是字符串,您还必须处理字符串值包含文字“
字符的情况。如果单引号不平衡,则会在您显示的代码示例中导致错误。最好使用查询参数,而不是插入PHP变量。这样就不必担心字符串值中的任何特殊字符。