Как избавиться от показа предупреждений (warning)
#1
Отправлено 27 March 2015 - 04:15 PM
Я встроил форму в сайт, вот эту - cyberforum.ru/blogs/297871/blog2149.html
Подгружаю нужный код в блоке (добавить блок из файла)
Там просто, заливаешь папку в корень, а содержимое файла дизайна самих форм подключаешь куда надо для вывода (в нем же настраивается их тип, количество и т.п., короче весь дизайн формы)
В общем суть в том, что подключенном блоке форма высвечивается правильно, ее заполняешь, нажимаешь "отправить", все успешно отправляется письмо нужное приходит, но выскакивает куча
Warning: Invalid argument supplied for foreach() in /home/...
и т.д.
в блоке самой формы
количество варнингов зависит от количества заполненных полей
Я в php не силен, но знаю, что это не страшно, но они вываливаются на всеобщее обозрение. Подскажите решение плиз , как бы их спрятать ?
#2
Отправлено 27 March 2015 - 04:59 PM
Нужно перед foreach добавить проверку
if(isset($var) && is_array($var) && count($var) > 0)возможно некоторые условия излишни, но, за неимением подробностей, вставил по максимуму
доработка функционала
#3
Отправлено 27 March 2015 - 06:21 PM
Как я понимаю, начиная с PHP 5.3 начали выдаваться warning-и по несовпадению типов требуемых и используемых данных.Я в php не силен, но знаю, что это не страшно, но они вываливаются на всеобщее обозрение. Подскажите решение плиз , как бы их спрятать ?
Страшного в этом ничего обычно нет, но "некрасивенько".
В случае с циклом foreach обычно это происходит тогда, когда массив, который должен быть обработан в цикле по какой-либо причине так и не объявлен. По хорошему, перед заполнением такого массива надо прописывать что-то типа $a = array(), вдруг в него так и не будет добавлено ни одного элемента. Но мало кто это делает, да и штатно в коде ShopCMS достаточно мест, где после выхода PHP 5.3 полезли такие warning-и.
Для исправления достаточно перед foreach вставить строку проверки на тип. Например, код
foreach ($a as $
заменить на
if (is_array($a))
foreach ($a as $
этой проверки достаточно, isset($a) и count($a) излишни в данном случае. Результат первой является подмножеством is_array($a), а результат второй нафиг не нужен, т.к. count($a)>0 проверит сам цикл foreach.
#4
Отправлено 28 March 2015 - 06:55 AM
#5
Отправлено 28 March 2015 - 08:46 AM
вот варнинги
Warning: Invalid argument supplied for foreach() in /home/domains/.../send_form/valid_form.php on line 27
Warning: Wrong parameter count for array_push() in /home/domains/.../send_form/valid_form.php on line 60
Warning: Invalid argument supplied for foreach() in /home/domains/.../send_form/valid_form.php on line 53
27-я строка это - // если есть массив, идем дальше
// проверка/валидация формы foreach ($post as $Name => $tempValue) { // разбираем массив POST на переменные и массив foreach ($tempValue as $vKey => $vValue) { // получаем переменные: "name" поля input, "value" поля input, $Key = ключ для валидации с <input name="Name[0 или 1]"> // если есть массив, идем дальше if(is_array($vValue)) { // если с формы пришел массив, то есть [] <input name="одинаковое[][1]"> , то включаем эту часть кода foreach ($vValue as $Key => $aValue) { // получаем переменные: key, value поля <input name="одинаковое[][$Key 0 или 1]" value=""> $vValue = $aValue; // переназначаем переменную с учетом массива } count($tempValue[$Key]) ? $vKey = 0 : $vKey = 1; // здесь для проверки назначаем в соответствии ключа с формы: [$Key 0 или 1] } $i++; // для получения $pattern_? , номер поля с формы для шаблона валидации $Value = htmlspecialchars(trim($vValue)); // преобразовуем специальные символы в HTML сущности и удаляем пробелы по бокам if($vKey == 1) { // если ключ 1 - проверяем форму, 0 - нет проверки, приходит с <input name="Name[$Key 0 или 1]"> if($Value == '') { // проверка формы на пустоту $errors[] = "Вы не ввели: ".$Name; } else if (!preg_match(${'pattern_'.$i} ? ${'pattern_'.$i} : '/(.*?)/iu', $Value)) { // если форма не пуста, валидация полей по шаблону $pattern_? '/^... $/i' $errors[] = "Введено некорректно: ".$Name; } } } } /*------------------------- end ---------------------------*/
53-я - это
foreach ($tempValue as $mName => $mValue) { // разбираем массив POST c чекбоксов на переменные и массив
60-я - это
array_push($_POST[$tempName.'_'.$x] = $Value); // создание массива // '$_POST[Name_x]' => 'Value' //
/*------------------------ start --------------------------*/ // создание нового массива $_POST['name'] foreach ($post as $tempName => $tempValue) { // разбираем массив POST c чекбоксов на переменные и массив $x = 0; // обнуляем: для добавления к имени массива: 1, 2 и тд. if (is_array($tempValue)) foreach ($tempValue as $mName => $mValue) { // разбираем массив POST c чекбоксов на переменные и массив if(is_array($mValue)) { // если с формы пришел массив, то есть [] <input name="одинаковое[][1]"> , то включаем эту часть кода foreach ($mValue as $Key => $aValue) { // получаем переменные: name = "$Name" value="$Value" поля <input name="одинаковое[][$Key 0 или 1]" value="$Value"> $Value = htmlspecialchars(trim($aValue)); // преобразовуем специальные символы в HTML сущности и удаляем пробелы по бокам if($Value != '') { $x++; // для добавления к имени массива: 1, 2 и тд. array($_POST[$tempName][] = $Value); // создание массива // '$_POST[Name]' => array('Key' => 'Value') // array_push($_POST[$tempName.'_'.$x] = $Value); // создание массива // '$_POST[Name_x]' => 'Value' // } } } else { $aValue = htmlspecialchars(trim($mValue)); // преобразовуем специальные символы в HTML сущности и удаляем пробелы по бокам array($_POST[$tempName] = $aValue); // создание основного массива // '$_POST[Name]' => 'Value' // } } } /*------------------------- end ---------------------------*/
#6
Отправлено 28 March 2015 - 10:57 AM
foreach ($post as $Name => $tempValue) { // разбираем массив POST на переменные и массив
foreach ($tempValue as $vKey => $vValue) { // получаем переменные: "name" поля input, "value" поля input, $Key = ключ для валидации с <input name="Name[0 или 1]">
первый foreach понятен, он делит массив $_POST на элементы. Т.к. есть форма, то, скорее всего, есть и $_POST массив.
А вот что за бред во второй строке? С чего это вдруг решилось, что каждый элемент массива $_POST (переменная $tempValue) тоже будет массивом? Такое можно сделать, но по факту я ни разу не встречал, чтобы ВСЕ элементы $_POST были массивами. Т.е. надо обязательно проверять if (is_array($tempValue)).
array_push($_POST[$tempName.'_'.$x] = $Value); // создание массива // '$_POST[Name_x]' => 'Value' //
array_push должен иметь, как минимум, два аргумента - массив, куда добавляется значение и само значение или значения. А тут первый аргумент не массив, а второго и вообще нет. Ты читать описание функций не пробовал?
Например, на http://php.su
#7
Отправлено 28 March 2015 - 11:14 AM
Ты читать описание функций не пробовал?
Например, на http://php.su
Честно говоря нет , так ка не занимаюсь программированием на php или другом любом языке программирования и видимо мне это не особо надо читать, раз я этим не занимаюсь. Здесь же я просто помощи прошу, так как не владею знаниями о php, точнее владею, но теоретическими и практики программирования на нем не то что недостаточно, чтобы разобраться, а просто не достаточно Вот и прошу помощи. Нужно просто форму эту встроить в сайт. Она работает, но вот со всеми этими выводимыми предупреждениями и конечно в таком виде ее оставлять нельзя
А кто писал код - фиг знает, нашел единственную приемлемую по возможностям готовую форму
#8
Отправлено 28 March 2015 - 05:52 PM
Эээ... Понимаешь, либо ты читаешь, пытаешься понять, просишь помощи если что-то не получается. И тут я с удовольствием помогу, т.к. это будет именно помощь человеку, который сначала пытался разобраться и сделать что-то сам. Но вот помогать человеку, который заявляет "я не читаю документацию, т.к. мне это не особенно и надо" я точно не буду. Не занимаешься программированием на php? Не вопрос, куча людей этим не занимается. Но они нанимают и оплачивают тех, кто этим занимается, а не вываливают в форум код с бредовыми ошибками и просят помощи.Честно говоря нет , так ка не занимаюсь программированием на php или другом любом языке программирования и видимо мне это не особо надо читать, раз я этим не занимаюсь.
#10
Отправлено 29 March 2015 - 07:32 AM
Эээ... Понимаешь, либо ты читаешь, пытаешься понять, просишь помощи если что-то не получается. И тут я с удовольствием помогу, т.к. это будет именно помощь человеку, который сначала пытался разобраться и сделать что-то сам.Честно говоря нет , так ка не занимаюсь программированием на php или другом любом языке программирования и видимо мне это не особо надо читать, раз я этим не занимаюсь.
Ну так яж написал "Спасибо за ответы !, пробую исправить ситуацию"
Я думаешь просто так написал ? Не поверишь, но очень хочу сам разобраться и помогать другим, потому как есть в этом направлении потенциал (в свое время начинал с бейсика на zx-spectrum, и далее на нем уже игры делал, которые выходили в свет, но это было оооооочень давно), но в математике и программировании по сути идея одна - функция, константы, переменные. Здесь элементарная логика, и когда я смотрю на foreach, (я понимаю по смыслу , что это цикл и что он должен делать), но разобраться в его вложенности в себя я пока не могу, точнее могу, но мне для этого нужно практики по PHP, и я бы с удовольствием, но сейчас у меня запуск сайта и в html и css я слава богу рулю (тут знаний хватает). Ну вот такая вот ситуация. Скачал PHP для чайников для начала, сижу, в метро читаю В принципе, ничего сложного, но нужна практика
Update
программирование, это нужно варится в нем, я просто вспомнил, как я на ассемблере делал проект с товарищем, с которым мы учились в институте, так вот когда ты в проекте, а например едешь с девушкой, где-нить , и вдруг тебя на "прерываниях оазаряет", потому что она там все время висит (идея, не девушка конечно), - а как бы сделать лучше и быстрей" вдруг озаряет мысля так, что ты ее высказываешь чуть ли не вслух всем (а до этого, ты был вообще в матрице (не в той которая в фильме, а в той, в которой пересечения в "вышке", и ты ее вычислял), и пытался понять, как же XOR сложит два числа и как я получится логика и вообще, изменит мир, но это все в поездке , ну в крайнем случае, наложит 2 числа:", типа блин "да, окружность же можно нарисовать не модифицируя стандартную функцию, и задать таблицу синусов, и просто брать нужный размер из за ранее заданного массива (да, из большего файла), но результат в 100 раз быстрее в бейсиковская функция.
Ладно, это лирика пошла, вспомнил свое программирование Появилось желание вернуться а тут уже раз занялся html, ну судьба начать php и java script но вот пока еще время для другого расходуется
badisoft - хочешь батл - готов забиться (не тебе нужно, мне). Это видимо первый случай такой в форуме)
Дай какое-нибудь задание, простое, с чего ты начинал (блин, хрен знает что творю, но такие публичные решения в президенты выводят ,)
#11
Отправлено 29 March 2015 - 01:01 PM
Ну так определись тогда. Либо "мне это не нужно, поэтому я не буду читать документацию", либо "но очень хочу сам разобраться".Не поверишь, но очень хочу сам разобраться и помогать другим, потому как есть в этом направлении потенциал
Логику работы приведенного тобой куска я не смотрел (да ее и и не посмотришь особо, т.к. именно кусок кода), а направляющие к решению моменты приведены. Для foreach это проверка на тип данных (является ли аргумент foreach массивом), а для array_push - прочитать описание функции по приведенной ссылке и привести аргументы в соотвествие.
Первый аргумент - массив, куда добавляется, а второй - что добавляется.