Php 哪一个更好?情况是什么时候或者如果其他情况?
我的情况是这样的: 情况是这样的:Php 哪一个更好?情况是什么时候或者如果其他情况?,php,mysql,codeigniter,Php,Mysql,Codeigniter,我的情况是这样的: 情况是这样的: public function get_opportunity($customer_id, $group_id, $action) { $sql = "SELECT COUNT(transaction_id) AS total_transaction FROM `transaction` WHERE CASE WHEN '$a
public function get_opportunity($customer_id, $group_id, $action)
{
$sql = "SELECT COUNT(transaction_id) AS total_transaction
FROM `transaction`
WHERE
CASE
WHEN '$action' = 'view_all' THEN transaction_id IS NOT NULL
WHEN '$action' = 'view_group' THEN group_id IN($group_id)
ELSE transaction_created_by = ?
END
";
$result = $this->db->query($sql, array($customer_id))->result_array();
return ($result[0]['total_transaction']) ? $result[0]['total_transaction'] : 0;
}
public function get_opportunity($customer_id, $group_id, $action)
{
if($action == "view_all")
$condition = " transaction_id IS NOT NULL";
else if($action == 'view_group')
$condition = " group_id IN($group_id)";
else
$condition = " customer_id = ?";
$sql = "SELECT COUNT(transaction_id) AS total_transaction
FROM `transaction`
WHERE $condition";
$result = $this->db->query($sql, array($customer_id))->result_array();
return ($result[0]['total_transaction']) ? $result[0]['total_transaction'] : 0;
}
如果其他情况是这样的:
public function get_opportunity($customer_id, $group_id, $action)
{
$sql = "SELECT COUNT(transaction_id) AS total_transaction
FROM `transaction`
WHERE
CASE
WHEN '$action' = 'view_all' THEN transaction_id IS NOT NULL
WHEN '$action' = 'view_group' THEN group_id IN($group_id)
ELSE transaction_created_by = ?
END
";
$result = $this->db->query($sql, array($customer_id))->result_array();
return ($result[0]['total_transaction']) ? $result[0]['total_transaction'] : 0;
}
public function get_opportunity($customer_id, $group_id, $action)
{
if($action == "view_all")
$condition = " transaction_id IS NOT NULL";
else if($action == 'view_group')
$condition = " group_id IN($group_id)";
else
$condition = " customer_id = ?";
$sql = "SELECT COUNT(transaction_id) AS total_transaction
FROM `transaction`
WHERE $condition";
$result = $this->db->query($sql, array($customer_id))->result_array();
return ($result[0]['total_transaction']) ? $result[0]['total_transaction'] : 0;
}
我试过了。上述工作的所有类型。但是在这里我要问,哪一个更好?这不可能是正确的,第一个代码不应该工作!在SQL
中,CASE
是一个表达式,而不是一个语句。您不能在THEN
部分设置条件,只能设置一个值。MySQL将布尔表达式计算为1\0,因此您的案例基本上如下所示:
WHERE CASE... THEN (Cond) -- equals to 1/0
THEN (Cond) -- equals to 1/0
ELSE (Cond) -- -- equals to 1/0
SELECT COUNT(transaction_id) AS total_transaction
FROM `transaction`
WHERE ('$action' = 'view_all' AND transaction_id IS NOT NULL) OR
('$action' = 'view_group' THEN group_id IN($group_id)) OR
transaction_created_by = ?
大多数RDBMS都会抛出一个错误
您可以将其格式化如下:
WHERE CASE... THEN (Cond) -- equals to 1/0
THEN (Cond) -- equals to 1/0
ELSE (Cond) -- -- equals to 1/0
SELECT COUNT(transaction_id) AS total_transaction
FROM `transaction`
WHERE ('$action' = 'view_all' AND transaction_id IS NOT NULL) OR
('$action' = 'view_group' THEN group_id IN($group_id)) OR
transaction_created_by = ?
只要您没有性能问题,就不要考虑这些问题,
这只会浪费你的时间。选择一种更容易维护的方法。除了@sagi提出的问题之外,实际上第二种方法更好,原因有些不相关。在第一个示例中,您直接使用查询字符串中的变量<代码> $Actudio< /Cord>,它可能打开SQL注入的攻击向量,因为它来自方法范围之外,可能不安全。而在第二个示例中,变量
$condition
是在方法中控制的,可以安全使用
除此之外,只要性能不是问题,我会选择可读性。出于这个原因,我甚至可能将其拆分为3个独立的、名称明确的函数,它们具有非常相似的SQL。这样,发生了什么事情总是很清楚,每个案例都可以独立地“增长”,而不是添加越来越多的案例和ifs的一种方法
编辑:您还可以清楚地为功能命名,例如
- getAllTransactionCounts()
- getTransactionCountForCustomers($TransactionId)
- getTransactionCountForCustomer($customerId)
数组查找(例如数组('view\u all'=>'transaction NOT NULL',…)
),一长串if
语句。@tadman,我已经尝试了上述两种方法,并且都奏效了。我使用mysql数据库非常感谢。我已经尝试了以上两种方法,效果很好。我使用mysql数据库,你认为第二种方法如何(如果有)?如果它好用?是的,它没关系,就像@dburmann说的,它可以导致SQL注入,但一般来说,选择一个更容易维护的。它们都很好,但有时最好在站点端进行计算和逻辑。那么你认为第二种方法(如果有的话)没有问题吗?@samueltoh我认为第二种方法没有重大问题,但仍然需要一些重构。例如,当customer_id和action都为null时会发生什么?如果组id作为数组而不是逗号分隔的列表提供呢?这就是为什么我建议将其分为3种方法(可能是由get_opportunity
调用的私有方法),其中只包含必要的参数,以使这些案例更清晰、更易于管理。