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);


    }

我在您的查询中检测到两个错误:

  • 插入5个字段,但仅插入4个值

  • 在值中,如果值为字符串,则不添加“”字符

  • 示例:如果所有字段都具有数据类型字符串

    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变量。这样就不必担心字符串值中的任何特殊字符。