我有多个if语句几乎做同样的事情。只有数字会改变。我在下面只显示了两个ifs。总会有至少一个按钮,但最多可能有二十个,所以我想知道如何让它更简洁。
if (isset($_POST['button1']) && ($_POST['button1']) == $button1 ){
$stmt = $db->prepare('UPDATE members SET page = :page WHERE memberid = :memberid');
$stmt->execute(array(':memberid' => $_SESSION['memberID'], ':page' => $_POST['button1']));
$array = $stmt -> fetchAll(PDO::FETCH_ASSOC);
$_SESSION["page"] = $_POST['button1'];
header ('Location: memberpage.php?page=' . $_SESSION["page"]);
}
elseif (isset($_POST['button2']) && ($_POST['button2']) == $button2 ){
$stmt = $db->prepare('UPDATE members SET page = :page WHERE memberid = :memberid');
$stmt->execute(array(':memberid' => $_SESSION['memberID'], ':page' => $_POST['button2']));
$array = $stmt -> fetchAll(PDO::FETCH_ASSOC);
$_SESSION["page"] = $_POST['button2'];
header ('Location: memberpage.php?page=' . $_SESSION["page"]);
}
答案 0 :(得分:1)
数组键很简单 - 它们只是字符串:
for($i = 1; $i <= 2; $i++) {
if (isset($_POST["button$i"]) etc....
^^
对于变量,您应该考虑将它们存储在数组中而不是使用编号的变量:
if (isset($_POST["button$i"]) == $buttons[$i]))
你可以使用var-vars,但这只会让代码成为以后维护的噩梦:
$temp = "button" . $i;
if (.... == $$temp)
^^
答案 1 :(得分:1)
在for循环中使用变量变量 - 假设模式成立,这将允许尽可能多的if
条件。
for($i = 1; $i <= $numberOfConditions; $i++) {
$postKey = "button" . $i;
if (isset($_POST[$postKey]) && ($_POST[$postKey] === $$postKey )) {
$stmt = $db->prepare('UPDATE members SET page = :page WHERE memberid = :memberid');
$stmt->execute(array(':memberid' => $_SESSION['memberID'], ':page' => $_POST[$postKey]));
$array = $stmt -> fetchAll(PDO::FETCH_ASSOC);
$_SESSION["page"] = $_POST[$postKey];
header ('Location: memberpage.php?page=' . $_SESSION["page"]);
}
}
}
答案 2 :(得分:1)
在我看来,你可以在HTML端命名输入&#34; button&#34;并且如果检查就逍遥法外......
//append the button values to an array
$page_array = array(232, 363);
//add the code to a function for future use
changePage($page_array);
function changePage($page_array){
if(($_SERVER["REQUEST_METHOD"] == "POST") && isset($_POST['button']) && in_array($_POST['button'], $page_array)){
$stmt = $db->prepare('UPDATE members SET page = :page WHERE memberid = :memberid');
$stmt->execute(array(':memberid' => $_SESSION['memberID'], ':page' => $_POST['button']));
$array = $stmt -> fetchAll(PDO::FETCH_ASSOC);
$_SESSION["page"] = $_POST['button'];
header ('Location: memberpage.php?page=' . $_POST['button']);
} else {
echo "ERROR";
}
}
同样,我有点猜测你的代码实际上在做什么,但似乎你正在定义每个按钮并设置一个页面......?在您的HTML方面,你可以做... .. / / p>
<!--- the button values are added from the initial array -->
<form method="post">
<button type="submit" name="button" value="<?php echo $page_array[0]; ?>">Option 1</button>
<button type="submit" name="button" value="<?php echo $page_array[1]; ?>">Option 2</button>
</form>
$ page_array将定义已接受页面的列表(如果这是您正在寻找的内容......)并且in_array只是检查以确保从帖子传递的值存在于接受的页面列表中
- 接受您的修改,添加以下内容:
如果您的视图可以访问您的页面阵列,并且您希望在按钮中使用它以便于维护,那么您可以更进一步,就像这样..
$page_array = array(
232 => 'Page Name',
363 => 'Page Name'
);
如果检查,请更改您的功能:
if(($_SERVER["REQUEST_METHOD"] == "POST") && isset($_POST['button']) && in_array($_POST['button'], $page_array)){
对此:
if(($_SERVER["REQUEST_METHOD"] == "POST") && isset($_POST['button']) && array_key_exists($_POST['button'], $page_array)){
现在,您可以在HTML中执行此操作:
<form method="post">
<?php foreach($page_array as $page_number => $page_name): ?>
<button type="submit" name="button" value="<?php echo $page_number; ?>"><?php echo $page_name; ?></button>
<?php endforeach; ?>
</form>
答案 3 :(得分:1)
您可以将代码转换为匿名函数:
if (isset($_POST['button1']) && ($_POST['button1']) == $button1 ){
$updatePage(1);
}
elseif (isset($_POST['button2']) && ($_POST['button2']) == $button2 ){
$updatePage(2);
}
然后你想在哪里使用它只需调用函数:
$buttons = array('button1', 'button2');
foreach ($buttons as $button) {
if (isset($_POST[$button])) {
$updatePage($_POST[$button]);
}
}
或将其添加到循环中:
foreach
代码中函数的目的是减少重复代码......我们可以通过使用类并将db对象分配给它然后调用方法来使这更好。然后,您可以通过要求它执行测试来为您的课程做更多的事情,因此如果您测试更改,您只能在一个地方更改它。这实际上取决于您的其余代码,我们根据您添加的小片段做出假设。这基本上就是你的控制器。
经验法则,如果您将相同的代码写入两次,则将其作为一项功能。你永远不知道是否需要改变它周围的业务逻辑(if
vs switch
vs {{1}}),但至少行动将保持不变,你不会需要重构一样。
答案 4 :(得分:0)
我的建议如下:
// This is the same in both so doesn't need put in both
$stmt = $db->prepare('UPDATE members SET page = :page WHERE memberid = :memberid');
// The if only really checks what value you should use, so...
if (isset($_POST['button1']) && ($_POST['button1']) == $button1 ){
$uButton = $button1;
} else { // Put the else if back in if you like, but if you do, add an else
$uButton = $button2;
}
// Aside from the variable above, all these lines were identical too
$stmt->execute(array(':memberid' => $_SESSION['memberID'], ':page' => $uButton));
$array = $stmt -> fetchAll(PDO::FETCH_ASSOC);
$_SESSION["page"] = $uButton;
header ('Location: memberpage.php?page=' . $_SESSION["page"]);
这取决于其他代码。即整个块可能需要进入另一个条件,检查2个按钮中是否至少有一个可用。
与Marc的回答不同,此问题不会考虑您有超过2个按钮输入,但可以根据他的回答进行调整。