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

I'm a fan of a dry code. I'm not sure is doable but I'm trying to save me from writing a double query.

Here's my example:

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

In the first part of my code, I'm parsing my 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>';
}

Then I run two queries: depends on the link that I'm parsing I'm gonna retrieve two different set of data.

I was wondering if it is possible to have a different approach, something in this line:

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

right after my variables and then, inside the if statement:

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

Or any other way to avoid to rewrite my code could be fine. In this case I'm not gonna save a lot, I'm just trying to understand what it could be the best approach.

Overlooking the injected $page variable issue, you really only need to replace the column name it looks like:

$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>';
}

You could just modify the beginning:

Use a ternary operator here (basically a one liner if statement)

$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'") );

If you don't like that style, you could do this:

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

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

Then once $sql is set, you can now run that foreach once, since it's the same code either way

 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>';

Using DRY for queries (especially simple queries like the on in your example) usually is not a good idea. It creates a mess and makes your code less readable and harder to maintain. I would not recommend it, but if you really want to do it, just use a string variable for the SQL statement:

$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);

Also make sure to use prepare statements to prevent SQL injections.