2013-07-26 5 views
2

Я изучаю PHP и MySQL из «PHP и MySQL web dev». В настоящее время я затрудняюсь отображать результаты из базы данных. Вот код:Почему этот запрос не возвращает объект?

<body> 
    <?php 
     $searchtype = $_POST['searchtype']; 
     $seachterm = trim($_POST['searchterm']); 

     if(!$searchtype || !$seachterm){ 
      echo "You did not enter all the details. Bye"; 
      exit; 
     } 

     if(!get_magic_quotes_gpc()){ 
      $searchtype = addslashes($searchtype); 
      $seachterm = addslashes($seachterm); 
     } 

     @ $db = new mysqli('localhost', 'bookorama', 'bookorama123', 'books'); 

     if(mysqli_connect_errno()){ 
      echo "Sorry Could not connect to db"; 
      exit; 
     } 

     $query = "select * from books where".$searchtype."like '%".$seachterm."%'"; 

     $result = $db -> query($query); 

     $num_of_results = $result->num_rows; // Line 47 

     echo "Num of books found is ".$num_of_results." "; 

     for($i = 0; $i < $num_of_results; $i++){ 
      $row = $result -> fetch_assoc(); 
      echo "<p><strong>".($i+1).". Title: "; 
      echo htmlspecialchars(stripslashes($row['title'])); 
      echo "</strong><br />Author: "; 
      echo stripslashes($row['author']); 
      echo "<br />ISBN: "; 
      echo stripslashes($row['isbn']); 
      echo "<br />Price: "; 
      echo stripslashes($row['price']); 
      echo "</p>"; 
     } 

     $result->free(); 
     $db -> close(); 
    ?> 
</body> 

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

Notice: Trying to get property of non-object in /opt/lampp/htdocs/xampp/php/php_crash/phptomysql/connect.php on line 47 
Num of books found is 
Fatal error: Call to a member function free() on a non-object in /opt/lampp/htdocs/xampp/php/php_crash/phptomysql/connect.php on line 64 

Что я делаю неправильно?

ответ

2

Возможно, что ошибка в вашем SQL-запросе, а $result - false вместо объекта результата.

Я думаю, что это, вероятно, потому, что в запросе отсутствует пробел. Эта линия:

$query = "select * from books where".$searchtype."like '%".$seachterm."%'"; 

должно быть что-то вроде:

$query = "SELECT * FROM books WHERE '" .$searchtype. "' LIKE '%".$seachterm."%'"; 

Это помогло бы, если бы мы знали значения:

$_POST['searchtype']; 
$_POST['searchterm']; 
+0

О, так глупо от меня. Большое спасибо. Понял. MySQL требует пробелов между ключевыми словами и переменными строками. Наверное, это была опечатка. В любом случае спасибо, что заметили. –

+0

Да, конечно. Для этого требуется 5 минут. –

1

Вы не проверяя, чтобы убедиться, что $result является что вы думаете. Очень вероятно, что с вашим запросом что-то пошло не так, а возвращаемое значение $db->query() - false. Это хорошая идея, чтобы проверить, чтобы убедиться, что ваш запрос действительно работал.

Попробуйте использовать этот код:

$result = $db->query($query); 
if ($result === false) { 
     // Query failed - we can't continue 
     die('My query failed, I want to be a teapot instead.'); 
} 

// Now it's safe to operate on $result, deal with a successful query, but no results 
if ($result->num_rows == 0) { 
     echo 'no results found.'; 
     // display any other output, search again? 
     exit; 
} 

// At this point you have results to display 

Теперь, почему ваш запрос не удается, посмотрите на эту часть близко:

"select * from books where".$searchtype."like '%" 

Вам нужны пробелы. Если $searchtype был 'Foo', ваш запрос будет фактически расширяться:

select * from books wherefoolike 

Попробуйте вместо этого:

"select * from books where ".$searchtype." like '%" 

Обратите внимание на пространство после того, как 'где' и перед 'как'? Вероятно, это исправить.

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

+0

Спасибо, я буду применять эти лучшие практики с этого момента. –

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