Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > проблема совместимости браузеров


Автор: Ravanger 6.7.2007, 15:20
такая проблема, есть кусок скрипта

Код

                                    foreach ($_POST as $key => $val)
            {
                if (is_array($_POST[$key]))
                {
                    $_POST[$key] = implode(",", $_POST[$key]);
                    $_POST[$key] = str_replace(",-", "", $_POST[$key]);
                    //$_POST[$key] = str_replace(",,", ",", $_POST[$key]);
                }
            }

проблема такая, в IE обрабатывается нормально и выполняет то, что что от него требуется, а вот опера и фф не распознают $_POST[$key] как массив

подскажите что с этим делать, может сталкивался кто

Автор: SelenIT 6.7.2007, 15:39
Ravanger, давайте так... Вы очень быстро прочитаете http://phpfaq.ru/na_tanke и так же быстро исправите предыдущий пост на реальное описание проблемы: что у Вас за форма в HTML, как Вы ее отправляете из каждого браузера и какие данные в результате этого попадают в скрипт в каждом случае. И заодно попросите модераторов перенести этот вопрос в более подходящий раздел форума.

А этого вопроса мы будем считать, что не видели;).

Автор: vintyara 6.7.2007, 16:05
Ravanger, а у тя опера и фф каких верисй  smile ?

Автор: Ravanger 6.7.2007, 20:07
Цитата

Вы очень быстро прочитаете это и так же быстро исправите предыдущий пост

"это"  я уже читал, обьясняю, есть форма состоящяя из много го кол-ва полей нас интересует несколько <select> с одним именем в котором n <option>, селесты добавляются яваскриптом по мере надобности, дальше, массив преобразовуется в строку и пишется в базу данных одним полем... так вот, это все прекрасно работает в IE, начал тестить на опере в условие, 
Код

if (is_array($_POST[$key]))
 
скрипт не попадает (проверял) поменял условие на 
Код

if (!is_array($_POST[$key]))

 
и получил ошибку 

Код

Warning: implode() [function.implode]: Bad arguments. 

внимание вопрос, почему?

да, кстати, в <select> есть дефолт <option value="-">-</option>, который в базу писатся не должен, отсюда и обработка функцией str_replace()
Цитата

а у тя опера и фф каких верисй

opera 9я, фф не помню

Автор: teroni 6.7.2007, 20:36
Что-то я не пойму, почему у Вас этот селект должен передаваться массивом?
Это что-то вроде
Код

<select multiple="multiple" name="sel[]">
?

Автор: Ravanger 6.7.2007, 21:17
teroni, именно

только не мультиплай, а просто несколько селектов имеют одинаковые имена

Автор: Alukard 6.7.2007, 21:43
Впринципе, что вы вцепились в браузеры...конечно странно что IE выполняет а остальные нет, но PHP является серверным и поэтому не зависит от браузера....

Могу дать совет использовать массив $_REQUEST вместо $_POST , в нем все переменные есть!
И желательно посмотреть HTML код странички после выполнения PHP скрипта для определения проблемы...


Да, только что заметил...вы что используете массив $_POST как свой локальный напрямую записывая туда собственные переменные из select ? Если да, то это глупо, создайте собственный массив и оперируйте с ним!

Автор: Ravanger 6.7.2007, 21:52
Цитата

Да, только что заметил...вы что используете массив $_POST как свой локальный напрямую записывая туда собственные переменные из select ? Если да, то это глупо, создайте собственный массив и оперируйте с ним!


в силу определенных причин, это не глупо

Цитата

Впринципе, что вы вцепились в браузеры...конечно странно что IE выполняет а остальные нет, но PHP является серверным и поэтому не зависит от браузера....


это я знаю, но возвращают результаты обработки они по разному

просто почему то опера и фф говорят, ЧТО ЭТО НЕ МАССИВ!

Автор: teroni 6.7.2007, 22:00
Код

<select name="sel[]">
<option value="a">a</option>
<option value="b">b</option>
<option value="c">c</option>
</select>
<select name="sel[]">
<option value="d">d</option>
<option value="e">e</option>
<option value="f">f</option>
</select>
Так, что ли? Вы покажете хмтл этого селекта или продолжать угадывать?
З.Ы. И что мешает посмотреть
Код

print_r($_POST['sel']);

Если они в ИЕ, ФФ и Моззиле отличаются - значит какой-то кривой хтмл у отсылающей странички.

Автор: SelenIT 7.7.2007, 01:12
Цитата(Ravanger @  6.7.2007,  20:07 Найти цитируемый пост)
селесты добавляются яваскриптом по мере надобности, дальше, массив преобразовуется в строку и пишется в базу данных одним полем...

Что мешает формировать эту строку на клиенте яваскриптом же и одним полем посылать? Но вообще, как правило, сама идея записи массива "одним полем" говорит об ошибке в проектировании базы...

Цитата(Ravanger @  6.7.2007,  21:17 Найти цитируемый пост)
просто несколько селектов имеют одинаковые имена

С квадратными скобками, надеюсь?

Цитата(Alukard @  6.7.2007,  21:43 Найти цитируемый пост)
массив $_REQUEST вместо $_POST , в нем все переменные есть!

100% это ни при чем. А вот var_dump($_POST) сделать не помешает.

Цитата(Ravanger @  6.7.2007,  21:52 Найти цитируемый пост)
возвращают результаты обработки они по разному

Обработки чего и где?

Цитата(Ravanger @  6.7.2007,  21:52 Найти цитируемый пост)
почему то опера и фф говорят, ЧТО ЭТО НЕ МАССИВ!

Вообще-то, они дело говорят. Чем бы ЭТО ни было, массивом PHP оно может стать лишь в принимающем PHP-скрипте - если передать ЭТО данному скрипту в правильном формате. Очевидно, браузеры просто отправляют ЭТО в разном формате - а возможно, даже формируют ЭТО по-разному. И PHP тут, действительно, абсолютно ни при чем...

Цитата(Ravanger @  6.7.2007,  20:07 Найти цитируемый пост)
"это"  я уже читал

В том FAQе есть ссылки на плагины для просмотра HTTP-заголовков. Вы ставили их на свои браузеры и смотрели, что у Вас откуда и куда пересылается?

Автор: -=Ustas=- 7.7.2007, 11:31
Цитата(Ravanger @  6.7.2007,  21:52 Найти цитируемый пост)
просто почему то опера и фф говорят, ЧТО ЭТО НЕ МАССИВ! 

Ravanger,  прекрати говорить о браузерах, когда говоришь о массивах в PHP!!!

Автор: ilyalyu 8.7.2007, 10:58
Очевидно, IE, обнаружив одинаковые имена у тэгов, автоматически добавляет к ним квадратрые скобочки "[]" (т.е. "name[]" вместо "name"), а FF и Opera этого не делают (можно послать форму с помощью метода GET, сделать var_dump переменной $_SERVER - там где-то должен быть текст запроса - и посмотреть так ли это). Что касается PHP, то, насколько я понимаю, он когда видит имя с квадратными скобками ("name[]=value1&amp;name[]=value2"), то создает масив "name" и добавляет в него элемент "value" (соответствующий код на PHP выглядел бы так "$_GET['name'][] = 'value1'; $_GET['name'][] = 'value2';"). Если же он встречает несколько одинаковых имен без скобок ("name=value1&amp;name=value2"), то он просто пишет новое значение поверх старого (код на PHP "$_GET['name'] = 'value1'; $_GET['name'] = 'value2';"). Мораль, думаю, такая: если в одной форме используются одинаковые имена, необходимо добавлять квадратные скобки самому и не надеятся на браузер.

Автор: Ravanger 8.7.2007, 11:27
Цитата

Мораль, думаю, такая: если в одной форме используются одинаковые имена, необходимо добавлять квадратные скобки самому и не надеятся на браузер.


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

Автор: WIPS 9.7.2007, 01:35
Ravanger, я еще наблюдал одну интересныую багофичу FF, когда он не отправлял из формы данные инпутов, кот. были сгенерированы JS. Отправлял только то, что было в форме при загрузке страницы. 

Но... 
 было это давно, т.е. FF был наверное версии так 1.0.x.x.x, и сейчас дела могут обстоять по другому.

Однако...
 я до сих пор страхуюсь и все инпуты, кот. мне могут пригодиться генерирую заранее на сервере вместе со страницей, а JS их только прячет/показывает.

Кстати...
 как вела себя в этой ситуации Опера, к сожалению не помню...

Автор: SelenIT 9.7.2007, 01:44
WIPS, а эти инпуты, часом, не в таблицу добавлялись?  smile 

Автор: WIPS 9.7.2007, 02:05
SelenIT, к сожалению не помню, но зная себя как верстальщика - скорее всего, что в таблицу smile. Хочешь сказать, что надо было не забывать генерить что-нибудь типа <tbody>?

Автор: SelenIT 9.7.2007, 02:24
Угу;). Это во-первых, а во-вторых, "правильные" браузеры очень не любят <form> между <tr> и <td> и тому подобные формы издевательства над DOM. При корректной вложенности тегов все, как правило, нормально добавляется...

Автор: Ravanger 10.7.2007, 11:23
скрипт добавляющий селекты:
Код

function essence_field_add(my_data)
{
    //alert ("ll="+document.getElementById(my_data).parentNode.innerHTML);
    document.getElementById(my_data).parentNode.innerHTML = document.getElementById(my_data).parentNode.innerHTML + "<table border=0>" + document.getElementById(my_data).innerHTML + "</table>";
}

html форма
Код

<tr>
 <td colspan="3" id=f{property_id_essence} bgcolor="#ffffff">
  <table id=ff{property_id_essence} width=930 align="center" border=0>
   <tr>
  <td class=tb align=right width="292">{property_name_essence} : </td>
  <td class=t nowrap width=400>
    <select class=form_bord style="width: 345px;" name='property_{property_id_essence}[]' id='property_{property_id_essence}'>
        {ess_list}
    </select> 
    <input type="button" value="+" onClick="essence_field_add('ff{property_id_essence}');" class="form_bord" style="width: 20px;">
    <input type="button" value="..." onClick="essence_field_edit(this, {property_essence_value});" class="form_bord" style="width: 20px;">
  </td>
  <td class=t width=230><font style="font-size : 9px;color:#419DF3">{property_group_essence} ({property_id_essence})</font></td>
  </tr>
  </table>
  </td>

Автор: ilyalyu 10.7.2007, 23:18
чтой-то я не понимаю, что означают фигурные скобочки. в любом случае, полезно послать форму методом GET и посмотреть какая query string передается из разных браузеров

Автор: SelenIT 11.7.2007, 01:30
Фигурные скобочки - очевидно, какой-то темплейтный движок, к делу не относится.

А вот то, что у элементов формы одновременно есть name со скобками и id без таковых - это настораживает. Если обращений к ним по id-ам нет (по крайней мере, в приведенном фрагменте кода не видать) я бы id-ы вообще выкинул - во избежание неоднозначности...

Автор: Ravanger 11.7.2007, 09:18
Цитата

я бы id-ы вообще выкинул - во избежание неоднозначности...


по этому id в базе поля создаются, for example: "property_307"

Автор: SelenIT 11.7.2007, 09:29
Ну и пусть себе создаются - насколько я понимаю, это происходит до генерации формы, в HTML-то их зачем выпихивать?

А на крайняк (если я чего-то недопонимаю;) пусть создаются по name, делов-то... два символа отбросить...

Автор: Ravanger 11.7.2007, 09:48
Цитата

чтой-то я не понимаю, что означают фигурные скобочки.


это PEAR'овский шаблонизатор

Автор: sTa1kEr 11.7.2007, 10:05
А где сам тэг FORM? И еще лучше добовлять новые элементы через DOM, а не innerHTML.

Автор: Ravanger 11.7.2007, 10:58
Цитата

И еще лучше добовлять новые элементы через DOM, а не innerHTML.


а как это сделать, не сталкивался никогда...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)