2013-06-04 17 views
7

Mam skrypt php, który powinien spróbować połączyć się z DB w lokalnej witrynie. Jeśli lokalna baza danych nie jest dostępna, powinien spróbować połączyć się z bazą danych na zdalnym serwerze.php mysql_connect Warning disable

$dblink = mysql_connect(DBHOST_LOCAL, DBUSER, DBPASS) or $RC = 1; 
if($RC) { 
    $dblink = mysql_connect(DBHOST_REMOTE, DBUSER, DBPASS) or die('Could not connect'.mysql_error()); 
} 

Problem polega na tym, że nie chcę wyświetlać komunikatu ostrzegawczego na stronie, jeśli połączenie zakończyło się niepowodzeniem po raz pierwszy. Czy istnieje sposób wyłączenia ostrzeżenia tylko dla funkcji mysql_connect()?

+7

Nie używaj 'mysql_ *', ponieważ są przestarzałe. Użyj 'PDO' lub' mysqli_ * 'zamiast – DonCallisto

+3

Naprawdę powinieneś usunąć część' lub $ RC = 1'.Po prostu sprawdź '! $ Dblink'. – ThiefMaster

+1

Można to potraktować znacznie bardziej elegancko, wychwytując wyjątki, jeśli używałeś mysqli lub PDO, które i tak powinieneś zamiast ** przestarzałego ** mysql API. – deceze

Odpowiedz

8

Tak, dodać znak @ podobnie jak tłumić wiadomości ostrzeżenie/błędach, a następnie zrobić błąd raz własnego uznania:

$dblink = @mysql_connect(DBHOST_LOCAL, DBUSER, DBPASS); 

if (!$dblink) 
{ 
    $dblink = @mysql_connect(DBHOST_REMOTE, DBUSER, DBPASS);     
} 

if (!$dblink) 
{ 
    $message = sprintf(
     "Could not connect to local or remote database: %s", 
     mysql_error() 
    ); 
    trigger_error($message); 
    return; 
} 

zadbać o to, czego potrzeba, aby obsłużyć wszystkie raportowanie błędów własnego czasu. Taki kod jest trudny do debugowania, jeśli popełnisz błąd.

+4

Proszę * nigdy * używać '@' i zamiast tego używać obsługi błędów! – HamZa

+4

* sidenote: * przestań używać przestarzałych funkcji 'mysql_ *'. zamiast tego użyj MySQLi lub PDO. użycie '@' oznacza tłumienie, a nie manipulowanie. Użyj funkcji próbnej-catch – Raptor

+4

@HamZa '@' jest w porządku, jeśli masz świadomość, że tłumisz błędy i obchodzisz się z nimi! W tym przypadku sprawdza, czy połączenie się powiodło, * oczekując * błędu. Po prostu nie pozwala wydrukować komunikatu o błędzie. Powinieneś używać '@' * tak mało jak to możliwe *, ale to nie oznacza, że ​​nigdy nie będziesz go używał, kiedy będziesz wiedział, co robisz. – deceze

0

nie można użyć następującej metody:

if (!$connection = mysql_connect(DBHOST_LOCAL, DBUSER, DBPASS)) { 
    die('And here we connect to the other server'); 
} 

Jeżeli połączenie nie powiedzie się, to zwraca wartość logiczną, która spowoduje, że jeśli oświadczenie mogło być prawdziwe.

+1

To nadal drukuje błąd na ekranie, dokładnie to, co OP próbuje uniknąć. – deceze

4

można ustawić raportowanie błędów error_reporting(0); wyłączyć błędy i ostrzeżenia dla speacific stronie

wystarczy ustawić jak na swoje potrzeby

# config.ini 
# PHP error reporting. supported values are given below. 
# 0 - Turn off all error reporting 
# 1 - Running errors 
# 2 - Running errors + notices 
# 3 - All errors except notices and warnings 
# 4 - All errors except notices 
# 5 - All errors 

Doc

właśnie ustawionej na głowę w stronę podobną do tej

<?php 

     error_reporting(E_ERROR | E_WARNING | E_PARSE); 

?> 

daj mi znać, czy mogę Jestem tobą więcej.

+0

nigdy nie ukrywaj błędów, obniżając poziom raportowania! – Ochi

+0

po prostu trzeba ukryć ostrzeżenie, abyśmy mogli włączyć, po prostu zrozumieć, zanim zagłosujesz @Ochi – liyakat

+0

nie - to, co proponujesz, skończy się z KAŻDEM INNYM błędami jest stłumiony - i może to prowadzić do poważniejszych problemów – Ochi

2

Właściwym rozwiązaniem jest wyłączenie wyświetlania błędów PHP, ostrzeżeń i powiadomień dla użytkownika. Można to zrobić poprzez ustawienie display_errors w pliku konfiguracyjnym php.ini:

display_errors = Off 

Można również ustawić w czasie wykonywania przez ini_set():

ini_set('display_errors', '0'); 

Z Manual:

display_errors
Określa, czy błędy powinny być drukowane ed na ekranie jako część danych wyjściowych lub jeśli powinny być ukryte przed użytkownikiem.

Wykonanie tej czynności uniemożliwiłoby użytkownikom wyświetlanie wrażliwych komunikatów o błędach PHP, ale nadal pozwala na drukowanie ich w pliku dziennika.

Używanie metody tłumienia zrobi to, co chcesz, ale nadal będzie pozwalać na drukowanie innych błędów PHP/ostrzeżeń dla użytkownika, co jest problemem bezpieczeństwa, ponieważ te błędy mogą zawierać poufne informacje, które nie powinny być narażone .

+0

Tak i nie. Na pewno masz rację, ale podczas rozwoju przynajmniej nie * nie * chcesz stłumić wyświetlanie nieoczekiwanych błędów. OP chce powstrzymać jeden bardzo * oczekiwany * błąd ... – deceze

+1

@deceze to jest osobiste preferencje programisty co do wyświetlania błędów podczas programowania. Opieranie się na błędach na ekranie może prowadzić do braku błędów, ponieważ w zależności od struktury strony i miejsca drukowania komunikatu, może nie być wyświetlany błąd w przeglądarce bez wykonania polecenia Widok> Źródło. – MrCode