HTML, созданный PHP, создается из последовательности

#php #html #fancybox

#php #HTML #fancybox

Вопрос:

У меня есть PHP-файл, который выводит некоторый HTML.

Для простоты настройки у меня есть second PHP-файл, который включен в first PHP-файл. Этот включенный файл просто содержит определение массива следующим образом:

 <?
$myArray = array("key1"=>"value 1","key2"=>"value 2","key3"=>"value 3");
?>
 

В моем первом PHP-файле у меня есть следующее

 <? include("second.php"); ?>

<label>Select here:
<select id='mySelect'>
<? foreach ($myArray as $keyString=>$valueString) { ?>
    <option value='<?= $keyString; ?>'><?= $valueString; ?></option>
<? } ?>
</select>
</label>
 

Однако вывод HTML генерируется следующим образом:

 <label>Select here:
<select id='mySelect'>
</select>
<option value='key1'>value 1</option>
<option value='key2'>value 2</option>
<option value='key3'>value 3</option>
</label>
 

который отображается как пустой выпадающий список выбора с текстом параметров, показанных под ним!

Я уверен, что это что-то глупое и простое, поскольку я уверен, что делал это много раз раньше без проблем…


[Обновление]

После расследования выясняется, что это происходит только тогда, когда я отображаю страницу first PHP в FancyBox — когда я загружаю ее напрямую, параметры включаются в <select> , как и следовало ожидать.

FancyBox открывается с помощью JavaScript через событие onClick изображения следующим образом (изображение находится на фоновой странице, на которой открывается FancyBox, оно не является частью first.php или second.php ):

 <img src="myImage.png" alt="my image" onClick="openFirstPHP();">
 

в моем JavaScript у меня есть (в first.js который включен first.php с обычными <SCRIPT> тегами):

 function openFirstPHP() {
    $.fancybox({
        href: "/first.php",
        type: "ajax",
        afterShow: function() {
            // do some setting of some radio buttons' states - which works fine
        }
    });
}
 

Для информации, причина, по которой я вызываю first.php этот способ, а не в iFrame или что-то еще, заключается в том, что он также взаимодействует с вызывающей страницей, и поэтому мне не нужно ссылаться на другой объект document (я думаю).

В основном все остальное работает без проблем first.php — чтение и настройки файлов cookie, взаимодействие с вызывающими переменными страницы PHP и т. Д. Единственное, что не работает, это вставка этих <options> тегов из последовательности с <select> тегами.

Комментарии:

1. Какую версию PHP вы используете?

2. Это практически невозможно 🙂 Все должно работать так, как ожидалось. Используете ли вы какой-либо сложный кэш или специальную конфигурацию? Это необработанный вывод или что-то, что вы видите в console своем браузере? Смотрите Выполнение теста, он отлично работает во всех версиях php… 3v4l.org/mHc2r

3. Я согласен.. вот почему я так озадачен этим. Это то, что я вижу в браузере и с помощью Firefox developer inspector. Никакого сложного кэша или конфигурации, и я делаю то же самое во многих других PHP-скриптах на том же сервере. Это действительно озадачивает меня.

4. Ооооочень …. может быть, я что-то нашел. Эта проблема возникает только тогда, когда first страница загружается в оверлей fancyBox — загрузка страницы напрямую работает, поэтому процесс загрузки fancyBox, похоже, сбивает с толку…

5. @FatMonk Это fancyBox ? Если это так, и проблема возникает только с ним, вам следует добавить фрагмент, который вы используете для его вызова, и тег fancybox в вопросе. Редактировать: я не понимаю, как это может повлиять на содержимое.

Ответ №1:

Вы написали for цикл, но вы обработали его как foreach цикл.

Это должно сработать:

 <? foreach ($myArray as $keyString=>$valueString) { ?>
    <option value='<?= $keyString; ?>'><?= $valueString; ?></option>
<? } ?>
 

Комментарии:

1. Реальный вопрос должен заключаться в том, как OP вообще получил какой-либо вывод. Этот код является синтаксической ошибкой и должен был умереть с unexpected 'as' (T_AS) фатальной ошибкой синтаксического анализа

2. Извините, это опечатка в вопросе.. это был, конечно, foreach …

Ответ №2:

Измените свой цикл с ‘for’ на ‘foreach’.

Комментарии:

1. извините, это была опечатка.

Ответ №3:

Попробуйте это:

 <?php include_once("second.php");
 ?>

<label>Select here:
<select id='mySelect'>
<?php foreach ($myArray as $keyString=>$valueString) { ?>
    <option value='<?php echo $keyString; ?>'><?php echo $valueString; ?></option>
<?php } ?>
</select>
</label>
 

Ответ №4:

Это оказалось странным, вызванным опечаткой в моей HTML-разметке, а не проблемой с PHP или генерацией разметки вне последовательности.

В моем вступительном <select> заявлении было отклонение / . т.е.

 <select id='mySelect' />.
 

Поскольку браузеры делают все возможное, чтобы разобраться в искаженном HTML, при просмотре в инспекторах <select> сразу же последовал </select> затем мои параметры, и закрытие </select> из моего кода полностью отбрасывалось, поэтому <option> операторы находились за пределами выбора и поэтому игнорировались.

Как ни странно, это происходило только при вызове внутри FancBoxy, при прямом вызове страницы она работала без проблем!

Удаление неправильно размещенного / в <select> инструкции openeing полностью решило проблему.