Запрос может завершиться ошибкой по разным причинам, и в этом случае mysql_ * и расширение mysqli вернут false
из соответствующих функций / методов запроса. Вам необходимо проверить это условие ошибки и обработать его соответствующим образом.
mysql_ * расширение :
ПРИМЕЧАНИЕ Функции mysql_ устарели и удалены в php версии 7.
Проверьте $result
, прежде чем передать его на mysql_fetch_array
. Вы обнаружите, что это false
, потому что запрос не выполнен. См. Документацию mysql_query
для возможных возвращаемых значений и предложения о том, как с ними обращаться.
$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if($result === FALSE) {
die(mysql_error()); // TODO: better error handling
}
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
расширение mysqli
процедурный стиль :
$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");
// mysqli_query returns false if something went wrong with the query
if($result === FALSE) {
yourErrorHandler(mysqli_error($mysqli));
}
else {
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
oo-style :
$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if($result === FALSE) {
yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
с использованием подготовленного заявления:
$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) {
yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else if ( !$stmt->bind_param('s', $_POST['username']) ) {
yourErrorHandler($stmt->error); // or $stmt->error_list
}
else if ( !$stmt->execute() ) {
yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
$result = $stmt->get_result();
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
Эти примеры только иллюстрируют , что следует сделать (обработка ошибок), а не как это сделать. Рабочий код не должен использовать or die
при выводе HTML, иначе он будет (по крайней мере) генерировать недопустимый HTML. Кроме того, сообщения об ошибках базы данных не должны отображаться для пользователей, не являющихся администраторами, так как раскрывает слишком много информации .