|
|
|
| такая функция:
function check(&$item, $key) {
if (is_array($item)){
array_walk($item, 'check');// пока не доберемся до строки
}else{
if (get_magic_quotes_gpc()) {
$item = stripslashes($item);
}
$iso = array(
'`'=>'`',
'"'=>'"',
'<'=>'<',
'>'=>'>',
"'"=>'''
);
$item=strtr($item,$iso);
$item=trim($item);
}
}
array_walk(@$_POST, 'check');
|
При передаче в $_POST текста <a href="http://yandex.ru/">Ссылка</a> должна конвертировать его в <a href="http://yandex.ru/">Ссылка</a>
Однако на практике, при проверке
echo '<pre>';
print_r(@$_POST);
echo '</pre>';
|
получается:
<pre>Array
(
[mess] => <a href=\"http://yandex.ru/\">Ссылка</a>
)
</pre>
Где ошибка? Почему не меняется $_POST['mess']? | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 13:07)
| | А htmlspecialchars() не достаточно, или городить такое чем то обусловлено? | |
|
|
|
|
|
|
|
для: confirm
(24.08.2013 в 13:14)
| | В принципе, достаточно и htmlspecialchars()
Не вижу большой разници между htmlspecialchars и strtr. Но суть-то не в том, каким оператором произвести замену, а в том, что замена не попадает в _POST. | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 13:29)
| | Во-первых, разница большая. Во-вторых, если POST массив это один единственный ключ 'mess', то зачем array_walk, если достаточно $var = htmlspecialchars($_POST['mess']) (искать вхождения, потом делать замену что вы делаете, это просто лишено смысла). В третьих, если POST массив имеет не один ключ, но представляет собой одномерный массив, то зачем рекурсия в пользовательской функции? В этом случае достаточно $arr = array_map('htmlspecialchars', $_POST);
"замена не попадает в _POST", это загадка известная только вам. | |
|
|
|
|
|
|
|
для: confirm
(24.08.2013 в 13:46)
| | Во-первых, там не единственный ключ. Один оставлен для упрощения примера.
Во-творых, допустим, я сделал бы так:
function check(&$item, $key) {
if (is_array($item)){
array_walk($item, 'check');// пока не доберемся до строки
}else{
if (get_magic_quotes_gpc()) {
$item = stripslashes($item);
}
$item = htmlspecialchars($item);
}
}
array_walk(@$_POST, 'check');
|
Разве это изменит суть? А суть в том, что $item - это ссылка на элемент массива _POST и именно элемент массива должен меняться, а не локальная переменная $item.
В третьих, "если POST массив имеет не один ключ"... то не обязан быть одномерным массивом, так как существуют чекбоксы с именем fiekd[] и передаются как массив внутри массива _POST.
И если уж вам известно, почему замена не попадает в массив, поясните. Исходя из документации array_walk "применяет пользовательскую функцию к каждому элементу массива". Таким образом должен меняться элемент массива.
Кстати, htmlspecialchars не заменяет `, а мне нужно заменять | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 14:14)
| | htmlspecialchars - это встроенная функция, написанная на Си и этим все сказано.
Нужно чтобы изменился входной массив, так кто вам запрещает $_POST['mess'] = htmlspecialchars($_POST['mess'])?
Скажу больше - судя по if (get_magic_quotes_gpc()), это шаманство перед внесением в базу данных. Если так, то get_magic_quotes_gpc выключить в настройках сервера и забыть раз и навсегда об этом. А перед внесением в базу данных насиловать эти данные htmlspecialchars и подобным, это не есть хорошо, и рано или поздно вы это поймете.
Чтобы не говорить попусту, покажите лучше что из себя представляет входной массив POST. | |
|
|
|
|
|
|
|
для: confirm
(24.08.2013 в 14:19)
| | входной массив формируется пользователем формы. Пользователь добавляет поля по своему усмотрению. Заранее неизвестно, сколько полей будет и будут ли внутри поста массивы field[]=111&field[]=222 и т. д.
Но суть, как всегда, не в том. А в том, что если в функцию передана ссылка на переменную, изменения в функции должны производиться с этой переменной, а не с локальной переменной того же имени. Вопрос в том, почему этого не происходит в конкретном случае. | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 14:30)
| | field[]=111&field[]=222 и т. д. - это что не одномерный массив, и ранее показанного примера разве не хватит для обработки, а надо городить то, что вы вытворяете?
Еще раз - если данные для базы, то array_map('mysql_real_escape_string', $_POST), а не htmlspecialchars. htmlspecialchars при выводе из базы. | |
|
|
|
|
|
|
|
для: confirm
(24.08.2013 в 14:46)
| | Цепляться к тому, зачем мне такая функция - заниматься снобизмом. Если вы не знаете ответа на вопрос, почему переменная, переданная в функцию по ссылке в данном случае остается неизменной, то незачем зубы заговаривать. Возможно найдется тот, кто знает, почему переменная не меняется.
И если уж вам так хочется увидеть входной массив, то вот вам один из вариантов:
Array
(
[MAX_FILE_SIZE] => 2097152
[art] => 1234
[firma] => 2
[name] => Кастрюля 1
[file] => kastryulya 1
[order] =>
[new] => 1
[price] => 100
[sklad] => 1
[hide] =>
[podrazdel] => 50
[vid_id] => Array
(
[0] => 8
[1] => 2
[2] => 11
[3] => 3
[4] => 32
)
[comment] => Array
(
[0] => 5
[1] => Аллюминий
[2] => 1кг.
[3] => Россия
[4] =>
)
[opis] => Краткое описание
[detail] => Описание
[pre] =>
[link] => Array
(
[0] => 1
[1] => 3
)
[nev_link] => 1|3
[action] => new_item
[post] => Ждите...
)
Array
(
[addonimg] => Array
(
[name] => Array
(
[0] => WFT10_2_1280x1024.jpg
)
[type] => Array
(
[0] => image/jpeg
)
[tmp_name] => Array
(
[0] => Z:\tmp\phpF2.tmp
)
[error] => Array
(
[0] => 0
)
[size] => Array
(
[0] => 566104
)
)
)
|
Мне кажется, такая простыня данных не упрощает понимание | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 15:09)
| | А вы на функцию свою внимательно посмотрите, в ней кроется ответ.
Второй массив, это массив FILES, и уж его обрабатывать htmlspecialchars это уже .... Его то вы для чего привели?
Еще раз, без "неважно" и прочего, опишите задачу полностью. Пришли данные, для чего эти данные - посмотреть на них и что-то с ними сделать, или все таки в базу записать? Что в итоге должно быть? У вас ведь не данные а каша, в том смысле, что ключи [action] => new_item и [post] => Ждите... уж точно не для записи, какого беса они вообще делают в этом массиве? Если все таки по непонятным причинам массив из себя представляет кашу, то что вам мешает поучить пересечением массивов только те ключи, данные которых и нужны?
Вы с каждым вопросом вываливаете совсем иные исходные данные, и не понять в таком случае, на кой ляд вообще нужна ваша функция. | |
|
|
|
|
|
|
|
для: confirm
(24.08.2013 в 15:19)
| | В начале я вообще данных не приводил, так как они не влияют на суть. Вы захотели данные, я привел данные, получаемые методом _POST. Среди них есть FILES. Нужно было убрать из примера? Но вы же захотели увидеть реальные данные. Это я еще не делал полного текста в некоторых полях...
[action] => new_item показывает, что именно нужно выполнить скрипту
[post] => Ждите... - значение на кнопке, которое меняется с "Отправить", на "Ждите..." в момент нажатия.
Данные прежде всего проверяются на соответствие ожидаемому. Если что-то не так, они отображаются в той же форме. И вот тогда нужно позаменять часть символов.
И только в случае, если данные именно такие, как ожидается, они записываются. Но это уже никакого отношения к function check не имеет.
В упрощенном виде, задача "полностью" такова:
есть массив:
$_POST['detail']='<a href="http://yandex.ru/">Ссылка`</a>';
нужно его обработать функцией
function check(&$item, $key) {
$item=htmlspecialchars($item);
$item=trim($item);
}
array_walk(@$_POST, 'check');
|
Вопрос в том, почему после обработки $_POST['detail'] не содержит замененные specialchars. | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 15:37)
| | Кошмар, ей богу. Я вас просил привести POST данные, которые нужно обработать, FILES к массиву POST отношения никакого не имеют, это отдельный массив, эти данные никогда в массив POST не попадают. Получается, что и в этом случае виноват я?
>[action] => new_item показывает, что именно нужно выполнить скрипту, допустим, а [post] => Ждите... - значение на кнопке, которое меняется с "Отправить", на "Ждите..." в момент нажатия. - это зачем серверу?
Трудно с вами говорить, поэтому - если надо все проверить на соответствие, то ваша функция никак этого не делает. Если нужен рекурсивный обход, то все таки array_walk_recursive(), а не array_walk().
И в описании функции array_walk_recursive прочтите, что нужно делать, чтобы пользовательская функция изменяла массив источник. Что у вас и сделано, а не изменяет потому, что и функция у вас кривая, и подход совсем неверен. | |
|
|
|
|
|
|
|
для: confirm
(24.08.2013 в 15:49)
| | в упрощенном примере:
function check(&$item, $key) {
$item=htmlspecialchars($item);
$item=trim($item);
}
array_walk(@$_POST, 'check');
|
Уже никакой рекурсии нет.
Вы пишите "не изменяет потому, что и функция у вас кривая". В чем ее кривизна? | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 15:54)
| |
<?
function main(&$n) {
$n += 5;
}
$a = array(1,2,3);
array_walk($a, "main");
print_r($a);
| Изменяет пользовательская функция исходный массив? | |
|
|
|
|
|
|
|
для: confirm
(24.08.2013 в 16:09)
| | да | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 17:07)
| | А значит какой ответ? Вы вместо неких действий в своей функции выводите на экран аргументы ее, станет видно, что функция "кривая", что она должна изменять, это ваше ошибочное ожидание.
Ну и может после этого поймете, что она не отвечает заявленной вами задаче. | |
|
|
|
|
|
|
|
для: confirm
(24.08.2013 в 17:18)
| | так где ошибка? | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 18:24)
| | Я уже сказал - в функции, сказал почему, разбирайтесь. Я вам про onmouseover долго не мог втолковать, опять на те же грабли напоролся. Я вам уже говорил, что описанным вами требованиям по проверке данных ваша функция не соответствует. А чтобы понять почему она просто не обрабатывает данные (не важно соответствует это задаче проверки или нет) сделайте то, что я говорил выше - выводите просто аргументы получаемые функцией. Будет видна ошибка, и заключается она не в соответствии логики работы функции и структуры данных. | |
|
|
|
|
|
|
|
для: confirm
(24.08.2013 в 18:37)
| | Не знаю, что вы увидели в функции, но проблема заключалась в ее вызове.
array_walk(@$_POST, 'check');
|
Не работает. А так:
array_walk($_POST, 'check');
|
Работает. | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 19:32)
| | Прочтите что такое @ в РНР, и ответьте сами себе нужна ли она там вообще. Говоря честно, я уже на это даже внимания не обращаю, потому, как уже не раз пишешь - "уберите бесполезных собак", тем не менее пишут. В вашей функции я вообще ничего не вижу, в смысле полезного. | |
|
|
|
|
|
|
|
для: confirm
(24.08.2013 в 19:37)
| | собака была вставлена на случай, если поста нет (погорячился в спешке). А потом, как и вы, сам не обращал на нее внимания. Потому и привел функцию и ее вызов, чтоб кто-то со свежим взглядом помог найти где собака зарыта. Что касается полезности моей функции, то в каждой задаче свои тонкости и нет смысла разбираться в ее тонкостях , если проблема всего лишь в одной детали релизации. | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 19:51)
| | Как понимать нет поста? Массив $_POST присутствует постоянно как суперглобальная переменная, просто он будет пустой, если не было передачи POST-данных. Поэтому собачить эту суперглобавльную переменную глупость. И размещая РНР код, не забывайте указывать хотя бы начальный его тег, иначе не всегда все воспринимается когда нет подсветки кода, особенно когда уже устал. Вот почему я не обратил внимания, а код ваш, не мой, и зная выше изложенное такое писать....
Нет у вас никакой тонкости, не надо оправдываться - ваша функция бессмысленна, если данные для базы, а почему, я уже говорил выше. Во-вторых, вашему заявленному "проверять данные на соответствие ожидаемым" она вообще не соответствует, ибо проверка на соответствие подразумевает диалог. В третьих, если ваша проверка в чем-то ином описана, то это тоже не тонкость, а безалаберность, так как разбрасывать проверку на соответствие и непосредственно обработку по разным "углам", это совсем не подход. И в четвертых - я пишу код клиента и серверный, а значит я определяю удобное представление данных на клиенте так, чтобы и на сервере эти данные можно было обрабатывать оптимально, при этом "заранее не известно сколько полей добавит пользователь", это вы загнули, так как "резиновой" и не оптимальной структуры базы быть не может, тем более определяемой пользователем. | |
|
|
|
|
|
|
|
для: confirm
(24.08.2013 в 20:05)
| | структура базы:
id_родительской записи,название, значение
вбиваем любые поля, даем им любые значения. Все это увязывается с родительской записью и используется в нужный момент. Но это все тонкости, не имеющие отношение к текущему вопросу | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 20:19)
| | Ну ну. | |
|
|
|
|
|
|
|
для: thisismy
(24.08.2013 в 19:32)
| | Кстати, интересное поведение.
Получается, оператор управления ошибками, возвращает переменную, для которой используется, что делает невозможным создание ссылки на нее. | |
|
|
|
|
|
|
|
для: Drago
(24.08.2013 в 21:19)
| | Выходит так | |
|
|
|
|