- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
创建一个“海盗对话”,可以选择左手或右手。我希望它对“左”和“右”的不同拼写做出积极的回答(正如您将在代码中看到的那样),但是,当我为所有非“右”或“左”的输入添加最终的“else”代码时,它给了我一
With 语句 对一个对象执行一系列的语句。 With object statements End With 参数 object 必需的部分
While...Wend 语句 当指定的条件为 True 时,执行一系列的语句。 While condition  ; Version [stat
所以我正在处理的代码有一个小问题。 while True: r = input("Line: ") n = r.split() if r == " ":
我有一个对象数组: var contacts = [ { "firstName": "Akira", "lastName": "Laine", "number"
int main() { int f=fun(); ... } int fun() { return 1; return 2; } 在上面的程序中,当从main函数中调用一个
我的项目中有很多 if 语句、嵌套 if 语句和 if-else 语句,我正在考虑将它们更改为 switch 语句。其中一些将具有嵌套的 switch 语句。我知道就编译而言,switch 语句通常更
Rem 语句 包含程序中的解释性注释。 Rem comment 或 ' comment comment 参数是需要包含的注释文本。在 Rem 关键字和 comment 之间应有一个空格。
ReDim 语句 在过程级中声明动态数组变量并分配或重新分配存储空间。 ReDim [Preserve] varname(subscripts) [, varname(subscripts)]
Randomize 语句 初始化随机数生成器。 Randomize [number] number 参数可以是任何有效的数值表达式。 说明 Randomize 使用 number 参数初始
Public 语句 定义公有变量并分配存储空间。在 Class 块中定义私有变量。 Public varname[([subscripts])][, varname[([subscripts])
Sub 语句 声明 Sub 过程的名称、参数以及构成其主体的代码。 [Public [Default]| Private] Sub name [( arglist )]
Set 语句 将对象引用赋给一个variable或property,或者将对象引用与事件关联。 Set objectvar = {objectexpression | New classname
我有这个代码块,有时第一个 if 语句先运行,有时第二个 if 语句先运行。我不确定为什么会这样,因为我认为 javascript 是同步的。 for (let i = 0; i < dataObje
这是一个 javascript 代码,我想把它写成这样:如果此人回答是,则回复“那很酷”,如果此人回答否,则回复“我会让你开心”,如果此人回答的问题包含"is"或“否”,请说“仅键入”是或否,没有任何
这是我的任务,我尝试仅使用简短的 if 语句来完成此任务,我得到的唯一错误是使用“(0.5<=ratio<2 )”,除此之外,构造正确吗? Scanner scn = new Scanner(
有没有办法在 select 语句中使用 if 语句? 我不能在这个中使用 Case 语句。实际上我正在使用 iReport 并且我有一个参数。我想要做的是,如果用户没有输入某个参数,它将选择所有实例。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: If vs. Switch Speed 我将以 C++ 为例,但我要问的问题不是针对特定语言的。我的意思是一
Property Set 语句 在 Class 块中,声明名称、参数和代码,这些构成了将引用设置到对象的 Property 过程的主体。 [Public | Private] Pro
Property Let 语句 在 Class 块中,声明名称、参数和代码等,它们构成了赋值(设置)的 Property 过程的主体。 [Public | Private] Prop
我是一名优秀的程序员,十分优秀!