2013-06-04 3 views
7

У меня есть сценарий php, который должен попытаться подключиться к БД на локальном сайте. Если локальная БД недоступна, следует попытаться подключиться к БД на удаленном сервере.php mysql_connect Предупреждение отключено

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

Проблема заключается в том, что я не хочу отображать предупреждающее сообщение на странице, если соединение завершилось с ошибкой в ​​первый раз. Есть ли способ отключить предупреждающее сообщение только для функции mysql_connect()?

+7

Не используйте 'mysql_ *', поскольку они устарели. Используйте 'PDO' или' mysqli_ *' вместо – DonCallisto

+3

Вы должны действительно удалить часть 'или $ RC = 1'.Просто проверьте для '! $ Dblink'. – ThiefMaster

+1

Это можно было бы обработать гораздо элегантнее, если бы вы воспользовались исключениями, если вы использовали mysqli или PDO, которые вы все равно должны использовать ** устаревший ** mysql API. – deceze

ответ

8

Да, добавить знак @ как так, чтобы подавить сообщения/предупреждения об ошибках, а затем сделать ошибку раз ваш собственный:

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

Береги, что вам нужно, чтобы обрабатывать все сообщения об ошибках самостоятельно тогда. Такой код трудно отладить, если вы допустили ошибку.

+4

Пожалуйста, никогда не используйте '@' и не используйте вместо этого обработку ошибок! – HamZa

+4

* sidenote: * перестать использовать устаревшие функции mysql_ *. вместо этого используйте MySQLi или PDO. использование '@' заключается в подавлении, а не в обращении. Используйте Try-Catch – Raptor

+4

@HamZa '@' в порядке, если вы знаете, что подавляете ошибки и обрабатываете их! В этом случае он проверяет, было ли соединение успешным или нет, * ожидая * ошибки. Он просто не позволяет распечатать сообщение об ошибке. Вы должны использовать '@' * как можно меньше *, но это не значит, что никогда не используйте его, когда вы знаете, что делаете. – deceze

0

Не можете использовать следующий метод:

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

Когда соединение не удается, он возвращает логическое значение, которое будет вызывать, если заявление, чтобы быть правдой.

+1

Это все еще печатает ошибку на экране, хотя именно то, что пытается избежать OP. – deceze

4

вы можете установить ошибку представления error_reporting(0); отключить ошибки и предупреждения о speacific странице

просто установить в соответствии с вашими потребностями

# 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

просто установить на голове в странице, как этот

<?php 

     error_reporting(E_ERROR | E_WARNING | E_PARSE); 

?> 

дайте мне знать, если я могу Ты больше.

+0

никогда не скрывает ошибок, понижая уровень отчетности! – Ochi

+0

им просто нужно скрыть предупреждение, чтобы мы могли также включить после того, как вы просто поймете, прежде чем проголосовать @Ochi – liyakat

+0

no - то, что вы предлагаете, закончится КАЖДЫМИ ДРУГИМИ ошибками, подавленными - и это может привести к более серьезным проблемам – Ochi

2

Правильное решение - отключить отображение ошибок PHP, предупреждений и уведомлений пользователю. Это можно сделать с помощью настроек display_errors в файле конфигурации php.ini:

display_errors = Off 

Он также может быть установлен во время выполнения с помощью ini_set():

ini_set('display_errors', '0'); 

От Manual:

display_errors
Это определяет, следует ли печатать ошибки ed на экран как часть вывода или если они должны быть скрыты от пользователя.

Выполнение этого запрещает пользователям просматривать конфиденциальные сообщения об ошибках PHP, но все же позволяет печатать их в файле журнала.

Использование метода подавления @ будет делать то, что вы хотите, но оно все равно позволит печатать пользователю любые ошибки/предупреждения PHP, что является проблемой безопасности, поскольку эти ошибки могут содержать конфиденциальную информацию, которая не должна подвергаться ,

+0

Да и нет. Вы, безусловно, правы, но во время разработки, по крайней мере, вы * не * хотите подавить отображение непредвиденных ошибок. OP хочет подавить одну очень конкретную * ожидаемую * ошибку, хотя ... – deceze

+1

@deceze это зависит от предпочтений личного разработчика относительно отображения ошибок во время разработки. Опора на ошибки на экране может привести к отсутствию ошибок, потому что в зависимости от структуры страницы и точки, в которой печатается сообщение, вы, возможно, не видите ошибку в браузере, не делая View> Source. – MrCode

Смежные вопросы