它有效,但我觉得这不是解决我问题的最佳方法。 我希望我的代码做的是检查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语句中加入一些逻辑。 如果您有任何见解,请帮助。
答案 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;