[英]Could this PHP code be simplified or improved?
我想知道下面的代码是否可以重构/改进/简化? 我将其发布在这里,因为我想要另一个程序员的观点/观点; 最好看看别人会怎么做。
<?php
function moderateTopic($topic_id, $action = NULL) {
$locked_query = "SELECT topic_id FROM forum_topics WHERE status = 'locked' AND topic_id = '{$topic_id}'";
$locked_count = totalResults($locked_query);
$announcement_query = "SELECT topic_id FROM forum_topics WHERE topic_type = 2 AND topic_id = '{$topic_id}'";
$announcement_count = totalResults($announcement_query);
$sticky_query = "SELECT topic_id FROM forum_topics WHERE topic_type = 3 AND topic_id = '{$topic_id}'";
$sticky_count = totalResults($sticky_query);
if (is_null($action) == FALSE) {
switch ($action) {
case 1:
if ($locked_count > 0) {
$topic_query = "UPDATE forum_topics SET status = 'unlocked' WHERE topic_id = '{$topic_id}'";
} else {
$topic_query = "UPDATE forum_topics SET status = 'locked' WHERE topic_id = '{$topic_id}'";
}
doQuery($topic_query);
break;
case 2:
if ($announcement_count > 0) {
$topic_query = "UPDATE forum_topics SET topic_type = 1 WHERE topic_id = '{$topic_id}'";
} else {
$topic_query = "UPDATE forum_topics SET topic_type = 2 WHERE topic_id = '{$topic_id}'";
}
doQuery($topic_query);
break;
case 3:
if ($sticky_count > 0) {
$topic_query = "UPDATE forum_topics SET topic_type = 1 WHERE topic_id = '{$topic_id}'";
} else {
$topic_query = "UPDATE forum_topics SET topic_type = 3 WHERE topic_id = '{$topic_id}'";
}
doQuery($topic_query);
break;
case 4:
header('Location: ' . urlify(9, $topic_id));
break;
case 5:
header('Location: ' . urlify(11, $topic_id));
break;
}
header('Location: ' . urlify(2, $topic_id));
} else {
$locked = $locked_count > 0 ? 'Unlock' : 'Lock';
$announcement = $announcement_count > 0 ? 'Unannounce' : 'Announce';
$sticky = $sticky_count > 0 ? 'Unsticky' : 'Sticky';
return <<<EOT
<div style="float: right;">
<form method="POST">
<select name="action" onChange="document.forms[0].submit();">
<option value="">- - Moderate - -</option>
<option value="1"> => {$locked}</option>
<option value="2"> => {$announcement}</option>
<option value="3"> => {$sticky}</option>
<option value="4"> => Move</option>
<option value="5"> => Delete</option>
</select>
</form>
</div>
EOT;
}
}
?>
我将从寻找重复项开始。 我看到查询字符串的6个非常相似的情况:
$topic_query = "UPDATE forum_topics SET status = 'unlocked' WHERE topic_id = '{$topic_id}'";
$topic_query = "UPDATE forum_topics SET status = 'locked' WHERE topic_id = '{$topic_id}'";
$topic_query = "UPDATE forum_topics SET topic_type = 1 WHERE topic_id = '{$topic_id}'";
$topic_query = "UPDATE forum_topics SET topic_type = 2 WHERE topic_id = '{$topic_id}'";
$topic_query = "UPDATE forum_topics SET topic_type = 1 WHERE topic_id = '{$topic_id}'";
$topic_query = "UPDATE forum_topics SET topic_type = 3 WHERE topic_id = '{$topic_id}'";
每一个都执行查询。 那么一种方法呢?
function setField($topic_id, $field, $value) {
$topic_query = "UPDATE forum_topics SET '{$field}' = '{$value}' WHERE topic_id = '{$topic_id}'";
doQuery($topic_query);
}
现在,您的switch语句的第一位如下所示:
switch ($action) {
case 1:
if ($locked_count > 0) {
setField($topic_id, 'status', 'unlocked');
} else {
setField($topic_id, 'status', 'locked');
}
break;
case 2:
if ($announcement_count > 0) {
setField($topic_id, 'topic_type', 1);
} else {
setField($topic_id, 'topic_type', 2);
}
break;
case 3:
if ($sticky_count > 0) {
setField($topic_id, 'topic_type', 1);
} else {
setField($topic_id, 'topic_type', 3);
}
break;
但是我看到我搞砸了-有时字段是一个字符串,有时是一个int-并且int的情况都是topic_type。 因此,使其工作如下:
switch ($action) {
case 1:
if ($locked_count > 0) {
setField($topic_id, 'status', 'unlocked');
} else {
setField($topic_id, 'status', 'locked');
}
break;
case 2:
if ($announcement_count > 0) {
setTopicType($topic_id, 1);
} else {
setTopicType($topic_id, 2);
}
break;
case 3:
if ($sticky_count > 0) {
setTopicType($topic_id, 1);
} else {
setTopicType($topic_id, 3);
}
break;
以这种方式进行下去,您可能会很快发现自己对代码的状态更加满意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.