В чем порочность этого кода?
От: mibo Беларусь  
Дата: 02.04.04 14:25
Оценка:
PHP не может это выполнить.
Пожалуйста, подскажите в чем может быть проблема?
На вход подаю ассоциативный массив (может быть многомерный).

function html_decode(&$s) {
    if (is_array($s)) {
        foreach ($s as $key => $val)
            if (is_array($s[$key])) html_decode($s[$key]);
            else $s[$key] = html_entity_decode($val);
    } else $s = html_entity_decode($s);
}
Re: В чем порочность этого кода?
От: Аноним  
Дата: 02.04.04 15:05
Оценка:
Здравствуйте, mibo, Вы писали:

M>PHP не может это выполнить.

что значит не может??

function html_decode(&$s) {
    if (is_array($s)) {
        foreach ($s as $key => $val)
            if (is_array($s[$key])) html_decode($s[$key]);
            else $s[$key] = html_entity_decode($val);
    } else $s = html_entity_decode($s);
}

не знаю... уж очень он "пахнет"...
Re[2]: В чем порочность этого кода?
От: mibo Беларусь  
Дата: 02.04.04 15:38
Оценка:
Здравствуйте, Аноним, Вы писали:

M>>PHP не может это выполнить.

А>что значит не может??

Так и говорит ошибка скрипта. 500...
Re[3]: В чем порочность этого кода?
От: Zmei-Gorin Россия  
Дата: 02.04.04 16:43
Оценка:
Здравствуйте, mibo, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


M>>>PHP не может это выполнить.

А>>что значит не может??

M>Так и говорит ошибка скрипта. 500...


Ы... а в логах что??

ЗЫ: а с чего это я анонимом стал?...
Re[4]: В чем порочность этого кода?
От: mibo Беларусь  
Дата: 02.04.04 18:45
Оценка:
Здравствуйте, Zmei-Gorin, Вы писали:

ZG>Ы... а в логах что??



[Fri Apr 02 21:40:35 2004] [error] [client 192.168.17.200] Premature end of script headers: c:/php/php.exe
[Fri Apr 02 21:40:35 2004] [error] [client 192.168.17.200] File 'c:\mysql\\share\charsets\?.conf' not found (Errcode: 2)

[Fri Apr 02 21:40:35 2004] [error] [client 192.168.17.200] Character set '#14' is not a compiled character set and is not specified in the 'c:\mysql\\share\charsets\Index' file


Просто даже не знаю как интерпретировать...
Re: В чем порочность этого кода?
От: Grelkin  
Дата: 03.04.04 04:59
Оценка:
Здравствуйте, mibo, Вы писали:

M>PHP не может это выполнить.

M>Пожалуйста, подскажите в чем может быть проблема?
M>На вход подаю ассоциативный массив (может быть многомерный).

M>
M>function html_decode(&$s) {
M>    if (is_array($s)) {
M>        foreach ($s as $key => $val)
M>            if (is_array($s[$key])) html_decode($s[$key]);
M>            else $s[$key] = html_entity_decode($val);
M>    } else $s = html_entity_decode($s);
M>}
M>


Возможно причина в следующем. В какой-то момент(возможно в начальный) в функцию html_decode передается NULL или false или что там еще, короче константа...

В пхп(4.х.у) по ссылке константу передавать/возвращать нельзя, а если передается/возвращается, то иногда возникает ошибка Premature ends of headers.
Re[5]: В чем порочность этого кода?
От: Zmei-Gorin Россия  
Дата: 03.04.04 12:24
Оценка:
Здравствуйте, mibo, Вы писали:

M>Здравствуйте, Zmei-Gorin, Вы писали:


ZG>>Ы... а в логах что??



M>
M>[Fri Apr 02 21:40:35 2004] [error] [client 192.168.17.200] Premature end of script headers: c:/php/php.exe
M>[Fri Apr 02 21:40:35 2004] [error] [client 192.168.17.200] File 'c:\mysql\\share\charsets\?.conf' not found (Errcode: 2)

M>[Fri Apr 02 21:40:35 2004] [error] [client 192.168.17.200] Character set '#14' is not a compiled character set and is not specified in the 'c:\mysql\\share\charsets\Index' file
M>


M>Просто даже не знаю как интерпретировать...

Таак... Сервер какой? апач? версия PHP какая? PHP установлен как CGI? MySQL установлена?

Несколько советов: поставьте PHP 4.3.5 (последнюю версию); поставьте PHP как SAPI-модуль.
Re[6]: В чем порочность этого кода?
От: mibo Беларусь  
Дата: 03.04.04 13:36
Оценка:
Здравствуйте, Zmei-Gorin, Вы писали:

ZG>Таак... Сервер какой? апач? версия PHP какая? PHP установлен как CGI? MySQL установлена?


ZG>Несколько советов: поставьте PHP 4.3.5 (последнюю версию); поставьте PHP как SAPI-модуль.


Сервер апач 1.pi, php 4.3.1 SAPI.
Вряд ли это из-за обеспечения.
А MySQL здесь причем?

Я вот немножго погонял этот код. Он падает когда значение переменной нет. Т.е. пустое значение. Не знаю как по другому сказать, типов то нет...
Причем падает вроде функция php, та которая декодирует.
В общем если справлюсь напишу ответ.
Re[7]: В чем порочность этого кода?
От: Zmei-Gorin Россия  
Дата: 03.04.04 13:52
Оценка:
Здравствуйте, mibo, Вы писали:

M>Сервер апач 1.pi, php 4.3.1 SAPI.

SAPI??? не похоже, а если SAPI, то при чем тут php.exe?
M>Вряд ли это из-за обеспечения.
А из-за чего? ИМХО какой-то глюк PHP
M>А MySQL здесь причем?
А Вы читали записи лога, которые приводили? Он на mysql жалуется... точнее на charset.
Re[8]: Ответ на сообщение Змея Горыныча...
От: mibo Беларусь  
Дата: 03.04.04 14:14
Оценка:
Здравствуйте, Zmei-Gorin, Вы писали:

ZG>Здравствуйте, mibo, Вы писали:


M>>Сервер апач 1.pi, php 4.3.1 SAPI.

ZG>SAPI??? не похоже, а если SAPI, то при чем тут php.exe?
При чем здесь php.exe не знаю. Но установлен php как модуль.
M>>Вряд ли это из-за обеспечения.
ZG>А из-за чего? ИМХО какой-то глюк PHP
Может конечно и так.
M>>А MySQL здесь причем?
ZG>А Вы читали записи лога, которые приводили? Он на mysql жалуется... точнее на charset.
Это все сообщения которые я нашел в логах. Все они связаны именно с исполнением этого скрипта.
Про MySQL здесь мне тоже не ясно.
В скрипте кроме установления постоянного соединения с сервером, больше ничего про MySQL нет.
Ошибка именно в этой функции. — комментирую одну строку — работает. Нет — не работает.
Строка где происходит декодирование.
Re[9]: Ответ на сообщение Змея Горыныча...
От: Zmei-Gorin Россия  
Дата: 03.04.04 14:35
Оценка:
Здравствуйте, mibo, Вы писали:
M>Это все сообщения которые я нашел в логах. Все они связаны именно с исполнением этого скрипта.
M>Про MySQL здесь мне тоже не ясно.
M>В скрипте кроме установления постоянного соединения с сервером, больше ничего про MySQL нет.
M>Ошибка именно в этой функции. — комментирую одну строку — работает. Нет — не работает.
M>Строка где происходит декодирование.

Да, у меня происходит то же самое.
PHP падает и утаскивает за собой Апач при выпотнении такого кода:


<?php
function test(&$a){
  $a=html_entities_decode($a);
}
test($undefined_var);
?>



Судя по всему, ошибка в PHP...
Re[10]: Ответ на сообщение Змея Горыныча...
От: Zmei-Gorin Россия  
Дата: 03.04.04 14:40
Оценка:
ZG>Судя по всему, ошибка в PHP...
Поискал на bugs.php.net — целый букет багов... Но все вроде в основном закрытые.
Обновите PHP.
Re: В чем порочность этого кода?
От: DSD Россия http://911.ru/cv
Дата: 04.04.04 00:28
Оценка:
Здравствуйте, mibo, Вы писали:

M>PHP не может это выполнить.

M>Пожалуйста, подскажите в чем может быть проблема?
M>На вход подаю ассоциативный массив (может быть многомерный).

M>
M>function html_decode(&$s) {
M>    if (is_array($s)) {
M>        foreach ($s as $key => $val)
M>            if (is_array($s[$key])) html_decode($s[$key]);
M>            else $s[$key] = html_entity_decode($val);
M>    } else $s = html_entity_decode($s);
M>}
M>


Насчет падений тебе уже ответили про константы.
А порочность... уж если ты используешь foreach ($s as $key => $val), то разбитые ключ-значение и пользуй:

function html_decode(&$s) {
   if (is_array($s)) {
       foreach ($s as $key => $val)
          if (is_array($val)) html_decode($val);
          else $val = html_entity_decode($val);
   } else $s = html_entity_decode($s);
}


или так:
function html_decode(&$s) {
   if (is_array($s)) {
       array_walk($s, create_function('&$val, $key','$val = (is_array($val))?html_decode($val):html_entity_decode($val);'));    
   } else $s = html_entity_decode($s);
}
--
DSD
Re[2]: В чем порочность этого кода?
От: Zmei-Gorin Россия  
Дата: 04.04.04 08:53
Оценка:
Здравствуйте, DSD, Вы писали:

DSD>Здравствуйте, mibo, Вы писали:


DSD>Насчет падений тебе уже ответили про константы.

DSD>А порочность... уж если ты используешь foreach ($s as $key => $val), то разбитые ключ-значение и пользуй:

из ru2.php.net/foreach:

Замечание: Also note that foreach operates on a copy of the specified array and not the array itself. Therefore, the array pointer is not modified as with the each() construct, and changes to the array element returned are not reflected in the original array. However, the internal pointer of the original array is advanced with the processing of the array. Assuming the foreach loop runs to completion, the array's internal pointer will be at the end of the array.


По-русски: при изменении $val значение $array[$key] не изменится.
Тогда уж лучше так:

function html_decode(&$s) {
    if (is_array($s)) {
        reset($arr);
        while (list($key, $value) = each ($arr))
            if (is_array($s[$key])) html_decode($s[$key]);
            else $s[$key] = html_entity_decode($val);
    } else $s = html_entity_decode($s);
}
Re[10]: Ответ на сообщение Змея Горыныча...
От: Grelkin  
Дата: 05.04.04 03:50
Оценка:
Здравствуйте, Zmei-Gorin, Вы писали:

ZG>Да, у меня происходит то же самое.

ZG>PHP падает и утаскивает за собой Апач при выпотнении такого кода:


ZG>
ZG><?php
ZG>function test(&$a){
ZG>  $a=html_entities_decode($a);
ZG>}
ZG>test($undefined_var);
ZG>?>
ZG>



ZG>Судя по всему, ошибка в PHP...


Хм... А функцию html_entities_decode Вы сами писали ?
Re[11]: Ответ на сообщение Змея Горыныча...
От: Zmei-Gorin Россия  
Дата: 05.04.04 13:41
Оценка:
Здравствуйте, Grelkin, Вы писали:

G>Здравствуйте, Zmei-Gorin, Вы писали:


G>Хм... А функцию html_entities_decode Вы сами писали ?

html_entity_decode. А Вы никогди не ошибались?..
По поводу ошибки в PHP — см. bugs.php.net — тот баг был исправлен в версии 4.3.2
Re[12]: Ответ на сообщение Змея Горыныча...
От: Grelkin  
Дата: 06.04.04 03:35
Оценка:
Здравствуйте, Zmei-Gorin, Вы писали:

G>>Хм... А функцию html_entities_decode Вы сами писали ?

ZG>html_entity_decode. А Вы никогди не ошибались?..

Ошибался и не раз, простите за наезд ))

ZG>По поводу ошибки в PHP — см. bugs.php.net — тот баг был исправлен в версии 4.3.2


Ага, реально баг и именно в html_entity_decode, так как такая конструкция работает :

function test(&$a){
  $a = strtr( $a, array_flip(get_html_translation_table(HTML_ENTITIES)) );
}
test($undefined_var);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.