2013-09-10 2 views
1

У меня есть проблема с моей PHP скриптом, который проверяет 3 переменных (код ниже):PHP неудачи переменных проверочной

$auth (Почтовый автор)
$subj (Почтовый предмета)
$text (почтовое сообщение)

ФОРМА:
(Примечание: я использовал метод «GET», потому что по какой-то странной причине метод «POST» не работает)

   <div id="contact_form"> 
         <form method="get" name="contact" action="home.php"> 
           <input type="hidden" 
             name="method" 
             value="send"/> 
           E-Mail:<br/> 
           <input type="text" 
             id="author" 
             name="author" 
             class="require input_field" 
             value=""/> 

           <br/> 
           Subject:<br/> 
           <input type="text" 
             id="subject" 
             name="subject" 
             class="require input_field" 
             value=""/> 

           <br/> 
           Message:<br/> 
           <textarea id="text" 
             name="text" 
             rows="0" 
             cols="0" 
             class="required" 
             value=""></textarea> 

           <br/> 
           <input type="submit" 
             class="submit_btn" 
             name="submit" 
             id="submit" 
             value="Submit" /> 
      </form> 
     </div> 

Форма отлично работает сейчас.

PHP:

<?php // ||HOME.PHP|| 
$method = $_GET['method']; 
$auth = $_GET['author']; 
$subj = $_GET['subject']; 
$text = $_GET['text']; 
$recv = "[email protected]"; 


function redirect($location) { 
     if($location == "true") { 
      header("Location: http://mysite.com/home.php?method=result&status=true"); 
     } else { 
      header("Location: http://mysite.com/home.php?method=result&status=false"); 
     } 
} 

//... 
//Other methods... 
//... 

//METHOD SEND 
if($method == "send") { 


    //HERE IS THE PROBLEM 
    //These are apparently not working 
    //If i leave the form blank and submit it 
    //these won't redirect to "false" (mail not sent), 
    //and the script will just continue, send the empty mail 
    //and redirect to "true" (mail sent) 

    if(empty($auth)) { redirect(""); } 
    if(empty($subj)) { redirect(""); } 
    if(empty($text)) { redirect(""); } 

    if(!strstr($auth, '@')) { redirect(""); } 
    if(!strstr($auth, '.')) { redirect(""); } 

    if(strlen($auth) < 5) { redirect(""); } 
    if(strlen($subj) < 4) { redirect(""); } 
    if(strlen($text) < 4) { redirect(""); } 

    //From here it should work just fine 
    //As i'm not sure the "RESULT" method (below) is working fine, i 
    //posted it too. 




    $auth = "From: " . $auth; 

    mail($recv,$subj,$text,$auth); 
    redirect("true"); 

    require("template/footer.html"); 

    exit(0); 
} 

//METHOD RESULT 
if($method == "result") { 

    $status = $_GET['status']; 

    if($status == "true") { 
     echo "mail sent"; 
    } else { 
     echo "mail not sent"; 
    } 
    ?> 

    <script language="javascript"> 
     setTimeout("location.href = 'http://adteam.altervista.org/home.php';", 5000); 
    </script> 

    <?php 

    exit(0); 
} ?> 

Проблема объясняется в коде PHP (в комментариях ниже метод "SEND").

Есть ли у вас какие-либо предложения?

+0

выполните «var_dump ($ _ GET)» и посмотрите, что такое значение 'method': – Kermit

+0

http://php.net/manual/en/ini.core.php и посмотрите, флаг.Возможно, это помогло бы для выпуска почты –

ответ

1

Вам необходимо остановить выполнение сценария после того, как вы настроили заголовки переадресации. В противном случае он просто продолжит отправку почты и установит новые заголовки переадресации, прежде чем любые заголовки будут отправлены в браузер.

function redirect($location) { 
    if($location) { 
     header("Location: http://mysite.com/home.php?method=result&status=true"); 
    } else { 
     header("Location: http://mysite.com/home.php?method=result&status=false"); 
    } 

    die(); 
} 

Отметьте, что if($location == "true") является видом анти-шаблона; лучше использовать boolean true и false вместо строк.

+0

Это сработало :) Большое спасибо! Я не так хорош с php ... –

0

Должно быть легко. Ваше высказывание, что «ложь». Но это не так: потому что «" истинно, но пустое, что верно. false не задано или не указано false. Так что вы должны сделать:

function redirect($location) { 
     if($location) { 
      header("Location: http://mysite.com/home.php?method=result&status=true"); 
      exit(); 
     } else { 
      header("Location: http://mysite.com/home.php?method=result&status=false"); 
      exit(); 
     } 
} 


And use: redirect(true)/redirect(false); 
+0

. Где, черт возьми, меня забирают? –

+0

Ваш ответ, вероятно, не сработал для него, и он думает, что это reddit? –

+0

Вы были опущены до того, как вы добавили 'exit()' s, который решает * актуальную * проблему. Сравнение строк громоздко, но '' "==" true "' is * not * boolean 'true'. Эта часть должна работать правильно, даже если это было. – JJJ

-1

Просто добавьте exit в ложной отрасли:

function redirect($location) { 
     if($location == "true") { 
      header("Location: http://mysite.com/home.php?method=result&status=true"); 
     } else { 
      header("Location: http://mysite.com/home.php?method=result&status=false"); 
      exit(0); //simply add it here 
     } 
} 

header функция не останавливает дальнейшее исполнение самого по себе, и вы должны прекратить делать что-нибудь еще, если не хотите, чтобы отправить по электронной почте когда что-то не так.

На самом деле вы можете просто добавить оператор exit после if.

0

Строка всегда будет оцениваться как истина, даже если она пуста. Именно поэтому мы проверяем строки, используя empty(), а не isset(). Еще несколько вещей:

  1. Вы должны использовать POST для отправки электронной почты.
  2. Возможно, вам необходимо проверить, действительно ли форма была отправлена ​​до проверки ввода.
  3. Вам следует создавать и отображать конкретные сообщения об ошибках, сообщающие пользователю, какие обязательные поля они не заполнили.
  4. Вы должны запустить некоторые важные процедуры проверки на входе, чтобы избежать использования вашей электронной почты для отправки спама и вредоносного ПО.
+0

Обратите внимание, что ни в какой момент строка не сравнивается с логическим 'true', поэтому ваша точка спорна. – JJJ

+0

@juhana lol, это правда, я не заметил, что OP обернут true в кавычки. Однако OP использует == в противоположность ===, поэтому это не строгое сравнение типов. В любом случае, это неправильный путь, и OP скорее всего не знал, что пустые строки оцениваются как истинные. –

+0

Я знаю, что мой код действительно плохой, но я все еще изучаю PHP. Спасибо за ваши советы :) –

Смежные вопросы