• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Warning: Invalid Argument Supplied For Foreach()

  • Автор темы Kauperwood
  • Дата начала
K

Kauperwood

переписываю 'бывшие' скрипты в функции и вот словил то с чем не могу разобраться
Warning: Invalid argument supplied for foreach() in /var/www/Alex/functions.php on line 262 {"hasError":false,"message":"ok"}
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">function</div></div><div class="sp-body"><div class="sp-content">
PHP:
function form_obr_svazi () {
$html="";
$_POST['form']="";
$name="";
$from="";
$texts="";
$captha1="";
$errors="";
if(isset($_POST['do_submit'])) {
$captha1 = $_POST['captcha'];
$to = 'web@okrasim.net'; 
$subject = "обратная связь";	 
$name = $_POST['username'];
$from = $_POST['email'];
$texts = $_POST['message'];
$message = "От:$name\r\nCообщение:\r\n$texts"; 
$headers = 'From:'.$from."\r\n" .
'Reply-To:'.$to . "\r\n" .
'X-Mailer: PHP/' . phpversion();
$err=''; 
if (!$name) $err.="забыли имя<br>";
if (!$from) $err.="забыли мыло<br>"; 
if (!$texts) $err.="забыли сам отзыв<br>"; 
if (strlen($name) > 30) $err.="Длина имени не может превышать 30 символов<br>"; 
if (strlen($texts) > 1000) $err.="Длина отзыва не может превышать 1000 символов<br>"; 
if (strlen($from) > 50) $err.="емейл длинноват...<br>"; 
$email_ok=preg_match("^([_\.0-9a-z-]+@)([0-9a-z][0-9a-z-]+\.)+([a-z]{2,4})$^", $from); 
if (!$email_ok && $from) $err.="не корректный email!<br>"; 
if (!$captha1) $err.="не введен защитный код!<br>"; 
if ($captha1 != $_SESSION['cap_code']) $err.="не корректный защитный код!<br>";  
if (!$err) {	//если ошибок нет, то 
mail($to, $subject, $message, "Content-Type: text/plain; charset=utf-8\r\n\r\n".$headers);
header('Refresh: 3; URL=index.php');
echo 'Сообщение отправлено. через 3 секунды вы будете перенаправлены на главную страницу.'; 
exit; 
} 
else {
echo "<b style='color:red;'>".$err."</b><br>";
}
}
else {  
$fields = $_POST['form'];

foreach($fields as $field) {							 //---------------------------------------------------------------------------------------------------------------262 линия
if($field['name']=='captcha') {
if ($fields['captcha']['value'] != $_SESSION['cap_code']) {
$errors[] = 'не верный код.';
}
break;
}
if($field['name']=='password2'){ // Special case for passwords
if($fields['password2']['value'] != $fields['password']['value']) {
$errors[] = 'Пароли не совпадают.';
}
break;
}
// Normal validation routine
$validators = explode(' ', $field['attr']); 
foreach($validators as $validator){
switch($validator){
case 'nonEmpty':
if(trim($field['value'])=='') {
$errors[] = 'Введите имя.';
}
break;
case 'email':
if(filter_var($field['value'], FILTER_VALIDATE_EMAIL) === false) {
$errors[] = 'email не корректный.';
}
break;
case 'int':
if(filter_var($field['value'], FILTER_VALIDATE_INT) === false){
$errors[] =	ucfirst($field['name']).' should be an integer.';
}
break;
}
}
}

if(!empty($errors)){
echo json_encode(array(
'hasError'=>true,
'message'=>implode($errors, '<br />')
));
}
else {  
echo json_encode(array(
'hasError'=>false,
'message'=> 'ok'
));
}
}//else

$tpl = file_get_contents('form_obratnoy_svazi.html'); 
$action = $_SERVER['PHP_SELF'].'?action=form_obr_svazi'; 
$tpl = str_replace( '{action}', $action, $tpl); 
$tpl = str_replace( '{errors}', $errors, $tpl); 
$tpl = str_replace( '{name}', $name, $tpl); 
$tpl = str_replace( '{email}', $from, $tpl); 
$tpl = str_replace( '{message}', $texts, $tpl); 
$tpl = str_replace( '{captcha}', $captha1, $tpl);
$html = $html . $tpl;
return $html;
}
по идее напротив полей должны появляться jquery.ajaxValidation картинки "дающие" знать правильно ли заполнены поля. Естественно что они не появились. В шаблоне я проставил в дивах {errors] где должны появляться картинки и передаю туда $errors. Вот... Подскажите пожалуйста что нужно добавить, или что неправильно, как устранить этот варнинг?
 
V

vital

сделай
var_dump($fields);
и для надежности
var_dump(is_array($fields));
И посмотри.
У тебя там потом приходит не массив.. или вообще ничего не приходит. И => форич не срабатывает.
 
K

Kauperwood

дельный совет!

string(0) "" bool(false)

не могу понять почему пустой, в старом "виде" работает
может нужно в функцию передать как то?
 
K

Kauperwood

если например этот же кода убрать из функций оставивв только шаблон
и записать как <form action="validator.php"> - ,будет работать
вопрос что можно сделать такого на пхп в функции что бы роботало?
или это js код править нужн?
 
A

AlexanderC

Ну так правельно, в начале функции есть такое $_POST['form']="";, оно отчищает ваш элемент массива (которым является по сути $_POST).
Так что в foreach не приходит массив... нужно проверять до итерации является ли элемент массивом чтобы исключить такие ошибки, ведь данные приходят извне. Советую if ( !is_array($_POST['form']) ) return false;
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!