Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Błąd uzyskiwania odmowy dostępu podczas wykonywania mysql_query w php

Aktualizacja końcowa:

Otworzyłem sesję czatu z Aditii i przeprowadziliśmy tam trochę debugowania.

Jak się okazuje, problem polegał na tym, że zaktualizowała serwer, który miał włączone krótkie tagi, na taki, który nie miał. W rezultacie cały jej kod, który był ujęty w krótkie znaczniki, nie był wykonywany, w tym jej plik konfiguracyjny.

Błąd w pytaniu został spowodowany przez mysql_connect() funkcja nie jest wykonywana, ponieważ cały plik nie był wykonywany. mysql_query() połączenie, które opierało się na tym połączeniu, nie powiodło się z tego powodu.

Po poprawieniu jej krótkich tagów, aby użyć pełnego <?php tag, ten plik jest wykonywany. Jak omówiłem w mojej oryginalnej odpowiedzi na to pytanie, pojedyncze cudzysłowy wokół zmiennych przekazywane do mysql_connect() spowodowało problemy. Po powiadomieniu o usunięciu tych pojedynczych cudzysłowów połączenie powiodło się, a problem został rozwiązany.

Całą sesję debugowania dla wszystkich zainteresowanych można znaleźć tutaj .

Pierwsza aktualizacja:

Po przyjrzeniu się temu nieco bliżej, są dwa fragmenty, które nie pasują do mojej oryginalnej odpowiedzi (którą zachowałem na dole tej odpowiedzi, ponieważ nadal zawiera kilka dobrych informacji).

Po pierwsze, błąd jest wyzwalany przez mysql_query() nie mysql_connect() . Dzieje się tak prawdopodobnie dlatego, że nie ma obsługi błędów wokół połączenia, więc błąd zostanie zauważony dopiero później. Spróbuj dodać obsługę błędów wokół połączenia:

if (!($con = mysql_connect('$localhost','$username','$password'))) {
  echo mysql_error();
}

if (!mysql_select_db('$dbname',$con)) {
  echo mysql_error();
}

W powyższym przypadku błędy zostaną wyświetlone, gdy tylko wystąpi błąd.

Drugą rzeczą, którą widzę, jest to, że łączysz się z localhost z ODBC użytkownik. To nie ma sensu jeśli błąd jest wywoływany przez kod połączenia pokazany powyżej. Albo będziesz logować się z użytkownikiem o nazwie $username jeśli Twoim problemem jest kwestia pojedynczego cudzysłowu, którą wyjaśniam poniżej, lub root jeśli nie.

Wygląda na to, że PHP próbuje połączyć się z domyślnymi danymi uwierzytelniającymi dla Twojej konfiguracji PHP (znajdujące się w pliku php.ini pliku) zamiast podanych przez Ciebie poświadczeń. To prowadzi mnie do przekonania, że ​​wiersze, które nam pokazujesz, nie są w rzeczywistości wierszami, które są wykonywane. Czy na pewno nie próbujesz połączyć się w innym miejscu kodu? Jeśli tak, podejrzewam, że twój błąd leży w tej części kodu.

Możliwe jest również (musiałbym sprawdzić), że podczas próby uruchomienia mysql_query() przeciwko zerowemu połączeniu, być może PHP próbuje utworzyć połączenie za Ciebie. Nie liczyłbym na to.

Sugeruję, abyś spróbował uruchomić zaktualizowany kod, który podałem powyżej, który używa mysql_error() funkcja do pokazywania błędów w miarę ich pojawiania się. Możesz nawet dodać trochę echo własne stwierdzenia w tych blokach, dla dobrego, staromodnego debugowania printf.

Oryginalna odpowiedź:

Problem polega na tym, że umieszczasz zmienne w pojedynczych cudzysłowach. Jeśli umieścisz je w pojedynczych cudzysłowach, PHP nie oceni zmiennej do wartości. Na przykład zamiast przekazywania root jako drugi argument przekazujesz $username . W końcu próbujesz zalogować się na serwer o nazwie $localhost z użytkownikiem o nazwie $username z hasłem $password .

Spójrz na stronę dokumentacji PHP dla Strings . Wyjaśnia to:

Jeśli chcesz używać zmiennych wewnątrz ciągu, musisz użyć podwójnego cytaty, a nie pojedyncze. W tym przypadku jednak w ogóle nie musisz nawet umieszczać tych zmiennych w cudzysłowie, ponieważ ich wartości są już smyczki. Możesz po prostu przekazać samą zmienną. Spróbuj tego:

$con=mysql_connect($localhost, $username, $password);
mysql_select_db($dbname, $con);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL DELETE FROM z podzapytaniem UNION przez warunek IN

  2. Zmień stół bez blokowania całego stołu

  3. Grupuj według wartości RAND()

  4. Czy mogę automatycznie dostosować wartość pola z automatyczną inkrementacją w bazie danych?

  5. Dlaczego nie powinienem używać funkcji mysql_* w PHP?