2012-04-17 4 views
1

В основном я работаю над формой обзора, в которой пользователи заполняют элементы определенного продукта и при отправке формы он вызывает process.php, который проверяет форму и будет отправлять мне по электронной почте, когда вы представлен без ошибок. Затем он возвращает пользователя на страницу формы и либо отображает ошибки, которые были совершены, либо говорит, что он был отправлен успешно, но все это отлично работает, но теперь мне нужно, чтобы форма была заполнена правильно. Я все еще хочу, чтобы электронная почта и возвращаются на страницу формы, но также вставляют данные в мой db. Проверка моей формы работает замечательно, пока я не попробовать и поп-код, чтобы вставить в базу данных, а затем я получаю эти ошибки ...Проверка моей формы PHP и отправка в базу данных

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/XZXZ/support/database.inc:16) in /home/XZXZ/public_html/Reviews/process.php on line 113 

Warning: Cannot modify header information - headers already sent by (output started at /home/XZXZ/support/database.inc:16) in /home/XZXZ/public_html/Reviews/process.php on line 117 

Мне просто нужно знать, где я могу совать это на то, чтобы избежать этих ошибок и все еще все работает нормально. Вот посмотрите на файл process.php:

<?php 

    if(isset($_POST)){ 

     //form validation vars 
     $formok = true; 
     $errors = array(); 

     //sumbission data 
     $ipaddress = $_SERVER['REMOTE_ADDR']; 
     $sub_date = date('d/m/Y'); 
     $sub_time = date('H:i:s'); 

     //form data 
     $sub_date = $_POST['sub_date']; 
     $sub_time = $_POST['sub_time']; 
     $review_title = $_POST['review_title']; 
     $rating = $_POST['rating']; 
     $pros = $_POST['pros']; 
     $cons = $_POST['cons']; 
     $best_uses = $_POST['best_uses']; 
     $comments = $_POST['comments']; 
     $upload = $_POST['upload']; 
     $recommend = $_POST['recommend']; 
     $reviewer_name = $_POST['reviewer_name']; 
     $reviewer_desc = $_POST['reviewer_desc']; 
     $reviewer_loc = $_POST['reviewer_loc']; 



     //form validation to go here.... 

    } 

     //validate review title is not empty 
    if(empty($review_title)){ 
     $formok = false; 
     $errors[] = "You have not entered a title for this review"; 
    } 

     //validate rating is selected 
    if (isset ($_POST['rating']) && ($_POST['rating'] == '')) { 
     $formok = FALSE; 
     $errors[] = "You have not selected a rating for the product"; 
    } 

     //validate pros is not empty 
    if(empty($pros)){ 
     $formok = false; 
     $errors[] = "You have not entered any pros"; 
    } 

     //validate cons is not empty 
    if(empty($cons)){ 
     $formok = false; 
     $errors[] = "You have not entered any cons"; 
    } 

     //validate name is not empty 
    if(empty($reviewer_name)){ 
     $formok = false; 
     $errors[] = "You have not entered your name"; 
    } 

     //validate desc is not empty 
    if(empty($reviewer_desc)){ 
     $formok = false; 
     $errors[] = "You have not entered your description"; 
    } 

     //validate location is not empty 
    if(empty($reviewer_loc)){ 
     $formok = false; 
     $errors[] = "You have not entered your location"; 
    } 

     //send email if all is ok 
    if($formok){ 

     $headers = "From: [email protected]" . "\r\n"; 
     $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 

     $emailbody = "<p>You have received a new product review pending approval from XZXZ.com</p> 
         <p><strong>Review Title: </strong> {$review_title} </p> 
         <p><strong>Rating: </strong> {rating} </p> 
         <p><strong>Pros: </strong> {$pros} </p> 
         <p><strong>Cons: </strong> {$cons} </p> 
         <p><strong>Best Uses: </strong> {$best_uses} </p> 
         <p><strong>Comments: </strong> {$comments} </p> 
         <p><strong>Upload: </strong> {$upload} </p> 
         <p><strong>Recommend: </strong> {$recommend} </p> 
         <p><strong>Name: </strong> {$reviewer_name} </p> 
         <p><strong>Description: </strong> {$reviewer_desc} </p> 
         <p><strong>Location: </strong> {$reviewer_loc} </p> 
         <p>This message was sent from the IP Address: {$ipaddress} on {$date} at {$time}</p>"; 

     mail("[email protected]","New Pending Review",$emailbody,$headers); 

     //insert to database  

     require("/home/XZXZ/support/database.inc"); 

     $SQL="INSERT INTO 'XZXZ_rvs'.'reviews_prod' (sub_date, sub_time, review_title, rating, pros, cons, best_uses, comments, upload, recommend, reviewer_name, reviewer_desc, reviewer_loc) VALUES ('$_POST[$sub_date]','$_POST[$sub_time]','$_POST[$review_title]','$_POST[$rating]','$_POST[$pros]','$_POST[$cons]','$_POST[$best_uses]','$_POST[$comments]','$_POST[$upload]','$_POST[$recommend]','$_POST[$reviewer_name]','$_POST[$reviewer_desc]','$_POST[$reviewer_loc]')"; 

    } 
     //what we need to return back to our form 
    $returndata = array( 
     'posted_form_data' => array( 
      'review_title' => $review_title, 
      'rating' => $rating, 
      'pros' => $pros, 
      'cons' => $cons, 
      'best_uses' => $best_uses, 
      'comments' => $comments, 
      'upload' => $upload, 
      'recommend' => $recommend, 
      'reviewer_name' => $reviewer_name, 
      'reviewer_desc' => $reviewer_desc, 
      'reviewer_loc' => $reviewer_loc 
     ), 
     'form_ok' => $formok, 
     'errors' => $errors 
    ); 
    //if this is not an ajax request 
if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest'){ 

    //set session variables 
    session_start(); 
    $_SESSION['cf_returndata'] = $returndata; 

    //redirect back to form 
    header('location: ' . $_SERVER['HTTP_REFERER']); 

} 
+0

Пожалуйста, пожалуйста, пожалуйста, рассмотреть вопрос о добавлении расширения '.php' в файл database.inc, если кто-то перемещается к этому файлу в своем браузере, он выводит в виде текста плана, отображая все параметры подключения к базе данных! – Dale

+1

Просто так, спасибо за подсказку, я унаследовал этот проект и, как правило, при работе с БД просто закодировал все в один и тот же php-файл, вместо того, чтобы использовать – forevermetal02

+0

@Dale, это не обязательно так. Очень легко установить файлы '.inc', которые будут обрабатываться как PHP (и не показывать источник посетителям). Тем не менее, хорошая практика заключается в том, чтобы поддерживать расширение как значение по умолчанию ('.php'), если вы когда-либо переходите на сервер, который не поддерживает' .htaccess' (или файл '.htaccess' не передается при использовании FTP, из-за его скрытия по умолчанию). – 0b10011

ответ

1

Вы должны добавить сценарий перед тем ничего отправляется в браузер включая пустые строки или пробелы. Это может произойти в случае аварии, если вы закроете файлы сценариев PHP (?>), которые включены перед этим скриптом, а ваш редактор, FTP-клиент или другое приложение добавляет пустую строку в конец файла (что является общим). Чтобы этого не произошло, просто оставите PHP-скрипты открытыми (оставьте ?>, если весь файл является PHP). Также возможно, что причиной является проблема блуждающего echo (или аналогичного, например, print, print_var и т. Д.).

В ваших предупреждениях, похоже, что это происходит в /home/XZXZ/support/database.inc на линии 16.

Кроме того, как коснулся Саурабх, вы необходимо ставить die(); после каждого header("Location: ..."); как функция header() не перенаправляет пользователя - он отправляет только Location: ... как заголовок в браузер, и оставляет его в браузер для сделайте все остальное - сервер, однако, не подозревает, что вы перенаправляете пользователя, поэтому он продолжит запуск сценария. Поэтому вы должны убить скрипт, чтобы предотвратить выполнение какого-либо дополнительного кода.

+0

Также следите за содержимым файлов, которые вы добавляете до 'session_start()'. –

0

Не могли бы вы также рассказать, что у вас есть в /home/XZXZ/support/database.inc. Я не вижу, где вы выполняете запрос. Но, глядя на ошибки, я чувствую, что /home/XZXZ/support/database.inc пытается установить перенаправление. Кроме того, его хорошая практика, чтобы поместить die() после переадресации с помощью header

+0

Saurabh, вот этот файл database.inc ... forevermetal02

+0

Я чувствую, что возможно, что вы не можете подключиться к базе данных и, следовательно, пытаетесь эхо Ошибка. Проверьте имя хоста, имя пользователя и пароль. Убедитесь, что mysql запущен. Также убедитесь, что вы выбрали Db, который я не вижу в коде. –

1

Вы должны положить начало сеанса перед любым HTML тэгом

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