如何使这些PHP if语句更简洁?

时间:2016-09-08 15:13:11

标签: php

我有多个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"]);
}

5 个答案:

答案 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个按钮输入,但可以根据他的回答进行调整。