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)

为什么要在MySQL代码中添加基于PHP变量的条件?找出要执行的查询,然后运行正确的查询。不要将其转储到数据库中。另外,请不要内联任意值。尽可能使用。我想这是他的代码的一个功能。。只需比较哪个查询更适合使用。组合LOLSG通常按从最开始到最开始的顺序排列:通过关联的
数组查找
(例如
数组('view\u all'=>'transaction NOT NULL',…)
),一长串
if
语句。@tadman,我已经尝试了上述两种方法,并且都奏效了。我使用mysql数据库非常感谢。我已经尝试了以上两种方法,效果很好。我使用mysql数据库,你认为第二种方法如何(如果有)?如果它好用?是的,它没关系,就像@dburmann说的,它可以导致SQL注入,但一般来说,选择一个更容易维护的。它们都很好,但有时最好在站点端进行计算和逻辑。那么你认为第二种方法(如果有的话)没有问题吗?@samueltoh我认为第二种方法没有重大问题,但仍然需要一些重构。例如,当customer_id和action都为null时会发生什么?如果组id作为数组而不是逗号分隔的列表提供呢?这就是为什么我建议将其分为3种方法(可能是由
get_opportunity
调用的私有方法),其中只包含必要的参数,以使这些案例更清晰、更易于管理。