Как исправить этот mysqli_fetch_all () ожидает, что параметр 1 будет ошибкой mysqli_result [duplicate]

Вы можете запустить phantomjs в узле, который является браузером безглавых веб-китов. Затем запустите jsrepl внутри фантомов.

871
задан Rakibul Haq 24 April 2018 в 10:15
поделиться

27 ответов

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

618
ответ дан Community 16 August 2018 в 07:58
поделиться
  • 1
    Правильно, но с использованием die (), если запрос не удается, это немного. – 2ndkauboy 4 June 2010 в 11:28
  • 2
    Я собирался разработать целый механизм обработки ошибок для OP, но решил, что это может оказаться вне сферы моего ответа. – scompt.com 4 June 2010 в 11:29
  • 3
    Вниз, потому что мы не должны предлагать решения с уязвимостями кода SQL-инъекций? – svandragt 3 September 2013 в 16:16
  • 4
    Вместо if($result === FALSE) вы можете использовать if(! $result). Поправьте меня если я ошибаюсь – anestv 17 June 2014 в 13:52
  • 5
    mysql_query (): расширение mysql устарело и будет удалено в будущем: используйте mysqli – Greg 25 December 2014 в 18:24

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

mysql_ * extension :

ПРИМЕЧАНИЕ Функции mysql_ устарели и были удалены в версии 7 php.

Перед передачей mysql_fetch_array проверьте $result. Вы обнаружите, что это 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 ) {
      ...

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

618
ответ дан Community 16 August 2018 в 07:58
поделиться
  • 1
    Правильно, но с использованием die (), если запрос не удается, это немного. – 2ndkauboy 4 June 2010 в 11:28
  • 2
    Я собирался разработать целый механизм обработки ошибок для OP, но решил, что это может оказаться вне сферы моего ответа. – scompt.com 4 June 2010 в 11:29
  • 3
    Вниз, потому что мы не должны предлагать решения с уязвимостями кода SQL-инъекций? – svandragt 3 September 2013 в 16:16
  • 4
  • 5
    mysql_query (): расширение mysql устарело и будет удалено в будущем: используйте mysqli – Greg 25 December 2014 в 18:24

Убедитесь, что вы не закрываете базу данных. Используя db_close () перед запуском вашего запроса:

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

9
ответ дан A.Aleem11 16 August 2018 в 07:58
поделиться

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

$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'];
}
24
ответ дан Amjad Omari 16 August 2018 в 07:58
поделиться
  • 1
  • 2
    Вы правы, спасибо, и я сожалею, я просто хотел объяснить цель, и я буду более конкретным в следующий раз :) – Amjad Omari 26 February 2013 в 09:45
  • 3
    +1. @deceze Да, он широко открыт. Но не более того, что код OP или принятый код ответчика ;-) И это не отсутствие ошибки обработки в коде OP, вызывающего ошибку ... это ошибка , и этот ответ, по крайней мере, пытается решить это (путем размещения одинарных кавычек вокруг строкового литерала в выражении LIKE). – Sepster 23 April 2013 в 13:54
  • 4
    +1 Пожалуйста, добавьте пробел между LIKE и «$ username», остальное выглядит отлично, кроме SQL-инъекции. Почему бы не использовать = вместо имени пользователя LIKE оператора нужно точно сопоставить – asim-ishaq 4 May 2013 в 20:08

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

$results = mysql_query($connt, "SELECT * FROM users");
14
ответ дан Brad 16 August 2018 в 07:58
поделиться
10
ответ дан Dennis Kiptugen 16 August 2018 в 07:58
поделиться
$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 для получения дополнительной информации.

35
ответ дан derokorian 16 August 2018 в 07:58
поделиться
  • 1
    Запрос sql записывается в одинарные кавычки, поэтому переменная $ username не будет оцениваться. Запрос завершится неудачно. – asim-ishaq 4 May 2013 в 20:13
  • 2
    Не используйте этот код, даже если вы добавляете кавычки. Он широко открыт для SQL-инъекций. – Brad 7 December 2014 в 18:36

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

$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, который теперь лишен.

34
ответ дан Enis P. Aginić 16 August 2018 в 07:58
поделиться

Ваш код должен быть чем-то вроде этого

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

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

40
ответ дан Ghostman 16 August 2018 в 07:58
поделиться
  • 1
    +1 Это сработает, но я не вижу причин использовать LIKE-оператор в этом случае. Текущий синтаксис будет искать точное совпадение значений имени пользователя, то же самое можно сделать в = operator – asim-ishaq 4 May 2013 в 20:16
  • 2
$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);

29
ответ дан Jack Tuck 16 August 2018 в 07:58
поделиться
  • 1
    У вас проблемы с одной цитатой. – Lightness Races in Orbit 2 December 2013 в 21:24
  • 2
    Не используйте этот код. Он широко открыт для SQL-инъекций. – Brad 7 December 2014 в 18:34

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

"Warning: mysqli_fetch_object () ожидает, что параметр 1 будет mysqli_result, boolean задан«

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

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

$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;
    echo $error; // 1054 Unknown column 'foo' in 'field list'
}

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

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

10
ответ дан Jay Blanchard 16 August 2018 в 07:58
поделиться
$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. Это намного лучше, чем это для использования запроса.

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

160
ответ дан John Conde 16 August 2018 в 07:58
поделиться
  • 1
    Не забудьте использовать htmlspecialchars() при использовании произвольных данных в контексте HTML. В противном случае вы рискуете создать допустимый HTML, если в данных используются зарезервированные символы. – Brad 7 December 2014 в 18:29
  • 2
    Учитывая этот вопрос сегодня stackoverflow.com/q/43804651/1415724 и другие подобные в последнее время; Я думаю, может быть полезно обновить ваш ответ, чтобы содержать что-то вроде & quot; Эта ошибка также может быть вызвана не выполнением запроса с помощью mysql_query() / mysqli_query($connection) и т. Д. & Quot; ; мысли? Поскольку никаких других ответов в этом Q & amp; A не упоминается. – Funk Forty Niner 5 May 2017 в 12:17

Не используйте дезинфицированную функцию mysql_ * (лишенная php 5.5 будет удалена в php 7). и вы можете сделать это с помощью mysqli или 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
ответ дан Manoj Kumar 16 August 2018 в 07:58
поделиться

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

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

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

53
ответ дан Matteo Riva 16 August 2018 в 07:58
поделиться
  • 1
    И что, если $ username: & quot; «; ТАБЛИЦЫ УПАКОВКИ; & quot; ? Это преимущество использования подготовленных операторов и связанных значений, которые, я думаю, хотел бы сохранить. – HoldOffHunger 20 March 2016 в 16:59
107
ответ дан nik 16 August 2018 в 07:58
поделиться

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

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);.
27
ответ дан Peter Mortensen 16 August 2018 в 07:58
поделиться
  • 1
    Это не имеет никакого отношения к вопросу. Также обратите внимание, что уже есть принятый ответ. – fancyPants 21 September 2012 в 10:11
  • 2
    Вау, ты действительно думал, что этот вопрос нуждается в еще одном ответе? Ваш ответ даже не ссылается на проблему и содержит синтаксические ошибки. – Phil 21 January 2014 в 06:29
  • 3
    1) Вы не знаете, был ли я или не проголосовал за какой-либо ответ здесь, вверх или вниз. 2) Как я объяснил в своем первом комментарии; ваш ответ не ссылается на проблему ( boolean, переданный mysql_fetch_array ), и у вас есть синтаксические ошибки – Phil 21 January 2014 в 07:06
  • 4
    @Phil нет никакой ошибки, я вклеил здесь код, который я в настоящее время использую. – Engr Zardari 21 January 2014 в 07:31
  • 5
    У вас есть неправильные цитаты в обоих примерах кода. Выделение синтаксиса, примененное к вашему второму блоку кода, является мертвой отдачей, что что-то не так – Phil 21 January 2014 в 07:35
  • 6
    Этот код подлежит SQL-инъекции и не должен использоваться. @EngrZardari, если вы используете этот код на своих производственных системах, вы, несомненно, были взломаны и должны исправить ситуацию, покупая с использованием подготовленных / параметризованных запросов с PDO или аналогичным. Есть боты, которые имеют автоматическое тестирование для таких уязвимостей. – Brad 7 December 2014 в 18:31
  • 7
    Этот код широко открыт для SQL-инъекций и не должен использоваться. – Brad 7 December 2014 в 18:32
  • 8
    Этот код широко открыт для SQL-инъекций и не должен использоваться. – Brad 7 December 2014 в 18:33
  • 9
    Этот код подлежит SQL-инъекции и не должен использоваться. – Brad 7 December 2014 в 18:33
  • 10
    Не используйте этот код. Он широко открыт для SQL-инъекций. – Brad 7 December 2014 в 18:34
  • 11
    @Brad Почему этот код широко открыт для SQL-инъекции? – Anuj Garg 29 June 2015 в 10:11
  • 12
    @AnujGarg Этот код принимает прямой ввод и связывает его с запросом. Кто-то может написать свой собственный SQL в пост-данных для username, и он будет выполнен. – Brad 29 June 2015 в 14:19
  • 13
    Итак, что использовать для предотвращения кода от SQL-инъекции? – Anuj Garg 29 June 2015 в 18:10

Перейдите к своему config.php. У меня такая же проблема. Проверьте имя пользователя и пароль, а также sql select - это то же имя, что и config.

15
ответ дан peterh 16 August 2018 в 07:58
поделиться

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

Проверьте

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());
43
ответ дан RAS 16 August 2018 в 07:58
поделиться

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

назначает переменную 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'];
     }
}
4
ответ дан Ritesh d joshi 16 August 2018 в 07:58
поделиться
  • 1
    Этот код подвержен атакам SQL-инъекций и не должен использоваться. – Brad 7 December 2014 в 18:29

Попробуйте это

$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'];
}
}
12
ответ дан Suresh Ratten 16 August 2018 в 07:58
поделиться
  • 1
    @panjehra mysql_ * устарел сейчас и удалит с php 7. Вместо этого используйте mysqli * – Manoj Kumar 25 May 2015 в 04:57

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

8
ответ дан user1012181 16 August 2018 в 07:58
поделиться

Вы также можете проверить, не работает ли $result так, как до этого, перед выполнением массива fetch

$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'];
       }
}
7
ответ дан user28864 16 August 2018 в 07:58
поделиться
  • 1
  • 2
    Но если код работает, я чувствую, что вы должны отредактировать код и ввести необходимые фильтры, вместо того, чтобы критиковать код. – user28864 8 December 2014 в 13:28
  • 3
    Простое использование фильтров не будет определять, что не так с этим кодом. Лучшее решение - использовать подготовленные / параметризованные запросы с PDO или аналогичными. Я не вижу смысла его исправлять, поскольку правильный ответ уже был опубликован здесь. В идеале этот ответ будет удален. Тем не менее, вы можете исправить свой ответ, и я с удовольствием произведу его, если он будет правильным. – Brad 8 December 2014 в 15:28
  • 4
  • 5
    Вы правы, весь смысл этого сообщества заключается в обмене знаниями. Вот почему добавлено объяснение с моим downvote, и далее объяснили, почему ваше предложение фильтра было недостаточным. Я бы предпочел предупредить вас, как и любой другой, кто найдет ваш ответ, что приведенный выше код небезопасен. Лучше всем изучить правильные методы, а не уведомить плохой код. И я не могу удалить ваш ответ, и не буду. Это зависит от вас, если вы решите это сделать. – Brad 8 December 2014 в 21:44

Вы можете попробовать этот код. Я нашел его раньше, когда у меня возникла проблема, похожая на вашу.

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;
}
6
ответ дан vaultah 16 August 2018 в 07:58
поделиться
  • 1
    Этот код широко открыт для SQL-инъекций и фактически не решает проблему, поставленную в вопросе. – Brad 7 December 2014 в 18:28

Это сообщение об ошибке отображается при возникновении ошибки в запросе, которая привела к сбою. Он проявится при использовании:

  • 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_*. Они не то же самое и не могут использоваться вместе.

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

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

160
ответ дан John Conde 16 August 2018 в 07:58
поделиться
  • 1
    Учитывая этот вопрос сегодня stackoverflow.com/q/43804651/1415724 и другие подобные в последнее время; Я думаю, может быть полезно обновить ваш ответ, чтобы содержать что-то вроде & quot; Эта ошибка также может быть вызвана не выполнением запроса с помощью mysql_query() / mysqli_query($connection) и т. Д. & Quot; ; мысли? Поскольку никаких других ответов в этом Q & amp; A не упоминается. – Funk Forty Niner 5 May 2017 в 12:17

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

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

$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%'");
27
ответ дан Peter Mortensen 16 August 2018 в 07:58
поделиться
  • 1
    Это не имеет никакого отношения к вопросу. Также обратите внимание, что уже есть принятый ответ. – fancyPants 21 September 2012 в 10:11
  • 2
    Этот код широко открыт для SQL-инъекций и не должен использоваться. – Brad 7 December 2014 в 18:32
  • 3
    Этот код широко открыт для SQL-инъекций и не должен использоваться. – Brad 7 December 2014 в 18:33
  • 4
    Этот код подлежит SQL-инъекции и не должен использоваться. – Brad 7 December 2014 в 18:33
  • 5
    Не используйте этот код. Он широко открыт для SQL-инъекций. – Brad 7 December 2014 в 18:34
  • 6
    @Brad Почему этот код широко открыт для SQL-инъекции? – Anuj Garg 29 June 2015 в 10:11
  • 7
    @AnujGarg Этот код принимает прямой ввод и связывает его с запросом. Кто-то может написать свой собственный SQL в пост-данных для username, и он будет выполнен. – Brad 29 June 2015 в 14:19
  • 8
    Итак, что использовать для предотвращения кода от SQL-инъекции? – Anuj Garg 29 June 2015 в 18:10

Сначала проверьте подключение к базе данных. Является ли это успешным или нет?

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

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;
}
27
ответ дан Peter Mortensen 16 August 2018 в 07:59
поделиться
  • 1
    Это не имеет никакого отношения к вопросу. Также обратите внимание, что уже есть принятый ответ. – fancyPants 21 September 2012 в 10:11
  • 2
    Этот код широко открыт для SQL-инъекций и не должен использоваться. – Brad 7 December 2014 в 18:32
  • 3
    Этот код подлежит SQL-инъекции и не должен использоваться. – Brad 7 December 2014 в 18:33
  • 4
    Не используйте этот код. Он широко открыт для SQL-инъекций. – Brad 7 December 2014 в 18:34
  • 5
    @Brad Почему этот код широко открыт для SQL-инъекции? – Anuj Garg 29 June 2015 в 10:11
  • 6
    @AnujGarg Этот код принимает прямой ввод и связывает его с запросом. Кто-то может написать свой собственный SQL в пост-данных для username, и он будет выполнен. – Brad 29 June 2015 в 14:19
  • 7
    Итак, что использовать для предотвращения кода от SQL-инъекции? – Anuj Garg 29 June 2015 в 18:10
<?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."'");
27
ответ дан Peter Mortensen 16 August 2018 в 07:59
поделиться
  • 1
    Это не имеет никакого отношения к вопросу. Также обратите внимание, что уже есть принятый ответ. – fancyPants 21 September 2012 в 10:11
  • 2
    Этот код широко открыт для SQL-инъекций и не должен использоваться. – Brad 7 December 2014 в 18:32
  • 3
    Этот код подлежит SQL-инъекции и не должен использоваться. – Brad 7 December 2014 в 18:33
  • 4
    @Brad Почему этот код широко открыт для SQL-инъекции? – Anuj Garg 29 June 2015 в 10:11
  • 5
    @AnujGarg Этот код принимает прямой ввод и связывает его с запросом. Кто-то может написать свой собственный SQL в пост-данных для username, и он будет выполнен. – Brad 29 June 2015 в 14:19
  • 6
    Итак, что использовать для предотвращения кода от SQL-инъекции? – Anuj Garg 29 June 2015 в 18:10
Другие вопросы по тегам:

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