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'];
}
mysql_real_escape_string
. Nigdy nie ufaj danym użytkownika.mysql_real_escape_string
nie 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.Odpowiedzi:
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ą
false
z odpowiednich funkcji / metod zapytania. Musisz przetestować ten warunek błędu i odpowiednio go obsłużyć.Rozszerzenie mysql_ * :
Sprawdź
$result
przed przekazaniemmysql_fetch_array
. Przekonasz się, że tofalse
dlatego, że zapytanie nie powiodło się. Zapoznaj się zmysql_query
dokumentacją możliwych wartości zwracanych i sugestii, jak sobie z nimi poradzić.styl procedury rozszerzenia mysqli :
w stylu oo :
używając przygotowanego wyciągu:
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 die
podczas 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 .źródło
if($result === FALSE)
ciebie możesz użyćif(! $result)
. Popraw mnie, jeśli się mylę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:
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 niemysql_*
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 .źródło
mysql_query()
/mysqli_query($connection)
itp.” ; myśli? Ponieważ żadna inna odpowiedź w tym pytaniu nie wspomina o tym.Wystąpił tutaj błąd spowodowany użyciem pojedynczych cudzysłowów (
'
). Możesz umieścić swoje zapytanie w ten sposób:Służy
mysql_real_escape_string
do 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
.źródło
Jak wyjaśniono w scompt.com , zapytanie może się nie powieść. Użyj tego kodu, aby uzyskać błąd zapytania lub poprawny wynik:
Więcej informacji znajduje się w dokumentacji
mysql_query()
.Rzeczywistym błędem były pojedyncze cudzysłowy, więc zmienna
$username
nie została przeanalizowana. Ale powinieneś naprawdę użyć,mysql_real_escape_string($username)
aby uniknąć zastrzyków SQL.źródło
Umieść cytaty
$username
. Wartości ciągów, w przeciwieństwie do wartości liczbowych, muszą być ujęte w cudzysłowy.Ponadto nie ma sensu używać
LIKE
warunku, jeśli nie używasz symboli wieloznacznych: jeśli potrzebujesz dokładnego dopasowania=
zamiastLIKE
.źródło
Proszę sprawdzić, kiedy wybrana baza danych nie jest, ponieważ czasami baza danych nie jest wybrana
Czek
przed zapytaniem MySQL, a następnie przejdź do następnego kroku
źródło
Twój kod powinien być mniej więcej taki
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.
źródło
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:
http://us.php.net/manual/en/function.mysql-query.php, aby uzyskać więcej informacji.
źródło
To zapytanie powinno działać:
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.
źródło
Czasami pomijanie zapytania jako
@mysql_query(your query);
źródło
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_ci
i wszystko po prostu włączyło się w sprzęt.źródło
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.
źródło
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.Spróbuj tego, to musi działać, w przeciwnym razie musisz wydrukować błąd, aby określić swój problem
źródło
LIKE
wyrażeniu).Mogą być dwa powody:
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
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.
źródło
Wypróbuj następujący kod. Może działać dobrze.
źródło
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.źródło
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
źródło
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:
źródło
username
i zostanie on wykonany.Dołącz zmienną ciągu połączenia przed zapytaniem MySQL. Na przykład
$connt
w tym kodzie:źródło
Za każdym razem, gdy dostaniesz ...
... jest prawdopodobne, ponieważ występuje problem z zapytaniem.
prepare()
Lubquery()
zwrot potęgaFALSE
(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
<?php
tagu otwierającym :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/log
okna 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:
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.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
foo
kolumny 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.
źródło
echo $error;
w jednym poście?źródło
Spróbuj tego
źródło
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:
źródło
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.
źródło
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.
źródło
Najpierw sprawdź swoje połączenie.
Następnie, jeśli chcesz pobrać dokładną wartość z bazy danych, powinieneś napisać:
Lub chcesz pobrać
LIKE
typ wartości, a następnie powinieneś napisać:źródło
Możesz również sprawdzić, czy
$result
tak się nie udaje , przed wykonaniem tablicy pobieraniaźródło
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.
LUB
mysql_query($query_variable);
.źródło
Wypróbuj ten kod, działa dobrze
przypisz zmienną post do zmiennej
źródło
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. ””).
ale użycie MySQL znacznie się obniżyło, zamiast tego użyj PDO. jest to proste, ale bardzo bezpieczne
źródło