![](/img/trans.png)
[英]Adding an If/Else statement within PHP foreach loop - WordPress Custom Fields
[英]if else statement within foreach causes error
我有一个php函数,用于为批量产品更新/添加折扣价格。
直到
我在sku上添加了额外的$ new_price条件和substr检查之后,
代码才能正常工作
我在选择语句中添加了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."'");
}
}
我在这里想念什么? 我一直在搜索论坛和Google等,整个下午都在尝试各种方法,我已经受够了! 请帮助任何人!
将错误报告添加到index.php之后,我终于有了一个线索:
“严重错误:允许的内存大小为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 Server传输到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计算的一部分,因为它需要另一个sub-SELECT,并且我想保留可读性。 但是也可以使用纯SQL。 它不像命令式编程那样直观,但是SQL提供了很多功能,条件表达式之类的东西也是可能的。
您应该能够制定一个查询,该查询完全在数据库中执行所需的操作。 这样,就无需在DB和PHP之间传输任何数据,这很可能会更快,并且不会耗尽内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.