mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows itp.… oczekuje, że parametr 1 będzie zasobem

960

Próbuję wybrać dane z tabeli MySQL, ale otrzymuję jeden z następujących komunikatów o błędach:

mysql_fetch_array () oczekuje, że parametr 1 będzie zasobem, podana wartość logiczna

To jest mój kod:

$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
źródło
15
możesz uzyskać bardziej przydatne informacje o błędach za pomocą :: QUERY lub die (mysql_error ());
nik
123
Również uwaga obowiązkowa: Twój kod jest podatny na wstrzykiwanie SQL . Powinieneś zweryfikować i / lub uciec od danych wprowadzonych przez użytkownika. Spójrz na mysql_real_escape_string. Nigdy nie ufaj danym użytkownika.
Felix Kling
7
Faktycznie, kod OP będą powodować błąd składni na serwerze MySQL, ale przynajmniej jest nie podatny na SQL Injection, ponieważ pojedyncze cudzysłowy nie ma zmiennej interpolacji.
szgal
4
@ FelixKling Zdaję sobie sprawę, że jest to bardzo stara i prawdopodobnie najdokładniejsza z możliwych w tamtym czasie, ale twój komentarz jest teraz niebezpiecznie błędny w jeden sposób: mysql_real_escape_stringnie jest całkowitą ochroną przed wstrzyknięciem SQL; wciąż jest podatny na wiele ataków. (Nie, nigdy nie powiedziałeś, że jest idealny, ale sugerowałeś, że było to jedyne wymagane rozwiązanie) Najlepszym rozwiązaniem jest obecnie PDO, o ile wiem.
Pozew funduszu Moniki z
2
Gah Rozszerzenie tego pytania na MySQLi i PDO było złym pomysłem. Każdy z nich ma swoją nieco inną składnię i komunikaty o błędach i doskonale mogli mieć własne pytania. Połączenie wszystkiego w jedno gigantyczne trzyczęściowe pytanie sprawia, że ​​jest to mniej Googleowalne i zmusza ludzi, którzy tu przybywają, do brodzenia przez nieistotne treści, aby dostać się do tego, czego chcą. Unieważnił również wiele poniższych odpowiedzi i sprawia, że ​​pytanie to jest „zbyt szerokie” według norm, które zwykle stosujemy. Moim zdaniem to bałagan, ale jest już za późno, aby to naprawić.
Mark Amery

Odpowiedzi:

667

Zapytanie może zakończyć się niepowodzeniem z różnych powodów, w którym to przypadku zarówno mysql_ *, jak i rozszerzenie mysqli powrócą falsez odpowiednich funkcji / metod zapytania. Musisz przetestować ten warunek błędu i odpowiednio go obsłużyć.

Rozszerzenie mysql_ * :

UWAGA Funkcje mysql_ są przestarzałe i zostały usunięte w wersji php 7.

Sprawdź $resultprzed przekazaniem mysql_fetch_array. Przekonasz się, że to falsedlatego, że zapytanie nie powiodło się. Zapoznaj się z mysql_querydokumentacją możliwych wartości zwracanych i sugestii, jak sobie z nimi poradzić.

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


styl procedury rozszerzenia 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 ) {
        ...

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

używając przygotowanego wyciągu:

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

Te przykłady ilustrują tylko, co należy zrobić (obsługa błędów), a nie jak to zrobić. Kod produkcyjny nie powinien być używany or diepodczas wyświetlania HTML, w przeciwnym razie (przynajmniej) wygeneruje niepoprawny HTML. Ponadto komunikaty o błędach bazy danych nie powinny być wyświetlane użytkownikom niebędącym administratorami, ponieważ ujawniają zbyt wiele informacji .

Edward Dale
źródło
9
Racja, ale użycie die (), jeśli zapytanie nie powiedzie się, to trochę za dużo.
2ndkauboy
28
Zamierzałem zaprojektować cały mechanizm obsługi błędów dla PO, ale zdecydowałem, że może to wykraczać poza zakres mojej odpowiedzi.
Edward Dale,
@ scompt.com Tak, jest również ujęty w kilku innych odpowiedziach. Wydaje mi się, że właśnie podkreślałem, że skoro jest to zaakceptowana odpowiedź na pytanie o wysokiej widoczności, oprócz (doskonałej) porady dotyczącej właściwego wychwytywania błędów w przyszłości, powinna (IMHO) faktycznie odpowiedzieć na konkretne pytanie (tj. wyjaśnij, dlaczego w tym przypadku wystąpił błąd).
Sepster,
2
Zamiast if($result === FALSE)ciebie możesz użyć if(! $result). Popraw mnie, jeśli się mylę
anestv
1
mysql_query (): Rozszerzenie mysql jest przestarzałe i zostanie usunięte w przyszłości: użyj mysqli
Greg
165

Ten komunikat o błędzie jest wyświetlany, gdy w zapytaniu wystąpił błąd, który spowodował błąd. Przejawi się to podczas używania:

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

Uwaga : ten błąd nie pojawia się, jeśli zapytanie nie ma wpływu na wiersze. Tylko zapytanie z niepoprawną składnią wygeneruje ten błąd.

Rozwiązywanie problemów Kroki

  • Upewnij się, że masz skonfigurowany serwer programistyczny do wyświetlania wszystkich błędów. Można to zrobić poprzez umieszczenie tego w górnej części plików lub w pliku konfiguracyjnym: error_reporting(-1);. Jeśli masz jakieś błędy składniowe, wskaże ci to.

  • Zastosowanie mysql_error(). mysql_error()zgłosi wszelkie błędy MySQL napotkane podczas wykonywania zapytania.

    Przykładowe użycie:

    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();
    }
  • Uruchom zapytanie z wiersza poleceń MySQL lub narzędzia takiego jak phpMyAdmin . Jeśli w zapytaniu występuje błąd składniowy, poinformuje Cię, co to jest.

  • Upewnij się, że Twoje oferty są prawidłowe. Brakujący cytat wokół zapytania lub wartość może spowodować, że zapytanie nie powiedzie się.

  • Upewnij się, że uciekasz od swoich wartości. Cytaty w zapytaniu mogą spowodować, że zapytanie nie powiedzie się (a także pozostaną otwarte na zastrzyki SQL). Użyj, mysql_real_escape_string()aby uciec od danych wejściowych.

  • Upewnij się, że nie miksujesz mysqli_*i nie mysql_*funkcjonujesz. Nie są tym samym i nie można ich używać razem. (Jeśli masz zamiar wybrać jedną lub drugą opcję mysqli_*. Zobacz poniżej, dlaczego).

Inne wskazówki

mysql_*funkcje nie powinny być używane w nowym kodzie. Nie są już utrzymywane, a społeczność rozpoczęła proces amortyzacji . Zamiast tego powinieneś dowiedzieć się o przygotowanych instrukcjach i używać PDO lub MySQLi . Jeśli nie możesz się zdecydować, ten artykuł pomoże ci wybrać. Jeśli chcesz się uczyć, oto dobry poradnik do PDO .

John Conde
źródło
1
Biorąc pod uwagę to pytanie dzisiaj stackoverflow.com/q/43804651/1415724 i inne podobne ostatnio; Myślę, że warto zaktualizować odpowiedź, aby zawierała coś takiego: „Ten błąd może być również spowodowany nie wykonaniem zapytania za pomocą mysql_query()/ mysqli_query($connection)itp.” ; myśli? Ponieważ żadna inna odpowiedź w tym pytaniu nie wspomina o tym.
Funk Forty Niner
111

Wystąpił tutaj błąd spowodowany użyciem pojedynczych cudzysłowów ( '). Możesz umieścić swoje zapytanie w ten sposób:

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

Służy mysql_real_escape_stringdo zapobiegania wstrzykiwaniu SQL. Chociaż powinniśmy używać rozszerzenia MySQLi lub PDO_MYSQL dla zaktualizowanej wersji PHP (PHP 5.5.0 i nowsze), ale dla starszych wersji załatwi sprawę mysql_real_escape_string.

nik
źródło
5
Po co dodawać szum z konkatenacją ciągu zamiast po prostu wstawiać zmienną do ciągu zapytania?
Matteo Riva
1
@Matteo Riva Tak, ale pomyślałem, że jest to mniej przejrzysty sposób na oddzielenie zmiennych od łańcucha. :)
nik
60

Jak wyjaśniono w scompt.com , zapytanie może się nie powieść. Użyj tego kodu, aby uzyskać błąd zapytania lub poprawny wynik:

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

Więcej informacji znajduje się w dokumentacjimysql_query() .

Rzeczywistym błędem były pojedyncze cudzysłowy, więc zmienna $usernamenie została przeanalizowana. Ale powinieneś naprawdę użyć, mysql_real_escape_string($username)aby uniknąć zastrzyków SQL.

2ndkauboy
źródło
52

Umieść cytaty $username. Wartości ciągów, w przeciwieństwie do wartości liczbowych, muszą być ujęte w cudzysłowy.

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

Ponadto nie ma sensu używać LIKEwarunku, jeśli nie używasz symboli wieloznacznych: jeśli potrzebujesz dokładnego dopasowania =zamiast LIKE.

Matteo Riva
źródło
1
A co jeśli $ nazwa użytkownika to: „”; DROP TABLES; ” ? Jest to zaleta korzystania z przygotowanych instrukcji i powiązanych wartości, które moim zdaniem pytający chciałby zachować.
HoldOffHunger
42

Proszę sprawdzić, kiedy wybrana baza danych nie jest, ponieważ czasami baza danych nie jest wybrana

Czek

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

przed zapytaniem MySQL, a następnie przejdź do następnego kroku

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

f($result === FALSE) {
    die(mysql_error());
yasin
źródło
40

Twój kod powinien być mniej więcej taki

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

Gdy to zrobisz, zapytanie zostanie wydrukowane na ekranie. Wypróbuj to zapytanie na serwerze i sprawdź, czy przyniesie pożądane wyniki. Najczęściej błąd występuje w zapytaniu. Reszta kodu jest poprawna.

Chaitannya
źródło
3
Nie używaj tego kodu. Jest szeroko otwarty na ataki typu SQL injection.
Brad
34
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

Definiujesz ciąg używając pojedynczych cudzysłowów, a PHP nie analizuje ciągów rozdzielanych pojedynczymi cudzysłowami. Aby uzyskać interpolację zmienną, musisz użyć podwójnych cudzysłowów LUB konkatenacji ciągów (lub ich kombinacji). Zobacz http://php.net/manual/en/language.types.string.phpWięcej informacji można .

Powinieneś również sprawdzić, czy mysql_query zwrócił prawidłowy zasób wyniku, w przeciwnym razie fetch_ *, num_rows itp. Nie zadziała na wyniku, ponieważ nie jest wynikiem! TO ZNACZY:

$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, aby uzyskać więcej informacji.

derokorian
źródło
2
Nie używaj tego kodu, nawet jeśli dodasz cudzysłowy. Jest szeroko otwarty na ataki typu SQL injection.
Brad
33

To zapytanie powinno działać:

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

Problemem są pojedyncze cudzysłowy, dlatego zapytanie kończy się niepowodzeniem i zwraca FALSE, a pętla WHILE nie może zostać wykonana. Użycie% pozwala dopasować dowolne wyniki zawierające Twój ciąg (takie jak SomeText- $ nazwa_użytkownika-SomeText).

To jest po prostu odpowiedź na twoje pytanie, powinieneś zaimplementować rzeczy wymienione w innych postach: obsługę błędów, używać łańcuchów specjalnych (użytkownicy mogą wpisywać dowolne dane w polu i MUSISZ upewnić się, że nie jest to dowolny kod), zamiast tego należy używać PDO mysql_connect który jest teraz osłabiony.

Enis P. Aginić
źródło
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'];
}

Czasami pomijanie zapytania jako @mysql_query(your query);

Dip Pokhrel
źródło
2
Nie używaj tego kodu. Jest szeroko otwarty na ataki typu SQL injection.
Brad
27

Jeśli wypróbowałeś wszystko tutaj, ale to nie działa, możesz sprawdzić sortowanie bazy danych MySQL. Mój został ustawiony na szwedzkie zestawienie. Potem zmieniłem na utf8_general_cii wszystko po prostu włączyło się w sprzęt.

kolexinfos
źródło
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>");      
}

Zamiast używać zapytania WHERE, możesz użyć tego zapytania ORDER BY. Jest o wiele lepszy niż ten przy użyciu zapytania.

Zrobiłem to zapytanie i nie otrzymuję żadnych błędów, takich jak parametr lub wartość logiczna.

Gears.of.Codes
źródło
Pamiętaj, aby używać, htmlspecialchars()gdy używasz dowolnych danych w kontekście HTML. W przeciwnym razie ryzykujesz utworzenie prawidłowego kodu HTML, gdy w danych zostaną użyte znaki zastrzeżone.
Brad
25

Spróbuj tego, to musi działać, w przeciwnym razie musisz wydrukować błąd, aby określić swój problem

$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'];
}
Amjad Omari
źródło
8
1) Wstrzykiwanie całkowicie otwarte na SQL, 2) nie obejmuje obsługi błędów, które powodują błąd w przypadku OP.
deceze
+1. @deceze Tak, jest szeroko otwarte. Ale nie więcej, aby kod operacyjny lub zaakceptowany kod odpowiadający ;-) I to nie brak obsługi błędów w kodzie OP powodujący błąd ... to błąd , a ta odpowiedź przynajmniej próbuje rozwiązać ten problem (poprzez wstawienie pojedynczego cudzysłowy wokół dosłownego ciągu w LIKEwyrażeniu).
Sepster,
1
+1 Dodaj spację między LIKE a „$ nazwa użytkownika”, reszta wydaje się być w porządku, z wyjątkiem zastrzyku SQL. Dlaczego nie użyć = zamiast LIKE nazwa użytkownika operatora musi być dokładnie dopasowana
asim-ishaq
21

Mogą być dwa powody:

  1. Czy otworzyłeś połączenie z bazą danych przed wywołaniem funkcji mysql_query? Nie widzę tego w twoim kodzie. Użyj mysql_connect przed wykonaniem zapytania. Widziećphp.net/manual/en/function.mysql-connect.php

  2. Zmienna $ nazwa użytkownika jest używana wewnątrz ciągu pojedynczego cudzysłowu, więc jej wartość nie będzie oceniana w zapytaniu. Zapytanie na pewno się nie powiedzie.

Po trzecie, struktura zapytania jest podatna na wstrzykiwanie SQL . Możesz użyć przygotowanych instrukcji, aby uniknąć tego zagrożenia bezpieczeństwa.

asim-ishaq
źródło
20

Wypróbuj następujący kod. Może działać dobrze.

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

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}
ravi
źródło
4
Ten kod podlega iniekcji SQL i nie należy go używać.
Brad
15

Idź do swojego config.php. Miałem ten sam problem. Sprawdź nazwę użytkownika i hasło, a także sql select to ta sama nazwa, co config.

użytkownik 2835116
źródło
15

Nie używaj funkcji depricated mysql_ * (depricated w php 5.5 zostanie usunięty w php 7). i możesz to zrobić za pomocą mysqli lub pdo

tutaj jest kompletne wybrane zapytanie

<?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();
?>
Manoj Kumar
źródło
Twój post nie rozwiązuje problemów, których dotyczy pytanie, które są nieprawidłowym zapytaniem i niewystarczającym raportowaniem błędów. Ten post jest nie na temat.
Paul Spiegel
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'];
    }
?>

A jeśli istnieje użytkownik o unikalnej nazwie użytkownika, możesz do tego użyć „=”. Nie ma co lubić.

Twoje zapytanie będzie:

mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'");
Janak Prajapati
źródło
3
Ten kod jest szeroko otwarty na wstrzykiwanie SQL i nie należy go używać.
Brad
@AnujGarg Ten kod pobiera bezpośrednie dane wejściowe i łączy je z zapytaniem. Ktoś mógłby napisać własny kod SQL w danych postu usernamei zostanie on wykonany.
Brad
Więc czego użyć, aby zapobiec iniekcji kodu SQL?
Anuj Garg
14

Dołącz zmienną ciągu połączenia przed zapytaniem MySQL. Na przykład $conntw tym kodzie:

$results = mysql_query($connt, "SELECT * FROM users");
Durairaj
źródło
1
To nie rozwiązuje problemów w pytaniu. Jest to również niewłaściwe i spowodowałoby kolejny błąd.
Paul Spiegel
12

Za każdym razem, gdy dostaniesz ...

„Ostrzeżenie: mysqli_fetch_object () oczekuje, że parametr 1 będzie mysqli_result, podano wartość logiczną”

... jest prawdopodobne, ponieważ występuje problem z zapytaniem. prepare()Lub query()zwrot potęga FALSE(Boolean), ale ta wiadomość awaria generic nie opuszczę cię dużo w drodze wskazówek. Jak dowiedzieć się, co jest nie tak z zapytaniem? Państwo zapytać !

Przede wszystkim upewnij się, że raportowanie błędów jest włączone i widoczne: dodaj te dwa wiersze u góry pliku (plików) zaraz po <?phptagu otwierającym :

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

Jeśli raportowanie błędów zostało ustawione w php.ini, nie musisz się o to martwić. Po prostu upewnij się, że radzisz sobie z błędami z gracją i nigdy nie ujawnisz prawdziwej przyczyny problemów użytkownikom. Ujawnienie prawdziwej przyczyny opinii publicznej może być wygrawerowanym złotem zaproszeniem dla tych, którzy chcą wyrządzić szkody na twoich stronach i serwerach. Jeśli nie chcesz wysyłać błędów do przeglądarki, zawsze możesz monitorować dzienniki błędów serwera WWW. Lokalizacje dzienników będą się różnić w zależności od serwera, np. W systemie Ubuntu dziennik błędów zwykle znajduje się pod adresem /var/log/apache2/error.log. Jeśli sprawdzasz dzienniki błędów w środowisku Linux, możesz użyć tail -f /path/to/logokna konsoli, aby zobaczyć błędy, które pojawiają się w czasie rzeczywistym ... lub podczas ich tworzenia.

Po wyeliminowaniu standardowych raportów o błędach dodanie sprawdzania błędów połączenia z bazą danych i zapytań zapewni znacznie więcej szczegółów na temat występujących problemów. Spójrz na ten przykład, w którym nazwa kolumny jest niepoprawna. Po pierwsze, kod zwracający ogólny komunikat o błędzie krytycznym:

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

Błąd jest ogólny i nie jest zbyt pomocny w rozwiązywaniu problemów.

Za pomocą kilku kolejnych wierszy kodu możesz uzyskać bardzo szczegółowe informacje, których możesz użyć do natychmiastowego rozwiązania problemu . Sprawdź prepare()prawdziwość oświadczenia i jeśli jest ono dobre, możesz przystąpić do wiązania i wykonywania.

$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
}

Jeśli coś jest nie tak, możesz wyrzucić komunikat o błędzie, który prowadzi bezpośrednio do problemu. W tym przypadku nie ma fookolumny w tabeli, rozwiązanie problemu jest banalne.

Jeśli wybierzesz, możesz włączyć to sprawdzanie do funkcji lub klasy i rozszerzyć je, obsługując błędy z wdziękiem, jak wspomniano wcześniej.

Jay Blanchard
źródło
2
Jak napisać „Upewnij się, że z wdzięcznością podchodzisz do błędów i nigdy nie ujawniasz prawdziwej przyczyny problemów użytkownikom”. i echo $error;w jednym poście?
Paul Spiegel
Dzięki za heads up @PaulSpiegel. Minęło trochę czasu, odkąd napisałem odpowiedź lub wróciłem do niej i nie zauważyłem, że zostawiłem tam echo.
Jay Blanchard
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'];
 }
 ?>
Dennis Kiptugen
źródło
11

Spróbuj tego

$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'];
}
}
SuReSh
źródło
4
@panjehra mysql_ * jest teraz depricated i zostanie usunięty z php 7. Zamiast tego użyj mysqli_ *
Manoj Kumar
9

Najpierw sprawdź połączenie z bazą danych. Czy połączenie jest udane, czy nie?

Jeśli to zrobione, to potem napisałem ten kod i działa dobrze:

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;
}
Peter Mortensen
źródło
2
Nie używaj tego kodu. Jest szeroko otwarty na ataki typu SQL injection.
Brad
9

Upewnij się, że nie zamykasz bazy danych, używając komendy db_close () przed uruchomieniem zapytania:

Jeśli używasz wielu zapytań w skrypcie, nawet jeśli dołączasz inne strony zawierające zapytania lub połączenie z bazą danych, możliwe, że w dowolnym miejscu użyjesz db_close (), który zamknąłby twoje połączenie z bazą danych, więc upewnij się, że jesteś nie robiąc tego błędu w swoich skryptach.

A.Aleem11
źródło
8

Jeśli podczas sprawdzania nie pojawia się błąd MySQL, upewnij się, że poprawnie utworzyłeś tabelę bazy danych. To mi się przydarzyło. Poszukaj niechcianych przecinków lub cytatów.

użytkownik 1012181
źródło
7

Najpierw sprawdź swoje połączenie.

Następnie, jeśli chcesz pobrać dokładną wartość z bazy danych, powinieneś napisać:

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

Lub chcesz pobrać LIKEtyp wartości, a następnie powinieneś napisać:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
Omdev
źródło
3
Ten kod jest szeroko otwarty na wstrzykiwanie SQL i nie należy go używać.
Brad
6

Możesz również sprawdzić, czy $resulttak się nie udaje , przed wykonaniem tablicy pobierania

$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'];
       }
}
użytkownik 28864
źródło
3
Nie używaj tego kodu. Jest szeroko otwarty na ataki typu SQL injection.
Brad
Ale jeśli kod działa, uważam, że powinieneś go edytować i wprowadzić potrzebne filtry zamiast kastrować kod.
user28864,
Proste użycie filtrów nie naprawi tego, co jest nie tak z tym kodem. Najlepszym rozwiązaniem jest użycie przygotowanych / sparametryzowanych zapytań z PDO lub podobnym. Naprawdę nie widzę sensu, ponieważ poprawna odpowiedź została już tutaj opublikowana. Idealnie, ta odpowiedź zostanie usunięta. Możesz jednak poprawić swoją odpowiedź i chętnie ją głosuję, jeśli jest poprawna.
Brad
Cóż, jeśli uważasz, że odpowiedź nie jest warta rozważenia, możesz ją przeczytać. Myślałem jednak, że celem całej społeczności jest dzielenie się wiedzą i dzielenie się nią. Jeśli masz coś do podzielenia się, zamiast pokazywać i zniechęcać ludzi.
user28864,
2
Masz rację, celem całej społeczności jest dzielenie się wiedzą. Właśnie dlatego dodałem wyjaśnienie z moją oceną i wyjaśniłem, dlaczego twoja sugestia dotycząca filtra była niewystarczająca. Wolałbym ostrzec cię, podobnie jak każdego, kto znajdzie odpowiedź, że powyższy kod jest niepewny. Dla wszystkich lepiej jest uczyć się prawidłowych metod niż utrwalać zły kod. I nie mogę usunąć twojej odpowiedzi, podobnie jak ja. To zależy od ciebie, jeśli zdecydujesz się to zrobić.
Brad
4

Zwykle występuje błąd, gdy nie można połączyć się z bazą danych, dlatego należy podłączyć bazę danych lub dołączyć plik bazy danych.

include_once(db_connetc.php');

LUB

// 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
  • Najlepszą praktyką jest uruchomienie zapytania w sqlyog, a następnie skopiowanie go do kodu strony.
  • Zawsze przechowuj zapytanie w zmiennej, a następnie powtórz tę zmienną. Następnie przejdź do mysql_query($query_variable);.
Engr Zardari
źródło
2
1) Nie wiesz, czy głosowałem, czy nie głosowałem na żadną odpowiedź tutaj, w górę lub w dół. 2) Jak wyjaśniłem w moim pierwszym komentarzu; twoja odpowiedź nie odnosi się do problemu ( boolean przekazany do mysql_fetch_array ) i masz błędy składniowe
Phil
2
W obu przykładach kodu masz nieprawidłowe cytaty. Podświetlanie składni zastosowane do drugiego bloku kodu jest martwym rozdawaniem, że coś jest nie tak
Phil
4
Ten kod podlega iniekcji SQL i nie należy go używać. @EngrZardari, jeśli używasz tego kodu w swoich systemach produkcyjnych, niewątpliwie zostałeś zhakowany i powinieneś zaradzić sytuacji kupując za pomocą przygotowanych / sparametryzowanych zapytań z PDO lub podobnym. Istnieją boty, które mają automatyczne testy pod kątem takich luk.
Brad
1
@EngrZardari O twoim „nie ma żadnego błędu, wkleiłem tutaj kod, którego obecnie używam”. komentarz powyżej. W zapytaniu, które poprawiłem, brakowało cytatu. To spowodowałoby błąd analizy (PHP).
Funk Forty Niner
2

Wypróbuj ten kod, działa dobrze

przypisz zmienną post do zmiennej

   $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'];
     }
}
Ritesh d Joshi
źródło
3
Ten kod podlega atakom typu SQL injection i nie należy go używać.
Brad
1

ponieważ $ username jest zmienną php, musimy przekazać ją jako ciąg do mysqli, więc ponieważ w zapytaniu rozpoczynanym od pojedynczego cytatu użyjemy podwójnego cytatu, pojedynczego cytatu i zatrzymania pełnego do celów konkatynacji („”. $ nazwa użytkownika. „”), jeśli zaczniesz od podwójnego cudzysłowu, wówczas odwrócisz cudzysłowy („”. $ nazwa użytkownika. ””).

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

ale użycie MySQL znacznie się obniżyło, zamiast tego użyj PDO. jest to proste, ale bardzo bezpieczne

Dennis Kiptugen
źródło
Ale użycie MySQL uległo amortyzacji. zamiast tego możesz użyć PDO. Pozwól, że podam przykładowy login.
Dennis Kiptugen,
2
Hasła NIGDY nie powinny być przechowywane w postaci zwykłego tekstu, skorzystaj z wbudowanych funkcji, które PHP ma do radzenia sobie z haszowaniem haseł i weryfikacją haszowanych haseł!
SpacePhoenix