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

960

Я пытаюсь выбрать данные из таблицы MySQL, но получаю одно из следующих сообщений об ошибке:

mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, учитывая логическое значение

Это мой код:

$username = $_POST['username'];
$password = $_POST['password'];

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

while($row = mysql_fetch_array($result)) {
    echo $row['FirstName'];
}
iamjonesy
источник
15
Вы можете получить более полезные сообщения, используя :: QUERY или die (mysql_error ());
ник
123
Также обязательное примечание: Ваш код подвержен SQL-инъекции . Вы должны проверить и / или избежать пользовательского ввода. Посмотрите на mysql_real_escape_string. Никогда не доверяйте пользовательским данным.
Феликс Клинг
7
На самом деле, код OP вызывает синтаксическую ошибку на сервере MySQL, но, по крайней мере, он не уязвим для SQL-инъекций, потому что одинарные кавычки не имеют переменной интерполяции.
Сзгал
4
@FelixKling Я понимаю, что это очень старая и, вероятно, самая точная из возможных в то время, но ваш комментарий теперь опасно неверен с одной стороны: mysql_real_escape_stringэто не является основной защитой SQL-инъекций; это все еще уязвимо для многих нападений. (Нет, вы никогда не говорили, что это идеально, но вы подразумевали, что это единственное необходимое решение) Насколько мне известно, сейчас наилучшим решением является PDO.
Фонд Моника иск
2
Гах. Расширение этого вопроса для включения MySQLi и PDO было плохой идеей. Каждый из них имеет свой немного различающийся синтаксис и сообщения об ошибках, и у них вполне могут быть свои вопросы. Объединение всего в один гигантский вопрос, состоящий из трех частей, делает этот Google менее интересным и заставляет людей, которые приезжают сюда, пробираться через нерелевантный контент, чтобы получить то, что они хотят. Он также лишает законной силы многие ответы ниже и делает этот вопрос «слишком широким» по стандартам, которые мы обычно применяем. Это беспорядок, на мой взгляд, но уже слишком поздно, чтобы исправить.
Марк Амери

Ответы:

667

Запрос может завершиться ошибкой по разным причинам, и в этом случае 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 ) {
        ...

оо-стиль :

$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. Кроме того, сообщения об ошибках базы данных не должны отображаться для пользователей, не являющихся администраторами, так как они раскрывают слишком много информации .

Эдвард Дейл
источник
9
Правильно, но использование die () в случае сбоя запроса - это слишком много.
2ndkauboy
28
Я собирался разработать полный механизм обработки ошибок для OP, но решил, что это может быть за рамками моего ответа.
Эдвард Дейл
@ scompt.com Да, это также рассматривается в нескольких других ответах. Я предполагаю, что просто подчеркивал, что, поскольку это принятый ответ на вопрос высокой видимости, в дополнение к (превосходному) совету о том, как правильно отлавливать ошибки в будущем, он должен (ИМХО) фактически ответить на конкретный вопрос (т.е. объясните, почему в этом случае есть ошибка).
Сепстер
2
Вместо if($result === FALSE)тебя можно использовать if(! $result). Поправь меня если я не прав
анев
1
mysql_query (): расширение mysql устарело и будет удалено в будущем: используйте mysqli
Greg
165

Это сообщение об ошибке отображается, когда в вашем запросе есть ошибка, которая вызвала его сбой. Это проявится при использовании:

  • mysql_fetch_array/mysqli_fetch_array()
  • mysql_fetch_assoc()/mysqli_fetch_assoc()
  • mysql_num_rows()/mysqli_num_rows()

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

Действия по устранению неполадок

  • Убедитесь, что ваш сервер разработки настроен для отображения всех ошибок. Вы можете сделать это, помещая это в верхней части файлов или в конфигурационном файле: error_reporting(-1);. Если у вас есть какие-либо синтаксические ошибки, это укажет их вам.

  • Использование mysql_error(). mysql_error()сообщит о любых ошибках, обнаруженных MySQL при выполнении вашего запроса.

    Пример использования:

    mysql_connect($host, $username, $password) or die("cannot connect"); 
    mysql_select_db($db_name) or die("cannot select DB");
    
    $sql = "SELECT * FROM table_name";
    $result = mysql_query($sql);
    
    if (false === $result) {
        echo mysql_error();
    }
  • Запустите ваш запрос из командной строки MySQL или из такого инструмента, как phpMyAdmin . Если в вашем запросе есть синтаксическая ошибка, это скажет вам, что это такое.

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

  • Убедитесь, что вы избегаете своих ценностей. Кавычки в вашем запросе могут привести к сбою запроса (а также оставить вас открытыми для SQL-инъекций). Используйте, mysql_real_escape_string()чтобы избежать вашего ввода.

  • Убедитесь , что вы не смешиваясь mysqli_*и mysql_*функции. Они не одно и то же и не могут использоваться вместе. (Если вы собираетесь выбрать ту или иную палку mysqli_*. См. Ниже, почему.)

Другие советы

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

Джон Конде
источник
1
Учитывая этот вопрос сегодня stackoverflow.com/q/43804651/1415724 и другие подобные в последнее время; Я думаю, что, возможно, стоит обновить ваш ответ, чтобы он содержал что-то вроде «Эта ошибка также может быть вызвана не выполнением запроса с mysql_query()/ mysqli_query($connection)и т. Д.» ; мысли? Поскольку ни один другой ответ в этом Q & A не упоминает об этом.
Funk Forty
111

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

mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

Используется mysql_real_escape_stringдля предотвращения внедрения SQL. Хотя мы должны использовать расширение MySQLi или PDO_MYSQL для обновленной версии PHP (PHP 5.5.0 и более поздних версий), но для более старых версий все mysql_real_escape_stringполучится.

Nik
источник
5
Зачем добавлять шум с конкатенацией строк, а не просто помещать переменную в строку запроса?
Маттео Рива
1
@Matteo Riva Да, но я подумал, что это немного более чистый способ отделения переменных от строки. :)
Ник
60

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

2ndkauboy
источник
52

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

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

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

Маттео Рива
источник
2
А что если $ username имеет вид: "'; DROP TABLES;" ? Это преимущество использования подготовленных утверждений и связанных значений, которые, я думаю, хотелось бы сохранить.
HoldOffHunger
42

Пожалуйста, проверьте, если база данных не выбрана, потому что иногда база данных не выбрана.

Проверьте

mysql_select_db('database name ')or DIE('Database name is not available!');

перед запросом MySQL, а затем перейти к следующему шагу

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

f($result === FALSE) {
    die(mysql_error());
Ясин
источник
40

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

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

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

Chaitannya
источник
3
Не используйте этот код. Он широко открыт для атак с использованием SQL-инъекций.
Брэд
34
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

Вы определяете строку, используя одинарные кавычки, а PHP не анализирует строки, разделенные одинарными кавычками. Чтобы получить переменную интерполяцию, вам нужно использовать двойные кавычки ИЛИ конкатенацию строк (или их комбинацию). Смотрите http://php.net/manual/en/language.types.string.php для получения дополнительной информации.

Также вы должны убедиться, что mysql_query вернул допустимый ресурс результата, иначе fetch_ *, num_rows и т. Д. Не будут работать с результатом, поскольку это не результат! IE:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

if( $result === FALSE ) {
   trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
   while( $row = mysql_fetch_array($result) ) {
      echo $row['username'];
   }
}

http://us.php.net/manual/en/function.mysql-query.php для получения дополнительной информации.

derokorian
источник
2
Не используйте этот код, даже если вы добавляете кавычки. Он широко открыт для атак с использованием SQL-инъекций.
Брэд
33

Этот запрос должен работать:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Проблема заключается в одинарных кавычках, поэтому ваш запрос не выполняется и возвращает FALSE, а ваш цикл WHILE не может быть выполнен. Использование% позволяет сопоставить любые результаты, содержащие вашу строку (например, SomeText- $ username-SomeText).

Это просто ответ на ваш вопрос, вы должны реализовать материал, упомянутый в других постах: обработку ошибок, использование escape-строк (пользователи могут вводить в поле все что угодно, и вы ДОЛЖНЫ убедиться, что это не произвольный код), использовать PDO вместо mysql_connect который сейчас ограничен.

Энис П. Агинич
источник
27
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error());

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Иногда подавление запроса как @mysql_query(your query);

Дип Похрел
источник
3
Не используйте этот код. Он широко открыт для атак с использованием SQL-инъекций.
Брэд
27

Если вы попробовали все здесь, и это не работает, вы можете проверить сопоставление базы данных MySQL. Мой был установлен на шведскую сортировку. Затем я изменил его на utf8_general_ciи все просто включилось.

kolexinfos
источник
25
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";

while( $data = mysql_fetch_array($query))
{
    echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>");      
}

Вместо использования запроса WHERE вы можете использовать этот запрос ORDER BY. Это гораздо лучше, чем это для использования запроса.

Я сделал этот запрос и не получаю ошибок, таких как параметр или логическое значение.

Gears.of.Codes
источник
Не забудьте использовать htmlspecialchars()при использовании произвольных данных в контексте HTML. В противном случае вы рискуете создать действительный HTML, когда в данных используются зарезервированные символы.
Брэд
25

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

$username = $_POST['username'];
$password = $_POST['password'];

$sql = "SELECT * from Users WHERE UserName LIKE '$username'";
$result = mysql_query($sql,$con);

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}
Амджад Омари
источник
8
1) Широко открыты для внедрения SQL, 2) не включает обработку ошибок, которая вызывает ошибку в случае OP.
deceze
+1. @deceze Да, это широко открыто. Но не более того, что код OP или принятый ответчик ;-) И это не отсутствие обработки ошибок в коде OP, вызывающее ошибку ... это ошибка , и этот ответ, по крайней мере, пытается ее устранить (поставив одиночный кавычки вокруг строкового литерала в LIKEвыражении).
Сепстер
1
+1 Пожалуйста, добавьте пробел между LIKE и '$ username', остальные, видимо, в порядке, кроме SQL-инъекции. Почему бы не использовать = вместо оператора LIKE имя пользователя должно точно совпадать
asim-ishaq
21

Там может быть две причины:

  1. Открыли ли вы соединение с базой данных до вызова функции mysql_query? Я не вижу этого в вашем коде. Используйте mysql_connect перед выполнением запроса. Видетьphp.net/manual/en/function.mysql-connect.php

  2. Переменная $ username используется внутри одной строки кавычек, поэтому ее значение не будет оцениваться внутри запроса. Запрос определенно потерпит неудачу.

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

Асим-Исхак
источник
20

Попробуйте следующий код. Это может работать нормально.

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}
Рави
источник
4
Этот код подвержен внедрению SQL и не должен использоваться.
Брэд
15

Иди к своему config.php. У меня такая же проблема. Проверьте имя пользователя и пароль, а также выберите sql select с тем же именем, что и в конфигурации.

user2835116
источник
15

Не используйте ограниченную функцию mysql_ * (исключено в php 5.5 будет удалено в php 7). и вы можете сделать это с MySQL или PDO

вот полный запрос выбора

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        // code here 
    }
} else {
    echo "0 results";
}
$conn->close();
?>
Манодж Кумар
источник
В вашем сообщении не рассматриваются проблемы, затронутые вопросом: недопустимый запрос и неправильная отчетность об ошибках. Этот пост не по теме.
Пол Шпигель
14
<?php
    $username = $_POST['username'];
    $password = $_POST['password'];
    $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".$username."'");

    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
?>

И если есть пользователь с уникальным именем пользователя, вы можете использовать «=» для этого. Там нет необходимости любить.

Ваш запрос будет:

mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'");
Джанак Праджапати
источник
3
Этот код широко открыт для внедрения SQL и не должен использоваться.
Брэд
@AnujGarg Этот код принимает прямой ввод и объединяет его в запрос. Кто-то может написать свой собственный SQL в данных поста, usernameи он будет выполнен.
Брэд
Так что же использовать для предотвращения внедрения кода SQL?
Анудж Гарг
14

Включите переменную строки соединения перед запросом MySQL. Например, $conntв этом коде:

$results = mysql_query($connt, "SELECT * FROM users");
Durairaj
источник
1
Это не решает проблемы в вопросе. Это также неправильно и вызовет еще одну ошибку.
Пол Шпигель
12

Каждый раз, когда вы получаете ...

«Предупреждение: mysqli_fetch_object () ожидает, что параметр 1 будет mysqli_result, учитывая логическое значение»

... вероятно, потому что есть проблема с вашим запросом. prepare()Или query()может вернуться FALSE(булево), но это общее сообщение об ошибке не оставит вас много на пути разгадки. Как вы узнаете, что не так с вашим запросом? Вы спрашиваете !

Прежде всего, убедитесь, что отчеты об ошибках включены и видимы: добавьте эти две строки вверху ваших файлов сразу после открывающего <?phpтега:

error_reporting(E_ALL);
ini_set('display_errors', 1);

Если ваше сообщение об ошибке установлено в php.ini, вам не придется беспокоиться об этом. Просто убедитесь, что вы корректно обрабатываете ошибки и никогда не раскрываете истинную причину каких-либо проблем для ваших пользователей. Раскрытие истинной причины для общественности может быть приглашением с золотой гравировкой для тех, кто хочет навредить вашим сайтам и серверам. Если вы не хотите отправлять ошибки в браузер, вы всегда можете отслеживать журналы ошибок вашего веб-сервера. Расположение журналов зависит от сервера, например, в Ubuntu журнал ошибок обычно находится по адресу /var/log/apache2/error.log. Если вы просматриваете журналы ошибок в среде Linux, вы можете использовать их tail -f /path/to/logв окне консоли, чтобы увидеть ошибки, возникающие в режиме реального времени .... или по мере их возникновения.

Как только вы возьметесь за стандартную отчетность об ошибках, добавив проверку ошибок в вашем соединении с базой данных и запросах, вы получите гораздо более подробную информацию о возникающих проблемах. Посмотрите на этот пример, где имя столбца неверно. Во-первых, код, который возвращает общее фатальное сообщение об ошибке:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

Ошибка носит общий характер и не очень помогает вам решить, что происходит.

С помощью пары строк кода вы можете получить очень подробную информацию, которую можно использовать для немедленного решения проблемы . Проверьте prepare()утверждение на правдивость, и если оно хорошее, вы можете перейти к обязательному исполнению и исполнению.

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
    // handle error
}

Если что-то не так, вы можете выложить сообщение об ошибке, которое приведет вас непосредственно к проблеме. В этом случае fooстолбца в таблице нет, решение задачи тривиально.

При желании вы можете включить эту проверку в функцию или класс и расширить ее, корректно обработав ошибки, как упоминалось ранее.

Джей Бланшар
источник
2
Как вы можете написать «Просто убедитесь, что вы корректно обрабатываете ошибки и никогда не раскрываете истинную причину каких-либо проблем для ваших пользователей». а echo $error;в одном посте?
Пол Шпигель
Спасибо за внимание @PaulSpiegel. Прошло много времени с тех пор, как я написал или повторно посетил ответ и пропустил, что я оставил эхо там.
Джей Бланшар
11
<?php
      $username = $_POST['username'];
       $password = $_POST['password'];

     $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error());
while($row=mysql_fetch_array($result))
  {
 echo $row['FirstName'];
 }
 ?>
Деннис Киптуген
источник
11

Попробуй это

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username');

if($result){
while($row = mysqli_fetch_array($result))
{
    echo $row['FirstName'];
}
}
Суреш
источник
4
@panjehra mysql_ * теперь удален и будет удален из php 7. Используйте mysqli_ * вместо этого
Манодж Кумар
9

Сначала проверьте ваше соединение с базой данных. Это связано успешно или нет?

Если это сделано, то после этого я написал этот код, и он работает хорошо:

if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
    $Q1mrks = $_GET['q1mrks'];
    $marks = $_GET['marks'];
    $qt1 = $_GET['qt1'];

    $qtype_qry = mysql_query("
        SELECT *
        FROM s_questiontypes
        WHERE quetype_id = '$qt1'
    ");
    $row = mysql_fetch_assoc($qtype_qry);
    $qcode = $row['quetype_code'];

    $sq_qry = "
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        ORDER BY RAND() LIMIT $Q1mrks
    ";
    $sq_qry = mysql_query("
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        LIMIT $Q1mrks
    ");
    while ($qrow = mysql_fetch_array($sq_qry)) {
        $qm = $qrow['marks'] . "<br />";
        $total += $qm . "<br />";
    }
    echo $total . "/" . $marks;
}
Питер Мортенсен
источник
2
Не используйте этот код. Он широко открыт для атак с использованием SQL-инъекций.
Брэд
9

Убедитесь, что вы не закрываете базу данных с помощью db_close (), прежде чем запускать свой запрос:

Если вы используете несколько запросов в сценарии, даже если вы включаете другие страницы, которые содержат запросы или соединение с базой данных, возможно, что в любом месте вы используете db_close (), которая закроет ваше соединение с базой данных, поэтому убедитесь, что вы не делать эту ошибку в ваших сценариях.

A.Aleem11
источник
7

Если у вас не возникает ошибка MySQL при проверке, убедитесь, что вы правильно создали таблицу базы данных. Это случилось со мной. Ищите любые нежелательные запятые или цитаты.

user1012181
источник
6

Сначала проверьте ваше соединение.

Затем, если вы хотите получить точное значение из базы данных, вы должны написать:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`");

Или вы хотите получить LIKEтип значения, тогда вы должны написать:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
Omdev
источник
3
Этот код широко открыт для внедрения SQL и не должен использоваться.
Брэд
5

Вы также можете проверить, как $resultпроисходит сбой, перед тем как выполнить массив извлечения

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
if(!$result)
{
     echo "error executing query: "+mysql_error(); 
}else{
       while($row = mysql_fetch_array($result))
       {
         echo $row['FirstName'];
       }
}
user28864
источник
3
Не используйте этот код. Он широко открыт для атак с использованием SQL-инъекций.
Брэд
Но если код работает, я чувствую, что вы должны отредактировать код и ввести необходимые фильтры, а не подвергать критике код.
user28864
Простое использование фильтров не исправит то, что не так с этим кодом. Лучшее решение - использовать подготовленные / параметризованные запросы с PDO или аналогичными. Я не вижу смысла исправлять это, поскольку правильный ответ уже был опубликован здесь. В идеале этот ответ будет удален. Тем не менее, вы можете исправить свой ответ, и я с радостью проголосую, если он будет правильным.
Брэд
Ну, если вы чувствуете, что ответ не стоит рассматривать, вы можете пойти дальше и прочитать его. Тем не менее, я думал, что весь смысл этого сообщества состоит в том, чтобы делиться знаниями. Если у вас есть чем поделиться, вместо того, чтобы показывать и отталкивать людей.
user28864
2
Вы правы, весь смысл этого сообщества - делиться знаниями. Вот почему добавил объяснение с моим downvote, а также объяснил, почему предложение вашего фильтра было недостаточно. Я бы предпочел предупредить вас, как и всех, кто находит ваш ответ, что приведенный выше код небезопасен. Всем лучше изучать правильные методы, чем увековечивать плохой код. И я не могу удалить ваш ответ, как и я. Это зависит от вас, если вы решите это сделать.
Брэд
3

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

include_once(db_connetc.php');

ИЛИ

// Create a connection
$connection = mysql_connect("localhost", "root", "") or die(mysql_error());

//Select database
mysql_select_db("db_name", $connection) or die(mysql_error());

$employee_query = "SELECT * FROM employee WHERE `id` ='".$_POST['id']."'";

$employee_data = mysql_query($employee_query);

if (mysql_num_rows($employee_data) > 0) {

    while ($row = mysql_fetch_array($employee_data)){
        echo $row['emp_name'];
    } // end of while loop
} // end of if
  • Рекомендуется выполнить запрос в sqlyog, а затем скопировать его в код своей страницы.
  • Всегда сохраняйте ваш запрос в переменной, а затем выводите эту переменную. Затем перейдите к mysql_query($query_variable);.
Энгр Зардари
источник
2
1) Вы не знаете, голосовал ли я или нет на каком-либо ответе здесь, вверх или вниз. 2) Как я объяснил в своем первом комментарии; ваш ответ не ссылается на проблему ( логическое значение передано mysql_fetch_array ), и у вас есть синтаксические ошибки
Фил
2
В обоих примерах кода у вас неверные кавычки. Подсветка синтаксиса, примененная к вашему второму блоку кода, - это полный упадок, что что-то не так
Фил
4
Этот код подвержен внедрению SQL и не должен использоваться. @EngrZardari Если вы используете этот код в своих производственных системах, вы, несомненно, были взломаны и должны исправить ситуацию, используя подготовленные / параметризованные запросы с PDO или подобным. Есть боты, которые имеют автоматическое тестирование на такие уязвимости.
Брэд
1
@EngrZardari О вашем "нет никакой ошибки, я вставил сюда код, который я сейчас использую." комментарий выше. В запросе отсутствовала цитата, которую я исправил. Это вызвало бы ошибку разбора (PHP).
Фанк сорок девятого
2

Традиционно PHP был терпим к плохой практике и ошибкам в коде, что делает отладку довольно сложной. Проблема в этом конкретном случае заключается в том, что mysqli и PDO по умолчанию не сообщают вам, когда запрос не выполнен, и просто возвращаются FALSE. (Я не буду говорить об ограниченном расширении mysql . Поддержка подготовленных операторов является достаточной причиной для переключения либо на PDO, либо на mysqli .) Но вы можете изменить поведение PHP по умолчанию, чтобы всегда выдавать исключения при сбое запроса.

Для PDO : используйте$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

error_reporting(E_ALL);

$pdo = new PDO("mysql:host=localhost;dbname=test", "test","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$result = $pdo->query('select emal from users');
$data = $result->fetchAll();

Это покажет вам следующее:

Неустранимая ошибка: необработанное исключение «PDOException» с сообщением «SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец« emal »в« списке полей »в E: \ htdocs \ test \ mysql_errors \ pdo.php в строке 8

PDOException: SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «emal» в «списке полей» в E: \ htdocs \ test \ mysql_errors \ pdo.php в строке 8

Как видите, он точно говорит вам, что не так с запросом, и где это исправить в вашем коде.

Без $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); тебя получишь

Неустранимая ошибка: вызов функции-члена fetchAll () для логического значения в E: \ htdocs \ test \ mysql_errors \ pdo.php в строке 9

Для MySQL : используйтеmysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

error_reporting(E_ALL);

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'test', '', 'test');

$result = $mysqli->query('select emal from users');
$data = $result->fetch_all();

Ты получишь

Неустранимая ошибка: необработанное исключение «mysqli_sql_exception» с сообщением «Неизвестный столбец« emal »в« списке полей »в E: \ htdocs \ test \ mysql_errors \ mysqli.php в строке 8

mysqli_sql_exception: неизвестный столбец 'emal' в 'списке полей' в E: \ htdocs \ test \ mysql_errors \ mysqli.php в строке 8

Без mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);вас только получить

Неустранимая ошибка: вызов функции-члена fetch_all () для логического значения в E: \ htdocs \ test \ mysql_errors \ mysqli.php в строке 10

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

Пол Шпигель
источник
1

Попробуйте этот код, он работает нормально

присвойте переменную post переменной

   $username = $_POST['uname'];

   $password = $_POST['pass'];

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

if(!empty($result)){

    while($row = mysql_fetch_array($result)){
        echo $row['FirstName'];
     }
}
Ритеш д Джоши
источник
3
Этот код подвергается атакам SQL-инъекций и не должен использоваться.
Брэд