У меня есть несколько операторов 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"]);
}
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>
Используйте переменные переменные в цикле 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"]);
}
}
}
Ключи массива просты - это просто строки:
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)
^^
Вы можете преобразовать свой код в анонимную функцию:
$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
), но, по крайней мере, действие останется прежним, и вам не нужно будет проводить рефакторинг столько.
Мое предложение было бы следующим:
// 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 кнопок.
В отличие от ответа Марка, этот не учитывает, что у вас есть более двух кнопок, но его можно адаптировать с помощью предложений его ответа.
Похожие вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.