2016-09-08 3 views
0

У меня есть несколько операторов if, которые почти делают одно и то же. Только число изменится. Я показал только две цифры ниже. Всегда будет хотя бы одна кнопка, но может быть до двадцати, поэтому я хотел бы знать, как я могу сделать это более кратким.Как я могу сделать эти инструкции PHP 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"]); 
} 
+0

Я бы предложил отражение, но я ничего не знаю о php, поэтому я не могу предоставить образец кода. – Gabriel

ответ

1

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

//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> 
+0

Ничего себе действительно крутой ответ, ты совершенно прав, чего я пытаюсь достичь. Спасибо, что так хорошо объяснили ваш код. Я собираюсь экспериментировать с этим и var vars, но это действительно приятно. Я не знал о in_array, поэтому я узнал что-то новое. – Buts

+0

Полностью работает, делает его очень простым в обслуживании, что очень удобно, так как это будет несколько сотен страниц. – Buts

+0

Рад, что это сработало! Проверьте мое обновление :) – Lynne

1

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

for($i = 1; $i <= 2; $i++) { 
    if (isset($_POST["button$i"]) etc.... 
          ^^ 

Для переменных, вы, вероятно, следует рассмотреть возможность сохранения тех, в массиве вместо пронумерованных ВАР:

if (isset($_POST["button$i"]) == $buttons[$i])) 

Вы МОЖЕТЕ использовать вар-вары, но это только делает код кошмаром для обслуживания позже:

+0

Спасибо за ответ. Я заинтригован возможностью переменной переменной. Пожалуйста, дайте дополнительную информацию о том, как этот метод может быть трудно поддерживать позже. – Buts

+1

он делает ОЧЕНЬ сложный для отладки код, потому что теперь, когда вы «смотрите» на varaible, вы смотрите не так. '$ temp' будет содержать только строку, и вам придется вручную искать переменную OTHER, в которую будет указывать $$ temp. var-vars почти всегда являются признаком плохого дизайна. –

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

Это зависит от другого кода. То есть весь блок, возможно, потребуется перейти в другое условие, проверяя, доступна ли хотя бы одна из двух кнопок.

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

+0

Всегда будет доступна хотя бы одна доступная кнопка, если это не имеет никакого значения, просто предоставив больше контекста. – Buts

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

    } 
} 

}

1

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

$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 против if против switch), но по крайней мере действие останется таким же, и вам не нужно будет реорганизовать столько.

Смежные вопросы