2014-09-08 3 views
0

Я следую книгу о филиппинских и MySQL, но следующий код не работает должным образом:Query выводит PHP код

<html> 
    <head> 
    <title>Book-O-Rama Search Results</title> 
    </head> 
<body> 
<h1>Book-O-Rama Search Results</h1> 
<?php 
//short variables 
$searchtype = $_POST['searchtype']; 
$searchterm = trim($_POST['searchterm']); 

echo $searchterm; 

if(!$searchtype || !$searchterm) { 
    echo 'You have not entered search details.'; 
    exit; 
} 

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

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

if(mysqli_connect_errno()) { 
    echo 'Error: could not connect to the database. Please try again later.'; 
    exit; 
} else { 
    echo "All right"; 
} 

$query = "select * from books where ".$searchtype." like '%".$searchterm."%"; 
$result = $db->query($query); 

$num_results = $result->num_rows; 

echo "<p>Number of books found: ".$num_results."</p>"; 

for($i=0; $i < $num_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></html> 

Он выводит это:

Book-O-Rama Search Results 

query($query); $num_results = $result->num_rows; echo " 
Number of books found: ".$num_results." 

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

"; } $result->free(); $db->close(); ?> 

Я не могу понять, почему, а также echo $searchterm; в начале не выполняется вообще. P.s. Я запускаю скрипт с Xampp localhost.

+1

К сожалению, здесь существует много программ для создания грузиков. Тестирование магических кавычек и произвольное использование «stripslashes» на самом деле не является чем-то необходимым. Использование 'addslashes' является неправильным способом [правильно экранирующих значений] (http://bobby-tables.com/php). При использовании 'mysqli' вы должны использовать параметризованные запросы и [' bind_param'] (http://php.net/manual/en/mysqli-stmt.bind-param.php), чтобы добавить данные пользователя в ваш запрос. ** НЕ используйте ** интерполирование строк, чтобы выполнить это, потому что вы создадите серьезные [SQL-инъекции ошибок] (http://bobby-tables.com/). – tadman

+0

Вы пытались заменить отметки '' "' на одиночные обратные обратки, т. Е. 'Echo '

Количество найденных книг:". $ Num_results. "

"; 'становится' echo'

'. 'Количество найденных книг:'. $ num_results. '

'; ' – aphextwix

+0

@tadman Я просто следую этой книге, так как я новичок в PhP. Этот код показан в книге, чтобы научить, как использовать базу данных с PhP, что-то для новичков. Темы о SQL-инъекции приходят позже. – stephjiayi

ответ

0

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

" like '%".$searchterm."%" 

У вас есть однократное предложение при первом%, не закрывая его после конечного%. Это превращает остальную часть вашего кода в строку.

Помимо этого, я действительно рекомендую вам прочитать This post on sanitizing input. Ваш код нелепо уязвим, особенно если вы отбросили дезинфицированные переменные непосредственно в ваш запрос. Вы должны использовать PDO bound variables для любой переменной, используемой в вашем SQL-запросе. Для вывода вы должны запускать их через htmlspecialchars() (и, вероятно, strip_tags).

Я рекомендую вам взять обновленную книгу на PHP/MYSQL. Ваш код напоминает мне о том, что Сэм обучает себя PHP за 24 часа, которые я купил в 2003 году, - не думал о безопасности и о чисто функциональности.

+0

Не нужно очищать HTML при вставке в базу данных. 'htmlspecialchars' предназначен для использования при отображении содержимого базы данных, а не вставки. – tadman

+0

Справедливая точка; Обновлено. Предположим разбить пост, но отвлекшись и запутавшись. – iamgory

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