У меня есть несколько операторов if, которые делают почти то же самое. Изменится только номер. Ниже я показал только два «если». Всегда будет хотя бы одна кнопка, но может быть до двадцати, поэтому я хотел бы знать, как я могу сделать ее более лаконичной.

       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"]);
}
php
0
Buts 8 Сен 2016 в 18:13

5 ответов

Лучший ответ

Мне кажется, что вы могли бы назвать ввод на стороне HTML просто «кнопка» и уйти с одиночной проверки if ...

//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 вы можете просто ...

<!--- 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>
1
Lynne 8 Сен 2016 в 19:14

Используйте переменные переменные в цикле 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"]);

    }
}

}

1
The One and Only ChemistryBlob 8 Сен 2016 в 15:23

Ключи массива просты - это просто строки:

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
Marc B 8 Сен 2016 в 15:16

Вы можете преобразовать свой код в анонимную функцию:

$updatePage = function($page) use ($db) {
    $stmt = $db->prepare('UPDATE members SET page = :page WHERE memberid = :memberid');
    $stmt->execute(array(':memberid' => $_SESSION['memberID'], ':page' => $page));
    $array = $stmt -> fetchAll(PDO::FETCH_ASSOC);
    $_SESSION["page"] = $page;
    header ('Location: memberpage.php?page=' . $_SESSION["page"]);
}

Затем, где вы хотите его использовать, просто вызовите функцию:

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]);
    }
}

Назначение функций в коде - уменьшить повторяющийся код ... мы могли бы сделать это намного лучше, используя класс и назначая ему объект db, а затем вызывая метод. Затем вы можете сделать гораздо больше со своим классом, попросив его выполнить тесты, поэтому, если вы тестируете изменения, вы изменяете его только в одном месте. Это действительно зависит от остальной части вашего кода, и мы все делаем предположения на основе добавленного вами небольшого фрагмента. По сути, это будет ваш контроллер.

Практическое правило: если вы пишете один и тот же фрагмент кода дважды, сделайте его функцией. Вы никогда не знаете, нужно ли вам изменить бизнес-логику вокруг него (foreach vs if vs switch), но, по крайней мере, действие останется прежним, и вам не нужно будет проводить рефакторинг столько.

1
R. Chappell 8 Сен 2016 в 15:40

Мое предложение было бы следующим:

 // 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 кнопок.

В отличие от ответа Марка, этот не учитывает, что у вас есть более двух кнопок, но его можно адаптировать с помощью предложений его ответа.

0
Jonnix 8 Сен 2016 в 15:22