Это беспокоило меня, и я не могу понять, как обойти это. Скажем, у меня есть index.php, который включает другую страницу dostuff.php, которая является просто большой функцией. На моей странице указателя у меня есть условие, которое вызывается кнопкой в форме:
—index.php —
<?php
include 'dostuff.php';
if (isset($_POST['test'])) {
test();
}
echo '<form id="test" method="post" action="'.htmlentities($_SERVER['PHP_SELF']).'">'.PHP_EOL;
echo '<button name="test" form="test" type="submit" value="test">Test</button>'.PHP_EOL;
echo '</form>'.PHP_EOL;
В моей включенной функции у меня есть другая форма, которая вызывает другое условие внутри функции.
—dostuff.php —
<?php
function test() {
if (isset($_POST['dostuff'])) {
echo '<h1>Testing Do Stuff.</h1>';
}
echo '<form id="dostuff" method="post" action="'.htmlentities($_SERVER['PHP_SELF']).'">'.PHP_EOL;
echo '<button name="dostuff" form="dostuff" type="submit" value="dostuff">Do Stuff!</button>'.PHP_EOL;
echo '</form>'.PHP_EOL;
}
Когда я нажимаю кнопку на странице индекса, вызывается метод include, который заполняет страницу ее формой. Однако, когда я нажимаю кнопку в функции, форма исчезает, и условие никогда не выполняется.
Теперь, если я добавлю следующее на страницу индекса:
print "CONTENT_TYPE: " . $_SERVER['CONTENT_TYPE'] . "<br>";
$data = readfile('php://input');
$contents = file_get_contents('php://input');
print "<br>";
print "DATA: <pre>";
var_dump($contents);
var_dump($data);
var_dump($_POST);
print "</pre>";
Ясно, что кнопка формы вызывается как проверенная вызовом var_dump, но условие никогда не выполняется.
CONTENT_TYPE: application / x-www-form-urlencoded DoStuff = DoStuff ДАННЫЕ: строка (15) "dostuff = dostuff" int (15) массив (1) { [ "DoStuff"] => string (7) "dostuff"}
Я искал здесь и почти везде ответ на этот вопрос, но безрезультатно, поэтому мой вопрос: почему ничего не работает внутри условных выражений? Это кажется мне очень странным, поэтому я собрал все вместе, чтобы проверить.
Это просто чистая логика — будет намного понятнее, если вы будете использовать свои формы method="GET"
вместо POST.
Когда вы загружаете его в начале, вы нажимаете кнопку с именем «test», и у вас есть значение $ _POST [‘test’] при следующей загрузке.
Ваш код выглядит так в index.php:
if (isset($_POST['test'])) {
test();
}
поэтому, конечно, вызывается test (), и вы видите ваш HTML из dostuff.php.
Кнопка в dostuff.php называется «dostuff», поэтому, когда вы нажимаете эту кнопку, форма загружается снова со значением в $ _POST [‘dostuff’] » НО НЕТ ЗНАЧЕНИЯ В $_POST['test']
!! »
Еще раз ваша логика в верхней части index.php заключается в следующем:
if (isset($_POST['test'])) {
test();
}
и так как в $ _POST [‘test’] нет значения вашего test()
Функция никогда не вызывается, и вы никогда не увидите ожидаемой кнопки.
Действительно — измените свои формы на GET
(вам нужно будет использовать $ _GET или $ _REQUEST вместо $ _POST), чтобы вы могли точно видеть, что устанавливается каждый раз, не прибегая к чтению всех модных файлов, и я думаю, это будет действительно ясно.
Вопрос не изменился, см. Ниже, поскольку то, что я должен показать, не помещается в комментариях.
Если я нахожусь в index.php и я просматриваю свой источник, я получаю это:
<form id="test" method="get" action="/test/index.php">
<button name="test" form="test" type="submit" value="test">Test</button>
</form>
Если я нажму кнопку «Тест», то получу:
<form id="dostuff" method="get" action="/test/index.php">
<button name="dostuff" form="dostuff" type="submit" value="dostuff">Do Stuff!</button>
</form>
<form id="test" method="get" action="/test/index.php">
<button name="test" form="test" type="submit" value="test">Test</button>
</form>
Если я использую условие для вызова своей функции, я ничего не получаю обратно. Если я устраню условие на index.php и просто вызову test (); Я вернусь:
<form id="dostuff" method="get" action="/test/index.php">
<button name="dostuff" form="dostuff" type="submit" value="dostuff">Do Stuff!</button>
</form>
<form id="test" method="get" action="/test/index.php">
<button name="test" form="test" type="submit" value="test">Test</button>
</form>
Теперь, если я нажму «Do Stuff!» Я вернусь:
<h1>Testing Do Stuff.</h1>
<form id="dostuff" method="get" action="/test/index.php">
<button name="dostuff" form="dostuff" type="submit" value="dostuff">Do Stuff!</button>
</form>
<form id="test" method="get" action="/test/index.php">
<button name="test" form="test" type="submit" value="test">Test</button>
</form>
Итак, вопрос остается прежним. Почему это не работает?