mysql_fetch_array ()/mysql_fetch_assoc ()/mysql_fetch_row ()/mysql_num_rows и т.д. … ожидает, что параметр 1 будет ресурсом или результатом

MS SQL только короткая форма (начиная с SQL Server 2012):

1=iif( a=b ,1,0)^iif( c=d ,1,0)
940
задан AbraCadaver 17 January 2019 в 19:58
поделиться

5 ответов

Запрос может завершиться ошибкой по разным причинам, и в этом случае и mysql_ *, и расширение mysqli вернут false из своих соответствующих функций / методов запроса. Вам необходимо проверить это состояние ошибки и обработать его соответствующим образом.

mysql_ * extension :

ПРИМЕЧАНИЕ Функции 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. Кроме того, сообщения об ошибках базы данных не должны отображаться пользователям без прав администратора, поскольку они раскрывают слишком много информации .

659
ответ дан 19 December 2019 в 20:20
поделиться

Ошибка возникла из-за использования одинарных кавычек ('). Вы можете сформулировать запрос следующим образом:

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 подойдет.

110
ответ дан 19 December 2019 в 20:20
поделиться

Как объяснил 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-инъекций.

61
ответ дан 19 December 2019 в 20:20
поделиться

Ваш код должен выглядеть примерно так

$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'];
}

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

41
ответ дан 19 December 2019 в 20:20
поделиться

Поставьте кавычки вокруг $username. Строковые значения, в отличие от числовых, должны быть заключены в кавычки.

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

Также нет смысла использовать условие LIKE, если вы не используете подстановочные знаки: если вам нужно точное совпадение, используйте = вместо LIKE.

54
ответ дан 19 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: