Точно такой же HTML, почему он ведет себя по-другому? - PullRequest
2 голосов
/ 20 февраля 2012

У меня есть проблема, которую я действительно не могу понять, как ее решить. У меня есть 2 разные страницы одного и того же проекта. Это позволяет пользователям создавать форму и отправлять ее на другую веб-страницу. И есть две версии, одна из которых просто запрашивает типы полей, имена и значения, а другая позволяет пользователям вводить полную форму вручную.

Так что, как сказал мой вопрос, в первом случае он работает отлично, а во втором случае возвращается на ту же страницу, и это сводит меня с ума! Я поставлю код в конце, но теперь шаги, чтобы воспроизвести ошибку. Пока это страница, размещенная бесплатно, поскольку я использую ее для целей тестирования:

  1. Перейти к http://saveyourself.vacau.com/form/
  2. Поместите это в поля (на самом деле это тестовый аккаунт для этой страницы):

    • Страница: http://newfutureuniversity.org/
    • Метод: «Пост»
    • Имя 1: «Пользователь»
    • Значение 1: «Пользователь»
    • Тип 1: «текст»
    • Имя 2: «Пропуск»
    • Значение 2: «Пароль»
    • Тип 3: «Пароль»
    • Имя 3: «Логин»
    • Значение 3: «1»
    • Тип 3: «Скрытый».
  3. Нажмите «Показать форму», и форма будет отображена

  4. Теперь посмотрите исходный код страницы и скопируйте из "<form...>" в "</form>"
  5. Перейдите на эту страницу http://saveyourself.vacau.com/form/manual/ и вставьте ее туда.
  6. Нажмите «Показать форму», и вы получите ТОЧНО ту же страницу, что и после шага 3 (проверьте html, он на 100% такой же, единственное изменение - это адрес, /manual/).

Теперь вот трюк. Несмотря на то, что обе страницы имеют одинаковый html, если вы нажмете кнопку «Отправить форму» после шага 3, вы попадете на новую страницу, но если вы нажмете кнопку «Отправить форму» после шага 6 (в / form / manual /) эта страница обновляется, а вставленная вами форма удаляется. Как это возможно? Насколько я знаю, здесь не задействован PHP, так как при отображении формы это просто HTML, и новая страница должна обрабатывать весь PHP. Так что, если он получает ту же форму, он должен ответить так же, верно? На второй странице не используется "$ _SERVER ['HTTP_REFERER'];" (откуда посетитель), и ничего подобного. Также есть 0 javascript. Я публикую сейчас HTML на случай, если это поможет, и некоторые из PHP (не помещать слишком много кода).

Итак, вопрос в том, Кто-нибудь имеет представление о том, почему вторая форма не работает?

Большое вам спасибо.

HTML-код (он одинаков на обеих страницах после шага 3 или 6):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
        <title>Send form</title>
        <meta content="text/html; charset=utf-8" http-equiv="content-type" />
</head>
<body style="background: #DDFFFF; width: 80%; height:100%; margin: 0 10% 0 10%; text-align: center;">
<h1>Send form</h1>

    <form action="http://newfutureuniversity.org/" method="POST">
        Web page: http://newfutureuniversity.org/<br>
        Method: POST<br><br>
        <table style="margin-left: auto; margin-right: auto;">
                            <tr>
                <td style="text-align: right;">
                User:</td><td><input type='text' name='User' value=''></td>
                </tr>
                                <tr>
                <td style="text-align: right;">
                Pass:</td><td><input type='password' name='Pass' value=''></td>
                </tr>
                                <tr>
                <td style="text-align: right;">
                Login:</td><td><input type='text' name='Login' value='1'></td>
                </tr>
                        </table><br>
        <input type="submit" value="Send form">
    </form>
</body>
</html>

Упрощенный код PHP со страницы работы (http://saveyourself.vacau.com/form/):

//Header, body and others go before of this
<?php
if ($_POST['sent']==1&&empty($_POST['source'])) //If form is submited
    {
    $i = 1;
    ?>
    <form action="<?php echo $_POST['page']; ?>" method="<?php echo $_POST['method']; ?>">
        Web page: <?php echo $_POST['page']; ?><br>
        Method: <?php echo $_POST['method']; ?><br><br>
        <table style="margin-left: auto; margin-right: auto;">
            <?php 
            while (!empty($_POST['nam'.$i]))
                { ?>
                <tr>
                <td style="text-align: right;">
                <?php echo $_POST['nam'.$i].":</td><td><input type='".$_POST['typ'.$i]."' name='".$_POST['nam'.$i]."' value='".$_POST['val'.$i]; ?>'></td>
                </tr>
                <?php
                $i++;
                }
            ?>
        </table><br>
        <input type="submit" value="Send form">
    </form>
<?php
    }


elseif (!empty($_POST['source']))   //If user just wants to create a form and see the code
    {
    //I think this bit is irrelevant codereview, so I skipped it.
    }


else        //Body of the first page shown
    { ?>
<form method="post">
    Web page: <input type="text" name="page"> 
    Method to send: <select name="method"><option value="POST">Post</option><option value="GET">Get</option></select><br>

    <table style="border: 1px solid #AAA; margin-left: auto; margin-right: auto;">
        <tr>
            <td>Number</td>
            <td>Name</td>
            <td>Value</td>
            <td>Type</td>
        </tr>
<?php for ($i = 1; $i <= 10; $i++)
    { ?>
        <tr>
            <td><?php echo $i; ?></td>
            <td><input type="text" name="nam<?php echo $i; ?>"></td>
            <td><input type="text" name="val<?php echo $i; ?>"></td>
            <td>
            <select name="typ<?php echo $i; ?>">
                <option value="text">Text</option>
                <option value="password">Password</option>
                <option value="radio">Radio</option>
                <option value="checkbox">Checkbox</option>
                <option value="hidden">Hidden</option>
                <option value="reset">Reset</option>
                <option value="submit">Submit</option>
            </select>
            </td>
        </tr>
    <?php } ?>
    </table><br>

    Don't worry, a submit button is automatically added.<br>
    <input type="hidden" name="sent" value="1">
    <input type="submit" value="Show form">
    <input type="submit" name="source" value="Form code">
    </form><?php } ?>
</body>
</html>

Полный код PHP со страницы не работает (http://saveyourself.vacau.com/form/manual/):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Send form</title>
    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
</head>
<body style="background: #DDFFFF; width: 80%; height:100%; margin: 0 10% 0 10%; text-align: center;">
<h1>Send form</h1>

<?php
if ($_POST['sentbrr']==1)   //If form is submited
    echo stripslashes($_POST['code']);

else    //First time
    { ?>
    <form method="post">
    Enter the code for the form manually<br>
    <textarea name="code" style="width: 100%; min-height: 450px;"></textarea><br>
    <input type="hidden" name="sentbrr" value="1">
    <input type="submit" value="Show form">
    </form>
    <?php
    } ?>

</body>
</html>

Ответы [ 2 ]

6 голосов
/ 20 февраля 2012

Если вы посмотрите на вторую (не работающую) страницу, у вас есть:

<form method="post">

без атрибута action="". Поэтому ваша форма не знает, куда ее отправлять.

2 голосов
/ 21 февраля 2012

Краткий ответ: Это ошибка браузера (ошибка?).

Длинный ответ: Поведение варьируется в разных браузерах. После тестирования на IE9, Firefox и Safari эта проблема, похоже, является ошибкой веб-набора. Эта гипотеза также подтверждается многочисленными проблемами «формы / действия», о которых сообщалось на crbug.com и bugs.webkit.org


Исследование:

Кажется, Кипрос прав, хотя ответ не так очевиден.

Если вы перейдете на неисправную страницу (ту, которая не отправляет правильное «URL запроса» при отправке формы) и попытаетесь проверить ее (например, с помощью «Chrome Developer Tools»), вы увидите, что форма « атрибут действия "действительно пустой.

Это отличается от представления исходного кода, которое показывает, что атрибут установлен правильно!

Кажется, PHP (или браузер?) Защищает нас, удаляя поле "action" из фактического DOM, хотя я нигде не могу найти причину.

Чтобы убедиться в этом, я изменил код на:

echo '<form action="http://newfutureuniversity.org/" method="POST">';
echo $_POST['code'];

.. и вставил в остальную часть формы. Это хорошо. Кажется, это не происходит от "полосатых ударов". Вы также можете просто передать «действие» как другой ввод формы (вместо «кода»), и это также просто работает:

echo '<form action="'.$_POST['action'].'" method="POST">';
echo stripcslashes($_POST['code']);

После того, как я запустил тот же сценарий в IE9 - «проблема», кажется, не существует! Это заставляет меня думать, что виновником является безопасность браузера. Предполагая, что это ошибка в chrome / web-kit, я открыл ошибку в crbug.com , обновления будут размещены здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...