干查询,稍后在 php 中的 if 语句中添加 where 子句

Dry query, adding a where clause inside an if statement later on in php

我是一个干货代码爱好者。我不确定是否可行,但我正在努力避免编写双重查询。

这是我的例子:

$link       = $_SERVER['PHP_SELF'];
$link_array = explode('/', $link);
$page       = end($link_array);

在我的代码的第一部分,我正在解析我的 link。

if (strpos($link, 'something') !== false) {

    $sql = $ee->db->query("SELECT * FROM `mytable` WHERE order_id = '$page'");
        foreach ($sql->result() as $row) {
            $tracking_code = $row->tracking_id;
            $carrier_name  = $row->carrier_name;
            echo "The real carrier name is: {$carrier_name} .<br>";
            echo "The real tracking code is: " . $tracking_code . ' .<br>';
} else {

    $sql = $ee->db->query("SELECT * FROM `mytable` WHERE order_hash = '$page'");
        foreach ($sql->result() as $row) {
            $tracking_code = $row->tracking_id;
            $carrier_name  = $row->carrier_name;
            echo "The real carrier name is: {$carrier_name} .<br>";
            echo "The real tracking code is: " . $tracking_code . ' .<br>';
}

然后我 运行 两个查询:取决于我正在解析的 link 我将检索两组不同的数据。

我想知道是否可以采用不同的方法,在这一行中:

$sql = $ee->db->query("SELECT * FROM `mytable`");

在我的变量之后,然后在 if 语句中:

if (strpos($link, 'something') !== false) {
    $sql =. $ee->db->query("WHERE order_id = '$page'");
    #code
} else {
    $sql =. $ee->db->query("WHERE order_hash = '$page'");
    #code
}

或者任何其他避免重写我的代码的方法都可以。在这种情况下,我不会节省很多,我只是想了解什么是最好的方法。

您可以只修改开头:

这里使用三元运算符(基本上是单行 if 语句)

$sql = ( (strpos($link,'something') !== false) ? $ee->db->query("SELECT * FROM `mytable` WHERE order_id = '$page'") : $ee->db->query("SELECT * FROM `mytable` WHERE order_hash = '$page'") );

如果你不喜欢那种风格,你可以这样做:

$sql = $ee->db->query("SELECT * FROM `mytable` WHERE ");

if( strpos($link,'something') !== false ) { 
    $sql .= "order_id   = '$page'"
}else{
}   $sql .= "order_hash = '$page'";

然后一旦设置了 $sql,您现在就可以 运行 foreach 一次,因为两种方式都是相同的代码

 foreach ($sql->result() as $row) {
            $tracking_code = $row->tracking_id;
            $carrier_name  = $row->carrier_name;
            echo "The real carrier name is: {$carrier_name} .<br>";
            echo "The real tracking code is: " . $tracking_code . ' .<br>';

使用 DRY 进行查询(尤其是您示例中的 on 之类的简单查询)通常不是一个好主意。它会造成混乱并使您的代码可读性降低且更难维护。我不推荐它,但如果你真的想这样做,只需为 SQL 语句使用一个字符串变量:

$sql = "SELECT * FROM `mytable`";
if (strpos($link, 'something') !== false) {
    $sql =. "WHERE order_id = '$page'";
} else {
    $sql =. "WHERE order_hash = '$page'";
}
$query = $ee->db->query($sql);

还要确保使用准备语句来防止 SQL 注入。

忽略注入的 $page 变量问题,您实际上只需要替换它看起来像的列名:

$sql = $ee->db->query("SELECT * FROM `mytable` WHERE order_".((strpos($link, 'something') !== false)? "id" : "hash")." = '$page'");

foreach ($sql->result() as $row) {
    $tracking_code = $row->tracking_id;
    $carrier_name  = $row->carrier_name;
    echo "The real carrier name is: {$carrier_name} .<br>";
    echo "The real tracking code is: " . $tracking_code . ' .<br>';
}