gpt4 book ai didi

php - foreach 中的 if else 语句导致错误

转载 作者:行者123 更新时间:2023-11-29 03:40:46 25 4
gpt4 key购买 nike

我有一个 php 函数,用于批量更新/添加产品折扣。

我在 sku 上添加了额外的 $new_price 条件和 substr 检查之前,代码一直运行良好
我在 select 语句中添加了 p.sku。它现在给我一个空白屏幕,当我尝试执行它时查询没有运行。

if ($user_group == 15 && $percent == 0) {
$this->db->query("DELETE FROM " . DB_PREFIX . "product_discount WHERE customer_group_id = '".$user_group."' AND quantity = '".$quantity."'");

$query = $this->db->query("SELECT p.product_id, p.sku, p.cost, p.price FROM product p");

foreach ($query->rows as $result) {

if ((substr($result['sku'],0,3) == 'ACA')) {
$new_price = ($result['cost'] * 32.5 / 100 + $result['cost']);
} else {
$new_price = ($result['cost'] * 40 / 100 + $result['cost']);
}

$this->db->query("INSERT INTO " . DB_PREFIX . "product_discount SET
`product_id` = '" . $result['product_id'] . "',
`customer_group_id` = '15',
`quantity` = '".$quantity."',
`priority` = '".$priority."',
`price` = '".$new_price."',
`date_start` = '".$start_date."',
`date_end` = '".$expire_date."'");
}

}

我在这里错过了什么?我一直在搜索论坛和谷歌等,整个下午都在尝试各种事情,我受够了!请帮助任何人!

在向index.php添加错误报告后,我终于有了线索:
“ fatal error :允许的 134217728 字节内存已耗尽(已尝试分配 32 字节)”

这里是函数的完整代码,根据评论做了一些小改动,我不知道为什么所有内存都用完了,希望有人能提供帮助:

<?php
class ModelBulkDiscount extends Model {

public function updateDiscount($user_group = null, $percent = 0, $quantity = 1, $priority = 0, $start_date = null, $expire_date = null) {

if($user_group != 15 && $percent > 0) {
$this->db->query("DELETE FROM " . DB_PREFIX . "product_discount WHERE customer_group_id = '".$user_group."' AND quantity = '".$quantity."'");

$query = $this->db->query("SELECT p.product_id, p.price FROM " . DB_PREFIX . "product p");

foreach ($query->rows as $result) {

$new_price = $result['price'] - (($result['price'] / 100) * $percent);

$this->db->query("INSERT INTO " . DB_PREFIX . "product_discount SET
`product_id` = '" . $result['product_id'] . "',
`customer_group_id` = '" . $user_group . "',
`quantity` = '".$quantity."',
`priority` = '".$priority."',
`price` = '".$new_price."',
`date_start` = '".$start_date."',
`date_end` = '".$expire_date."'");

}

} else if ($user_group == 15 && $percent == 0) {
$this->db->query("DELETE FROM " . DB_PREFIX . "product_discount WHERE customer_group_id = '".$user_group."' AND quantity = '".$quantity."'");

$query = $this->db->query("SELECT p.product_id, p.sku, p.cost, p.price FROM " . DB_PREFIX . "product p");

foreach ($query->rows as $result) {

if ((substr($result['sku'],0,3) == 'ACA')) {
$new_price = ($result['cost'] * 1.325);
} else {
$new_price = ($result['cost'] * 1.4);
}

$this->db->query("INSERT INTO " . DB_PREFIX . "product_discount SET
`product_id` = '" . $result['product_id'] . "',
`customer_group_id` = '15',
`quantity` = '".$quantity."',
`priority` = '".$priority."',
`price` = '".$new_price."',
`date_start` = '".$start_date."',
`date_end` = '".$expire_date."'");
}

} else if ($user_group == 15 && $percent > 0) {
$this->db->query("DELETE FROM " . DB_PREFIX . "product_discount WHERE customer_group_id = '".$user_group."' AND quantity = '".$quantity."'");

$query = $this->db->query("SELECT p.product_id, p.cost, p.price FROM " . DB_PREFIX . "product p");

foreach ($query->rows as $result) {
$temp_price = ($result['cost'] * 1.325);
$new_price = $temp_price - (($temp_price / 100) * $percent);

$this->db->query("INSERT INTO " . DB_PREFIX . "product_discount SET
`product_id` = '" . $result['product_id'] . "',
`customer_group_id` = '15',
`quantity` = '".$quantity."',
`priority` = '".$priority."',
`price` = '".$new_price."',
`date_start` = '".$start_date."',
`date_end` = '".$expire_date."'");
}
}
}
}
?>

最佳答案

通过查看您的代码,我唯一能想到的可能是初始 SQL 查询返回的数据集超出了 PHP 的内存限制。也许您可以尝试添加一个 LIMIT 100 或类似的查询,看看问题是否仍然存在。您还可以寻找一种方法从数据库服务器获取表的大小(以字节为单位),并查看它是否超过 128MB。

另一个注意事项:在 PHP 中处理大量记录并不是性能方面的最佳方法,因为整个数据必须从 SQL 服务器传输到 PHP 解释器进程,然后再传输回来。您发布的代码看起来像是您通常会使用特殊查询(甚至可能使用存储过程)直接在数据库中实现的代码。

本质上,您是在尝试根据另一个表中的数据插入大量记录。因此,您想对该表执行选择并将其用作插入的子表达式。看看:https://dev.mysql.com/doc/refman/5.1/en/insert-select.html

我不认为自己是 SQL 专家,但为了让您了解这可能是如何工作的,仅针对部分字段:

INSERT INTO product_discount (product_id, customer_product_id, new_price) SELECT 
sub.product_id, 15, sub.new_price FROM (
SELECT p.product_id, p.price*1.35 AS new_price FROM products
) AS sub;

注意:我省略了 new_price 计算的一部分,因为它需要另一个子 SELECT,而且我想保持可读性。但也可以使用纯 SQL。它不像命令式编程那样直观,但 SQL 提供了很多功能,并且条件表达式之类的东西也是可能的。

您应该能够制定一个完全在数据库中执行所需操作的查询。这样,就不需要在 DB 和 PHP 之间传输任何数据,这很可能会更快,并且您不会耗尽内存。

关于php - foreach 中的 if else 语句导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14241864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com