2013-06-04 41 views
7

Tôi có tập lệnh php nên thử kết nối với DB trong trang cục bộ. Nếu DB địa phương không có sẵn, nó sẽ cố gắng kết nối với DB trên máy chủ từ xa.php mysql_connect Cảnh báo tắt

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

Vấn đề là tôi không muốn hiển thị Thông báo cảnh báo trên trang nếu kết nối không thành công lần đầu tiên. Có cách nào để vô hiệu hóa thông báo cảnh báo chỉ cho hàm mysql_connect()?

+7

Không sử dụng 'mysql_ *' khi chúng không được chấp nhận. Sử dụng 'PDO' hoặc' mysqli_ * 'thay vì – DonCallisto

+3

Bạn thực sự nên xóa phần' hoặc $ RC = 1'.Chỉ cần kiểm tra '! $ Dblink'. – ThiefMaster

+1

Điều này có thể được xử lý thanh lịch hơn nhiều bằng cách bắt ngoại lệ nếu bạn sử dụng mysqli hoặc PDO, mà bạn nên anyway thay vì ** deprecated ** mysql API. – deceze

Trả lời

8

Vâng, thêm một dấu hiệu @ như vậy để ngăn chặn thông điệp cảnh báo/báo lỗi, sau đó làm các lỗi lần riêng bạn:

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

Chăm sóc mà bạn cần phải xử lý tất cả lỗi báo cáo riêng của bạn sau đó. Mã như vậy rất khó để gỡ lỗi trong trường hợp bạn mắc lỗi.

+4

Vui lòng * không bao giờ * sử dụng '@' và sử dụng xử lý lỗi thay thế! – HamZa

+4

* sidenote: * ngừng sử dụng chức năng 'mysql_ *' không dùng nữa. sử dụng MySQLi hoặc PDO thay thế. sử dụng '@' là để ngăn chặn, không để xử lý. Sử dụng Try-Catch – Raptor

+4

@HamZa '@' là tốt, nếu bạn biết rằng bạn đang loại bỏ các lỗi và đang xử lý chúng! Trong trường hợp này, anh ta kiểm tra xem kết nối có thành công hay không, * mong đợi * một lỗi. Anh ấy chỉ không để thông báo lỗi in ra màn hình. Bạn nên sử dụng '@' * càng ít càng tốt *, nhưng điều đó không có nghĩa là không bao giờ sử dụng nó khi bạn biết bạn đang làm gì. – deceze

0

bạn không thể sử dụng các phương pháp sau đây:

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

Khi kết nối thất bại, nó sẽ trả về một boolean, mà sẽ làm cho câu lệnh if là đúng.

+1

Điều đó vẫn còn in một lỗi cho màn hình mặc dù, chính xác những gì OP đang cố gắng để tránh. – deceze

4

bạn có thể thiết lập báo cáo lỗi error_reporting(0); để tắt lỗi và cảnh báo cho trang speacific

chỉ cần thiết lập theo nhu cầu của bạn

# 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

chỉ đặt ở đầu trang như

này
<?php 

     error_reporting(E_ERROR | E_WARNING | E_PARSE); 

?> 

cho tôi biết nếu tôi có thể lp bạn nhiều hơn.

+0

không bao giờ che giấu các lỗi bằng cách giảm mức báo cáo! – Ochi

+0

họ chỉ cần ẩn cảnh báo vì vậy chúng tôi cũng có thể bật sau khi bạn chỉ cần hiểu trước khi bạn bỏ phiếu @Ochi – liyakat

+0

không - những gì Bạn đang đề xuất sẽ kết thúc với MỌI lỗi khác bị chặn - và điều đó có thể dẫn đến các sự cố nghiêm trọng hơn – Ochi

2

Giải pháp thích hợp là tắt hiển thị lỗi PHP, cảnh báo và thông báo cho người dùng. Điều này có thể được thực hiện thông qua các thiết lập display_errors trong tập tin cấu hình php.ini của bạn:

display_errors = Off 

Nó cũng có thể được thiết lập trong thời gian chạy qua ini_set():

ini_set('display_errors', '0'); 

Từ Manual:

display_errors
Điều này xác định xem có nên in lỗi hay không ed vào màn hình như một phần của đầu ra hoặc nếu chúng bị ẩn khỏi người dùng.

Làm như vậy sẽ ngăn không cho bất kỳ người dùng nào nhìn thấy thông báo lỗi PHP nhạy cảm, nhưng vẫn cho phép họ được in vào tệp nhật ký.

Sử dụng phương pháp ức chế @ sẽ làm những gì bạn muốn nhưng nó vẫn cho phép bất kỳ lỗi/cảnh báo PHP nào khác được in cho người dùng, đó là vấn đề bảo mật vì các lỗi đó có thể chứa thông tin nhạy cảm không được hiển thị .

+0

Có và không. Bạn chắc chắn là đúng, nhưng trong quá trình phát triển ít nhất bạn làm * không * muốn ngăn chặn hiển thị các lỗi không mong muốn. OP muốn chặn một lỗi * dự kiến ​​rất cụ thể * mặc dù ... – deceze

+1

@ lừa dối tùy theo nhà phát triển cá nhân để hiển thị lỗi trong quá trình phát triển. Dựa vào các lỗi trên màn hình có thể dẫn đến lỗi bị thiếu vì tùy thuộc vào cấu trúc của trang và điểm mà thư được in, bạn có thể không thấy lỗi trong trình duyệt mà không thực hiện Xem> Nguồn. – MrCode

Các vấn đề liên quan