Перейти к содержимому


Как избавиться от показа предупреждений (warning)


  • Вы не можете ответить в тему
Сообщений в теме: 10

#1 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 27 March 2015 - 04:15 PM

Народ, подскажите решение плиз, че -только не перепробовал

Я встроил форму в сайт, вот эту - cyberforum.ru/blogs/297871/blog2149.html

Подгружаю нужный код в блоке (добавить блок из файла)

Там просто, заливаешь папку в корень, а содержимое файла дизайна самих форм подключаешь куда надо для вывода (в нем же настраивается их тип, количество и т.п., короче весь дизайн формы)

В общем суть в том, что подключенном блоке форма высвечивается правильно, ее заполняешь, нажимаешь "отправить", все успешно отправляется письмо нужное приходит, но выскакивает куча

Warning: Invalid argument supplied for foreach() in /home/...
и т.д.

в блоке самой формы

количество варнингов зависит от количества заполненных полей

Я в php не силен, но знаю, что это не страшно, но они вываливаются на всеобщее обозрение. Подскажите решение плиз , как бы их спрятать ?
  • 0

#2 namer

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 45 сообщений
Репутация: 16
Начинающий
  • ГородКрасноярск

Отправлено 27 March 2015 - 04:59 PM

Правильнее было бы исправить.
Нужно перед foreach добавить проверку
if(isset($var) && is_array($var) && count($var) > 0)
возможно некоторые условия излишни, но, за неимением подробностей, вставил по максимуму
  • 1
Установка, настройка
доработка функционала
Изображение

#3 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 27 March 2015 - 06:21 PM

Я в php не силен, но знаю, что это не страшно, но они вываливаются на всеобщее обозрение. Подскажите решение плиз , как бы их спрятать ?

Как я понимаю, начиная с PHP 5.3 начали выдаваться warning-и по несовпадению типов требуемых и используемых данных.
Страшного в этом ничего обычно нет, но "некрасивенько".
В случае с циклом foreach обычно это происходит тогда, когда массив, который должен быть обработан в цикле по какой-либо причине так и не объявлен. По хорошему, перед заполнением такого массива надо прописывать что-то типа $a = array(), вдруг в него так и не будет добавлено ни одного элемента. Но мало кто это делает, да и штатно в коде ShopCMS достаточно мест, где после выхода PHP 5.3 полезли такие warning-и.

Для исправления достаточно перед foreach вставить строку проверки на тип. Например, код

foreach ($a as $B)

заменить на

if (is_array($a))
foreach ($a as $B)

этой проверки достаточно, isset($a) и count($a) излишни в данном случае. Результат первой является подмножеством is_array($a), а результат второй нафиг не нужен, т.к. count($a)>0 проверит сам цикл foreach.
  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#4 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 28 March 2015 - 06:55 AM

Спасибо за ответы !, пробую исправить ситуацию
  • 0

#5 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 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 ---------------------------*/

  • 0

#6 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 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
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#7 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 28 March 2015 - 11:14 AM

Ты читать описание функций не пробовал? :)
Например, на http://php.su


Честно говоря нет :) , так ка не занимаюсь программированием на php или другом любом языке программирования и видимо мне это не особо надо читать, раз я этим не занимаюсь. Здесь же я просто помощи прошу, так как не владею знаниями о php, точнее владею, но теоретическими и практики программирования на нем не то что недостаточно, чтобы разобраться, а просто не достаточно :) Вот и прошу помощи. Нужно просто форму эту встроить в сайт. Она работает, но вот со всеми этими выводимыми предупреждениями и конечно в таком виде ее оставлять нельзя

А кто писал код - фиг знает, нашел единственную приемлемую по возможностям готовую форму
  • 0

#8 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 28 March 2015 - 05:52 PM

Честно говоря нет :) , так ка не занимаюсь программированием на php или другом любом языке программирования и видимо мне это не особо надо читать, раз я этим не занимаюсь.

Эээ... Понимаешь, либо ты читаешь, пытаешься понять, просишь помощи если что-то не получается. И тут я с удовольствием помогу, т.к. это будет именно помощь человеку, который сначала пытался разобраться и сделать что-то сам. Но вот помогать человеку, который заявляет "я не читаю документацию, т.к. мне это не особенно и надо" я точно не буду. Не занимаешься программированием на php? Не вопрос, куча людей этим не занимается. Но они нанимают и оплачивают тех, кто этим занимается, а не вываливают в форум код с бредовыми ошибками и просят помощи.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#9 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 28 March 2015 - 11:47 PM

Jeck2000, пришлите мне ссылку на сайт и доступ к фтп в личку.
  • 0

#10 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 29 March 2015 - 07:32 AM

Честно говоря нет :) , так ка не занимаюсь программированием на php или другом любом языке программирования и видимо мне это не особо надо читать, раз я этим не занимаюсь.

Эээ... Понимаешь, либо ты читаешь, пытаешься понять, просишь помощи если что-то не получается. И тут я с удовольствием помогу, т.к. это будет именно помощь человеку, который сначала пытался разобраться и сделать что-то сам.


Ну так яж написал "Спасибо за ответы !, пробую исправить ситуацию"

Я думаешь просто так написал ? Не поверишь, но очень хочу сам разобраться и помогать другим, потому как есть в этом направлении потенциал (в свое время начинал с бейсика на zx-spectrum, и далее на нем уже игры делал, которые выходили в свет, но это было оооооочень давно), но в математике и программировании по сути идея одна - функция, константы, переменные. Здесь элементарная логика, и когда я смотрю на foreach, (я понимаю по смыслу , что это цикл и что он должен делать), но разобраться в его вложенности в себя я пока не могу, точнее могу, но мне для этого нужно практики по PHP, и я бы с удовольствием, но сейчас у меня запуск сайта и в html и css я слава богу рулю (тут знаний хватает). Ну вот такая вот ситуация. Скачал PHP для чайников для начала, сижу, в метро читаю :) В принципе, ничего сложного, но нужна практика

Update

программирование, это нужно варится в нем, я просто вспомнил, как я на ассемблере делал проект с товарищем, с которым мы учились в институте, так вот когда ты в проекте, а например едешь с девушкой, где-нить , и вдруг тебя на "прерываниях оазаряет", потому что она там все время висит (идея, не девушка конечно), - а как бы сделать лучше и быстрей" вдруг озаряет мысля так, что ты ее высказываешь чуть ли не вслух всем (а до этого, ты был вообще в матрице (не в той которая в фильме, а в той, в которой пересечения в "вышке", и ты ее вычислял), и пытался понять, как же XOR сложит два числа и как я получится логика и вообще, изменит мир, но это все в поездке , ну в крайнем случае, наложит 2 числа:", типа блин "да, окружность же можно нарисовать не модифицируя стандартную функцию, и задать таблицу синусов, и просто брать нужный размер из за ранее заданного массива (да, из большего файла), но результат в 100 раз быстрее в бейсиковская функция.

Ладно, это лирика пошла, вспомнил свое программирование :) Появилось желание вернуться :) а тут уже раз занялся html, ну судьба начать php и java script но вот пока еще время для другого расходуется

badisoft - хочешь батл - готов забиться (не тебе нужно, мне). Это видимо первый случай такой в форуме)

Дай какое-нибудь задание, простое, с чего ты начинал (блин, хрен знает что творю, но такие публичные решения в президенты выводят :),)
  • 0

#11 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 29 March 2015 - 01:01 PM

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

Ну так определись тогда. Либо "мне это не нужно, поэтому я не буду читать документацию", либо "но очень хочу сам разобраться". :)

Логику работы приведенного тобой куска я не смотрел (да ее и и не посмотришь особо, т.к. именно кусок кода), а направляющие к решению моменты приведены. Для foreach это проверка на тип данных (является ли аргумент foreach массивом), а для array_push - прочитать описание функции по приведенной ссылке и привести аргументы в соотвествие.
Первый аргумент - массив, куда добавляется, а второй - что добавляется.
  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)