2015-04-21 2 views
2

Я пытаюсь создать страницу, чтобы пользователи могли оставлять отзывы для книг. Я проверяю, что поля не пусты, имя пользователя существует в таблице users, а идентификатор книги существует в таблице книг. Если все это пройдет, я хочу ввести обзор в таблицу отзывов.пользовательский обзор не входит в базу данных с использованием PDO

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

Вот код:

require_once __DIR__.'/config.php'; 
session_start(); 
$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD); 

$book = $_POST["book_id"]; 
$username = $_POST["user"]; 
$review = $_POST["review"]; 
$rating = $_POST["rating"]; 

if (empty($book) || empty($username) || empty($review) || empty($rating)) { 
    $error = "Complete all fields";  
} 

if ($rating > 5 || $rating < 0) { 
    $error = "Please enter a rating between 1 and 5"; 
} 

if (!isset($error)){ 
    //no error 
    $stmt = $dbh->prepare("SELECT username FROM users WHERE username = :user"); 
    $stmt->bindParam(':user', $username); 
    $stmt->execute(); 
} else { 
    $error = "user does not exsist"; 
} 

if (!isset($error)){ 
    //no error 
    $stmt = $dbh->prepare("SELECT b_id FROM users WHERE b_id = :book_id"); 
    $stmt->bindParam(':book_id', $book); 
    $stmt->execute(); 
} else { 
    $error = "Book does not exsist, please enter another ID"; 
}  

if (!isset($error)) { 
    $sql = 'INSERT INTO reviews (book_id ,username, review, rating) VALUES (:book_id,:user,:review,:rating)';  
    $query = $dbh->prepare($sql); 

    $query->execute(array(
     ':book_id' => $book, 
     ':user' => $username, 
     ':review' => $review, 
     ':rating' => $rating  
    )); 
} else { 
    echo "error occured: ".$error; 
    exit(); 
} 

Я хочу проверки должны быть сделаны и информация, которая будет введена в базу данных, может кто-нибудь показать мне, как это сделать, пожалуйста?

+0

Ваш код не появляется, чтобы генерировать какой-либо вывод в том случае, если не произошло никаких ошибок. Пробовали ли вы проверку таблицы 'review', чтобы увидеть, были ли вставлены новые записи? –

+0

Да, его еще пустой набор. – stark

+1

Рассмотрите возможность использования 'print_r ($ dbh-> errorInfo());' для отладки ваших запросов. Добавьте эту строку после каждой команды 'prepare' и поделитесь с нами выходом. –

ответ

1

Согласно выводу ошибки последнего запроса, кажется, что таблица обзоров не имеет username поля. Что также логично - я считаю, что это должно быть что-то вроде user_id (как отношение PK).

Query 1 Error output: Array ([0] => 00000 [1] => [2] =>) 
Query 2 Error output: Array ([0] => 00000 [1] => [2] =>) 
Query 3 Error output: Array ([0] => 42S22 [1] => 1054 [2] => Unknown column 'username' in 'field list') 

Запрос:

$sql = 'INSERT INTO reviews (book_id ,username, review, rating) VALUES (:book_id,:user,:review,:rating)';  
    $query = $dbh->prepare($sql); 

ошибка, как указано в:

Unknown column 'username' in 'field list' 
1

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

try { 
    $dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD); 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 
+0

Нет ошибки, я могу подключиться к базе данных. – stark

+1

Лучше всего это делать в любом случае. – psycotik

+0

Спасибо, я буду использовать это на остальных моих страницах. – stark

1

Ваша обработка ошибок, так как она не может работать. Давайте посмотрим на пример:

if (!isset($error)){ 
    //no error 
    $stmt = $dbh->prepare("SELECT username FROM users WHERE username = :user"); 
    $stmt->bindParam(':user', $username); 
    $stmt->execute(); 
} else { 
    $error = "user does not exsist"; 
} 

Прежде всего, +1 для использования подготовленных операторов с привязками параметров! Если интерпретировать код правильно, что вы хотите этот код, чтобы сделать это следующим образом:

  1. Проверка пользователя с именем $username существует
  2. Установите переменную $error к значению "user does not exist", когда пользователь не существует, в противном случае оставить $error undefined.

Что ваш код фактически делает является следующее:

  1. Если не произошло никакой предыдущей ошибки (if(!isset($error))) выберите пользователя с именем $username и отбрасывать результат
  2. Если предыдущая ошибка сделал произойти (else), не проверить, существует ли пользователь, но безоговорочно перезаписать переменную $error.

Что вы нужно сделать это оценить результат вашего запроса, чтобы проверить, если пользователь на самом деле существует (заметьте, что вы в настоящее время выполнить запрос SQL, но не оценивать ее результаты в любом случае):

$stmt = $dhb->prepare("SELECT COUNT(1) FROM users WHERE username = :user"); 
$stmt->bindParam(':user', $username); 
$stmt->execute(); 

$userCount = $stmt->fetchColumn(); 
if ($userCount == 0) { 
    $error = "User does not exist"; 
} 

Кроме того, вы не проверяете успех окончательного заявления INSERT. Это означает, что если этот последний SQL-запрос завершится с ошибкой, вы не получите какой-либо выход ошибки.

Самый простой способ (имхо), чтобы добавить обработку для PDO запросов ошибка заключается в настройке PDO бросить исключение на ошибку, установив режим ошибки:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

В этом случае каждый запрос PDO сгенерирует исключение на ошибках SQL, которые вы можете поймать и процесс в приложении:

$sql = 'INSERT INTO reviews (book_id ,username, review, rating) VALUES (:book_id,:user,:review,:rating)';  
$query = $dbh->prepare($sql); 

try { 
    $query->execute(array(
     ':book_id' => $book, 
     ':user' => $username, 
     ':review' => $review, 
     ':rating' => $rating  
    )); 
} catch (PDOException $e) { 
    // Process exception $e as you see fit. 
} 
+0

Мы нашли ошибку;) –

+0

Drat, слишком поздно! ;) – helmbert

+0

Хотя основная проблема исправлена, это касалось вторичной проблемы в моем коде, о которой я не знал, это очень полезно, спасибо! – stark

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