Warning: Invalid Argument Supplied For Foreach()

Тема в разделе "PHP программирование", создана пользователем Kauperwood, 27 май 2011.

  1. Kauperwood

    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. Вот... Подскажите пожалуйста что нужно добавить, или что неправильно, как устранить этот варнинг?
     
  2. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    сделай
    var_dump($fields);
    и для надежности
    var_dump(is_array($fields));
    И посмотри.
    У тебя там потом приходит не массив.. или вообще ничего не приходит. И => форич не срабатывает.
     
  3. Kauperwood

    Kauperwood Гость

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

    string(0) "" bool(false)

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

    Kauperwood Гость

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

    AlexanderC Гость

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

Поделиться этой страницей