有条件的准备语句PHP mysqli,reduce

时间:2017-05-31 12:18:45

标签: php sql database mysqli prepared-statement

它有效,但我觉得这不是解决我问题的最佳方法。 我希望我的代码做的是检查location = 1并发送所有位置的消息。

function getCurrentMessage($location){
    $conn = Connection::getConnection();

    if($location == 1) {
        $query = "SELECT first_name, last_name, description, title, message ,font_size , effective_date 
                FROM tbl_messages
                JOIN tbl_authors ON tbl_authors.id_author = tbl_messages.id_author 
                JOIN tbl_locations ON tbl_messages.id_location = tbl_locations.id_location
                AND effective_date <= CURDATE()
                ORDER BY effective_date desc
                LIMIT 2;";

        $result = array();

        if ($stmt = $conn->prepare($query)) {
            $stmt->bind_result($first_name, $last_name, $location, $title, $message, $size, $date);
            $stmt->execute();

            while ($stmt->fetch()) {
                $message = new Message($first_name, $last_name, $location, $title, $message, $size, $date);
                array_push($result, $message);
            }
        }
    }
    else{
        $query = "SELECT first_name, last_name, description, title, message ,font_size , effective_date 
                FROM tbl_messages
                JOIN tbl_authors ON tbl_authors.id_author = tbl_messages.id_author 
                JOIN tbl_locations ON tbl_messages.id_location = tbl_locations.id_location
                WHERE tbl_messages.id_location = ?
                AND effective_date <= CURDATE()
                ORDER BY effective_date desc
                LIMIT 2;";

        $result = array();

        if ($stmt = $conn->prepare($query)) {
            $stmt->bind_result($first_name, $last_name, $location, $title, $message, $size, $date);
            $stmt->bind_param('i', $location);
            $stmt->execute();

            while ($stmt->fetch()) {
                $m = new Message($first_name, $last_name, $location, $title, $message, $size, $date);
                array_push($result, $m);
            }
        }
    }

    return $result;
}

也许我可以在SQL语句中加入一些逻辑。 如果您有任何见解,请帮助。

2 个答案:

答案 0 :(得分:0)

只需重构所有不依赖于条件的重复部分。

function getCurrentMessage($location){
    $conn = Connection::getConnection();

    if($location == 1) {
        $query = "SELECT first_name, last_name, description, title, message ,font_size , effective_date 
                FROM tbl_messages
                JOIN tbl_authors ON tbl_authors.id_author = tbl_messages.id_author 
                JOIN tbl_locations ON tbl_messages.id_location = tbl_locations.id_location
                AND effective_date <= CURDATE()
                ORDER BY effective_date desc
                LIMIT 2;";

        if (!$stmt = $conn->prepare($query)) {
            return false;
        }

    }
    else{
        $query = "SELECT first_name, last_name, description, title, message ,font_size , effective_date 
                FROM tbl_messages
                JOIN tbl_authors ON tbl_authors.id_author = tbl_messages.id_author 
                JOIN tbl_locations ON tbl_messages.id_location = tbl_locations.id_location
                WHERE tbl_messages.id_location = ?
                AND effective_date <= CURDATE()
                ORDER BY effective_date desc
                LIMIT 2;";

        if (!$stmt = $conn->prepare($query)) {
            return false;
        }
        $stmt->bind_param('i', $location);
    }

    $result = array();

    $stmt->bind_result($first_name, $last_name, $location, $title, $message, $size, $date);
    $stmt->execute();

    while ($stmt->fetch()) {
         $m = new Message($first_name, $last_name, $location, $title, $message, $size, $date);
         array_push($result, $m);
    }

    return $result;
}

你可以走得更远,但这只是一个例子。注意如果语句准备失败,函数如何返回false。由于你在一个函数内部,这将停止执行该函数并返回false,因为如果准备失败则没有进一步的进展。如果你想要一些可以捕获的东西,你也可以使用例外。

答案 1 :(得分:0)

我现在意识到这个问题应该已经发布在代码审核中Code review , 但在了解了有关MYSQL的更多信息后,我想出了一种清理代码的方法,所以这是我使用控制流功能的答案 如果您有任何其他想法要进一步清理代码,请告诉我。

$conn = getConnection();
$query = "SELECT first_name, last_name, description, title, message ,font_size , DATE_FORMAT(effective_date,'%h:%i %p %m-%d-%Y')
          FROM tbl_messages
          JOIN tbl_authors ON tbl_authors.id_author = tbl_messages.id_author
          JOIN tbl_locations ON tbl_messages.id_location = tbl_locations.id_location
          WHERE tbl_messages.id_location = IF(? = 1,tbl_messages.id_location,?)
          AND effective_date <= NOW()
          ORDER BY effective_date DESC
          LIMIT 1
          ";

if (!$stmt = $conn->prepare($query)) {
    return false;
}

$stmt->bind_param('ii', $location,$location);

$result = array();

$stmt->bind_result($first_name, $last_name, $location, $title, $message, $size, $date);
$stmt->execute();

while ($stmt->fetch()) {
    $m = new Message($first_name, $last_name, $location, $title, $message, $size, $date);
    array_push($result, $m);
}

return $result;