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

15
ви можете отримати більше корисної ерозійної msg, використовуючи :: QUERY або die (mysql_error ());
nik

123
Також обов’язкова примітка: Ваш код схильний ін'єкції SQL . Вам слід перевірити та / або уникнути введення даних користувача. Погляньтеmysql_real_escape_string. Ніколи не довіряйте даних користувачів.
Фелікс Клінг

7
Насправді код OP спричинить синтаксичну помилку на сервері MySQL, але принаймні він не є вразливим до ін'єкції SQL, оскільки одиничні лапки не мають змінної інтерполяції.
szgal

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 ) {
        ...

oo-стиль :

$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
Я збирався розробити цілий механізм обробки помилок для ОП, але вирішив, що це може вийти за рамки моєї відповіді.
Едвард Дейл

@ scompt.com Так, це також висвітлено у кількох інших відповідях. Я думаю, я щойно зазначав, що оскільки це прийнята відповідь на питання про високу видимість, на додаток до (чудової) поради щодо того, як правильно вловлювати помилки в майбутньому, він повинен (ІМХО) насправді відповісти на конкретне питання (тобто поясніть, чому в цьому випадку є помилка).
Сепстер

2
Замість if($result === FALSE)вас можна використовувати if(! $result). Виправте мене, якщо я помиляюся
anestv

1
mysql_query (): Розширення mysql застаріле і буде видалено в майбутньому: використовуйте mysqli
Грег,

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)і т.д." ; думки? Оскільки жодних інших відповідей у ​​цьому запитанні це не згадується.
Funk Forty Niner

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це зробить фокус.


5
Чому додавання шуму з об'єднанням рядків замість того, щоб просто вводити змінну в рядок запиту?
Маттео Ріва

1
@Matteo Riva Так, але я вважав, що це чистіший спосіб відокремити змінні від рядка. :)
nik

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


52

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

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

Крім того, немає сенсу використовувати LIKEумову, якщо ви не використовуєте підстановку: якщо вам потрібно використовувати точну відповідність =замість LIKE.


1
А що робити, якщо $ ім'я користувача: "'; СРОК ТАБЛИЦІ;" ? У цьому полягає перевага у використанні підготовлених операторів та зв'язаних значень, які, на мою думку, хотів би зберегти запитувач.
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'];
}

Закінчивши це, ви отримаєте запит, надрукований на екрані. Спробуйте цей запит на своєму сервері і побачите, чи він дає бажані результати. Більшість випадків помилка виявляється у запиті. Решта коду правильна.


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 для отримання додаткової інформації.


2
Не використовуйте цей код, навіть якщо ви додаєте лапки. Він широко відкритий для атак ін'єкцій SQL.
Бред

33

Цей запит повинен працювати:

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

Проблема полягає в одинарних лапках, тому ваш запит не працює та повертає НЕВЕРШЕННЯ, і цикл WHILE не може виконати. Використання% дозволяє зіставити будь-які результати, що містять ваш рядок (наприклад, SomeText- $ username-SomeText).

Це просто відповідь на ваше запитання, ви повинні реалізувати речі, згадані в інших публікаціях: обробка помилок, використання рядків евакуації (користувачі можуть вводити що-небудь у поле, і ви ОБОВ'ЯЗКОВО переконайтеся, що це не довільний код), використовуйте PDO замість mysql_connect який зараз знецінений.


28
$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);


2
Не використовуйте цей код. Він широко відкритий для атак ін'єкцій SQL.
Бред

27

Якщо ви спробували тут все, і це не працює, можливо, ви захочете перевірити порівняння вашої бази даних MySQL. Шахта була налаштована на шведський розклад. Потім я змінив його utf8_general_ciі все просто натиснув на передачу.


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, ви можете використовувати цей ЗАМОВИТИ ЗАЯВЛЕННЯ. Це набагато краще, ніж це для використання запиту.

Я зробив цей запит, і я не отримую жодних помилок, таких як параметр або булева інформація.


Не забудьте використовувати 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) не включає обробку помилок, яка спричинює помилку у випадку ОП.
деге

+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. Змінна $ ім'я користувача використовується в одному рядку цитати, тому його значення не буде оцінено всередині запиту. Запит, безумовно, не вдасться.

По-третє, структура запиту схильна до ін'єкції 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 - те саме ім'я, що і конфігурація.


15

Не використовуйте функцію видаленого 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
<?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");

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 (), буде закрито з'єднання з базою даних, щоб переконатися, що ви не роблячи цієї помилки у своїх сценаріях.


8

Якщо під час перевірки у вас не з’явилася помилка MySQL, переконайтеся, що ви правильно створили таблицю бази даних. Це сталося зі мною. Шукайте будь-які небажані коми чи цитати.


7

Спершу перевірте своє з'єднання.

Тоді, якщо ви хочете отримати точне значення з бази даних, ви повинні написати:

$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%'");

3
Цей код широко відкритий для ін'єкцій SQL і його не слід використовувати.
Бред

6

Ви також можете перевірити, $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'];
       }
}

3
Не використовуйте цей код. Він широко відкритий для атак ін'єкцій SQL.
Бред

Але якщо код працює, я вважаю, що ви повинні відредагувати код і ввести необхідні фільтри, а не робити його.
user28864

Просте використання фільтрів не виправить, що з цим кодом не так. Найкращим рішенням є використання підготовлених / параметризованих запитів із PDO або подібними. Я не бачу сенсу це виправляти, оскільки правильну відповідь тут уже розміщено. В ідеалі цю відповідь буде видалено. Однак ви можете зафіксувати свою відповідь, і я з радістю підсуму її, якщо вона правильна.
Бред

Що ж, якщо ви вважаєте, що відповідь не варто думати, можете продовжити та прочитати її. Однак я подумав, що вся суть цієї спільноти полягає у тому, щоб поділитися та внести знання. Якщо вам є чим поділитися, замість того, щоб показувати та відкладати людей.
user28864

2
Ви праві, вся суть цієї спільноти полягає в тому, щоб ділитися знаннями. Ось чому я додав пояснення моїм свідченням і далі пояснив, чому пропозиція щодо вашого фільтра була недостатньою. Я б вважав за краще попередити вас разом із усіма, хто знайде вашу відповідь, що наведений вище код не є небезпечним. Всім краще навчитися правильним методам, а не увічненню поганого коду. І я не можу видалити вашу відповідь, як і я. Це ви вирішите, якщо ви вирішите це зробити.
Бред

4

Зазвичай помилка виникає, коли збій у вашій базі даних не вдається, тому обов'язково підключіть свою базу даних або додайте файл бази даних.

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).
Funk Forty Niner

2

Спробуйте цей код, він справно працює

призначити змінну публікації

   $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 і його не слід використовувати.
Бред

1

оскільки $ username - це змінна php, нам потрібно передати його як рядок mysqli, тому, що в запиті u, розпочатому з однієї цитати, ми використовуватимемо подвійну цитату, єдину цитату та повну зупинку для цілей конкретизації ("'. $ username. '") якщо ви почнете з подвійної лапки, ви переймете лапки ('". $ username. "').

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

$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 значно знецінилося, використовуйте PDO замість цього. Це просто, але дуже безпечно


Але використання Mysql знецінилося. ви можете використовувати PDO замість цього. Дозвольте навести вам зразок входу.
Денніс Кіптуген

2
Паролі НІКОЛИ не зберігатимуться у простому текстовому форматі, використовуйте вбудовані fucntions, які PHP має для роботи з хешированием паролів та верифікацією хешованих паролів!
SpacePhoenix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.