Индекс PHP $_POST не определен в Firefox и IE, работает в Chrome

У меня есть два файла: главная страница scada.php и подстраница site.php. Scada.php содержит такие ссылки:

<FORM action="site.php" method="post">
<li><td class="normal"><input type="image" name="sitename" 
value="Dublin" src="radiotower.jpg" alt="Dublin" title="Dublin"/>
Dublin
</td></li>
</form>

Site.php получает доступ к имени сайта здесь:

<?php
 $site = $_POST["sitename"];
 echo "<title id='title'>".$site."</title>";
?>

Затем он извлекает его с помощью JS для отображения на странице и использования в запросе к базе данных:

<script>
var site = document.getElementById("title").innerHTML;
document.getElementById("alert").innerHTML = "<h2>"+site+"</h2>";
</script>

Я проверил длину строки имени сайта, чтобы убедиться, что она включает только символы имени («Дублин»), а не теги заголовка HTML, и длина 6 символов правильная.

Это отлично работает в Chrome; все гладко, работает как положено. В IE и Firefox он выдает ошибку, в которой говорится, что «имя сайта» является неопределенным индексом. Я запустил vardump для глобальных переменных в site.php, и в результате Chrome обнаружил 3 переменные (sitename_x, sitename_y и sitename). Firefox и IE показывают только два (sitename_x и sitename_y), а имя сайта отсутствует.

Я искал проблемы $_POST, которые возникают только в Firefox и IE, и не нашел ничего полезного. Кто-то упомянул, что кнопка отправки не нажимается, но это определенно не проблема, потому что ЕДИНСТВЕННЫЙ способ взаимодействия со страницей — это нажать кнопку ввода. Куда, черт возьми, затерялось переменное имя сайта??

РЕДАКТИРОВАТЬ: сначала я был немного неясен. Форма содержит несколько входных данных, поэтому это более точно:

<FORM action="site.php" method="post">
<li><td class="normal"><input type="image" name="sitename" value="Dublin"
src="radiotower.jpg" alt="Dublin" title="Dublin"/>
Dublin
</td></li>
<li><td class="normal"><input type="image" name="sitename" value="Temple" 
src="radiotower.jpg" alt="Temple" title="Temple"/>
Temple
</td></li>
</FORM>

person Katherine Skipper    schedule 28.02.2013    source источник
comment
Я не думаю, что они когда-либо включали значение, на ввод формы изображения нельзя полагаться таким образом. Упростите себе жизнь, добавьте в форму ‹input type=hidden name=site value=Dublin/› и используйте эту переменную ($_POST['site']) :)   -  person niaccurshi    schedule 28.02.2013
comment
Согласен с niaccurshi - поведение Chrome на самом деле не соответствует стандартам. См. этот пост   -  person Kristen Waite    schedule 28.02.2013


Ответы (2)


Ввод формы изображения должен возвращать только координаты x и y, по которым он был нажат. Я бы сказал, что Chrome здесь ошибается и не следует стандартам, возвращая пару имени и значения, а также координаты.

Сделайте отдельный скрытый ввод для имени сайта, и все будет хорошо, например:

<form>
  <input type="hidden" name="sitename" value="Dublin" />
  <input type="image" name="siteimg" src="radiotower.jpg" />
</form>

РЕДАКТИРОВАТЬ: если использование jQuery не является проблемой, я думаю, вам будет лучше использовать такой подход

<form action="" method="post" id="form">
    <div><img src="radiotower.jpg" alt="Dublin" title="Dublin" class="location" /></div>
    <div><img src="radiotower.jpg" alt="Temple" title="Temple" class="location" /></div>
    <div><input type="hidden" name="sitename" id="sitename" value="" /></div>
</form>

<script>
$(function() {
    $('.location').click(function() {
        var site = $(this).attr('alt');
        $('#sitename').val(site);

        $('#form').submit();
    });
});
</script>

РЕДАКТИРОВАТЬ 2: добавьте это в свой HTML, чтобы включить jQuery:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

person Andy    schedule 28.02.2013
comment
Это работает для одного элемента, как у вас, но у меня на странице есть список из примерно 18 сайтов. Нужно ли для каждого создавать отдельную форму? Это кажется немного громоздким. - person Katherine Skipper; 28.02.2013
comment
Можете ли вы объяснить, чего именно вы пытаетесь достичь? Могу посоветовать более простое решение. РЕДАКТИРОВАТЬ: только что увидел ваше редактирование, голое со мной, и я отредактирую свой ответ - person Andy; 28.02.2013
comment
Scada.php — это, по сути, сетка изображений со связанными именами сайтов. Когда пользователь нажимает на один из них, он перенаправляет его на сайт site.php, который отображает данные, собранные с этого сайта (статус сайта — включен или выключен и т. д. и т. д.). В конце концов, основная сетка также будет взаимодействовать с базой данных, чтобы отображать проблемы сайта в реальном времени (например, она будет запрашивать новые данные и менять цвет окна отображения данного сайта на оранжевый в случае беспокойства или красный в случае проблемы). Я могу удалить radiotower.jpg, если это проблема; Я просто думаю, что это делает сетку более аккуратной и менее похожей на стену-текст. - person Katherine Skipper; 28.02.2013
comment
Хорошо, это выглядит более практично. У меня нет опыта работы с JQuery, поэтому два новых вопроса: нужна ли мне для этого библиотека JQuery? И как мне получить переменную #sitename в site.php? Большое спасибо за Вашу помощь! - person Katherine Skipper; 28.02.2013
comment
Вам нужно будет включить библиотеку jQuery. Да, это хорошая практика, чтобы получить это из CDN, чтобы ваши пользователи могли использовать кешированную версию, если она доступна, я включил фрагмент, который вам понадобится, чтобы добавить свой HTML-файл в мой ответ . Переменная sitename будет установлена ​​в массиве $_POST, потому что скрытое входное значение заполняется до отправки формы :) - person Andy; 28.02.2013
comment
Не волнуйтесь. Хотите принять ответ, если считаете, что он достаточно хорош? - person Andy; 28.02.2013

Угрюмый тип ввода должен быть text, если ожидаемое значение "Дублин" - Chrome может быть достаточно проницательным, чтобы распознать, что ввод на самом деле является текстом, тогда как FF и IE могут быть более доверчивыми и даже не пытаться установить переменную.

person Izzy    schedule 28.02.2013