MS SQL только короткая форма (начиная с SQL Server 2012):
1=iif( a=b ,1,0)^iif( c=d ,1,0)
Запрос может завершиться ошибкой по разным причинам, и в этом случае и mysql_ *, и расширение mysqli вернут false
из своих соответствующих функций / методов запроса. Вам необходимо проверить это состояние ошибки и обработать его соответствующим образом.
ПРИМЕЧАНИЕ Функции 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 extension
процедурный стиль :
$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 ) {
...
Эти примеры только иллюстрируют , что должно быть сделано ( обработка ошибок), а не как это сделать. Производственный код не должен использовать или die
при выводе HTML, иначе он (по крайней мере) сгенерирует недопустимый HTML. Кроме того, сообщения об ошибках базы данных не должны отображаться пользователям без прав администратора, поскольку они раскрывают слишком много информации .
Ошибка возникла из-за использования одинарных кавычек ('
). Вы можете сформулировать запрос следующим образом:
mysql_query("
SELECT * FROM Users
WHERE UserName
LIKE '".mysql_real_escape_string ($username)."'
");
Для предотвращения SQL-инъекций используется mysql_real_escape_string
.
Хотя для обновленной версии PHP (PHP 5.5.0 и выше) следует использовать расширение MySQLi или PDO_MYSQL, но для более старых версий mysql_real_escape_string
подойдет.
Как объяснил scompt.com, запрос может не сработать. Используйте этот код для получения ошибки запроса или правильного результата:
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("
SELECT * FROM Users
WHERE UserName LIKE '".mysql_real_escape_string($username)."'
");
if($result)
{
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
} else {
echo 'Invalid query: ' . mysql_error() . "\n";
echo 'Whole query: ' . $query;
}
Дополнительную информацию смотрите в документации к mysql_query()
для получения дополнительной информации.
Фактической ошибкой были одинарные кавычки, поэтому переменная $username
не была разобрана. Но вам действительно следует использовать mysql_real_escape_string($username)
, чтобы избежать SQL-инъекций.
Ваш код должен выглядеть примерно так
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM Users WHERE UserName LIKE '$username'";
echo $query;
$result = mysql_query($query);
if($result === FALSE) {
die(mysql_error("error message for the user"));
}
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
После этого вы получите запрос, напечатанный на экране. Попробуйте выполнить этот запрос на своем сервере и посмотрите, дает ли он желаемые результаты. В большинстве случаев ошибка заключается в запросе. Остальная часть кода верна.
Поставьте кавычки вокруг $username
. Строковые значения, в отличие от числовых, должны быть заключены в кавычки.
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
Также нет смысла использовать условие LIKE
, если вы не используете подстановочные знаки: если вам нужно точное совпадение, используйте =
вместо LIKE
.