Warning: Invalid Argument Supplied For Foreach()

Gibiskus

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

Warning: Invalid argument supplied for foreach() in /var/www/Alex/functions.php on line 252 {"hasError":false,"message":"ok"}

PHP:
function form_obr_svazi () {
    $html="";
    $_POST['form']="";
    $name="";
    $from="";
    $texts="";
    $captha1="";
    $errors="";
    if(isset($_POST['do_submit'])) {
        $captha1 = $_POST['captcha'];
        $to = 'mail@mail.ru'; 
        $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) {          // --------------------------------------------------------------------252 строчка
            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. Вот... Подскажите пожалуйста, что нужно добавить, что неправильно и как устранить этот варнинг?
 

Syra

Новичок
Если внешне всё нормально работает, то можно просто прибить предупреждение.
Ну а вообще перед foreach() !empty($array_name) ставь.
 

newARTix

Новичок
michelle
насколько я понимаю, explode всегда вернет массив, если всё ок, а если не ок, то она сама выдаст нотис в лог. поэтому проблема скорее в
$fields = $_POST['form'];
foreach($fields as $field)
тут ведь дырка размером с Канзас (с), $_POST это данные от пользователя (или злоумышленника), вы просто так их передаете на обработку алгоритму? О_О

($_POST['form']=""; я проигнорил как остатки отладки, но он "как бэ символизирует").
 

korpus

злой бобёр
В 251 строке вставь это:
PHP:
echo '<pre>';
var_dump($fields);
echo '</pre>';
 
  • Like
Реакции: Syra

Gibiskus

Новичок
var_dump($fields);
var_dump(is_array($fields));

будет
string(0) "" bool(false)

через <form action="file.php"> - сразу работатает
 

Gibiskus

Новичок
чуть попробовал и понял что мне неудобно через <form action="file.php"> мне нужно <form action={action}>
Вот и ответ на вопрос. А надо что бы был массив.
простите, я немного нуб, что нужно доделать? на стороне js надеюсь ничего?
 
Сверху