2010-09-09 47 views
5

Tôi đang tìm cách kiểm tra phần kết nối của kết nối php/mysqli. Tôi đang di chuyển từ một máy chủ LAMP xây dựng trên Vista cho cùng trên Ubuntu và đang có phù hợp nhận được mysqli để làm việc. Tôi biết rằng tất cả các mô-đun thích hợp được cài đặt, và PhpMyAdmin hoạt động hoàn hảo. Tôi đã di chuyển một trang web và không có kết nối mysqli nào đang hoạt động. Lỗi mà tôi nhận được là "cuộc gọi đến hàm thành viên xxx() trên đối tượng không" thường xuất hiện khi truy vấn bị lỗi hoặc truy vấn được chuẩn bị từ kết nối kém. Tôi biết rằng các truy vấn chính nó là tốt bởi vì nó hoạt động tốt trên máy chủ khác với cấu trúc cơ sở dữ liệu chính xác giống nhau và dữ liệu. Điều đó khiến tôi có kết nối. Tôi đã cố gắng viết một kết nối thử nghiệm rất đơn giản và đặt nó vào một vòng lặp như ..Kiểm tra kết nối php/mysqli

if(***connection here ***) 
{ echo "connected"; } 
else 
{ echo "not connected"; } 

Nó vang "kết nối", điều này thật tuyệt. Nhưng chỉ để kiểm tra tôi đã thay đổi mật khẩu trong kết nối để tôi biết nó sẽ không thể kết nối và nó vẫn lặp lại "kết nối". Vì vậy, nếu thử nghiệm if/else rõ ràng không phải là cách để đi ...

+0

bạn có thể vui lòng cho thấy cách bạn thực hiện kết nối *** đây *** (bạn có thể bỏ qua người dùng và mật khẩu)? – 2ndkauboy

+0

"cuộc gọi đến chức năng thành viên xxx() trên không đối tượng" lỗi không có gì để làm với kết nối cơ sở dữ liệu. –

Trả lời

11

mysqli_connect() luôn trả về một đối tượng MySQLi. Để kiểm tra lỗi kết nối, hãy sử dụng:

$mysqli_connection = new MySQLi('localhost', 'user', 'pass', 'db'); 
if ($mysqli_connection->connect_error) { 
    echo "Not connected, error: " . $mysqli_connection->connect_error; 
} 
else { 
    echo "Connected."; 
} 
+1

Điều này đã hiệu quả. Cảm ơn, Lek. Tất nhiên, nó chỉ làm sâu sắc thêm bí ẩn. Bây giờ tôi biết rằng cơ sở dữ liệu thực sự đang kết nối có nghĩa là tập lệnh của tôi thực sự khạc nhổ bit tại chính truy vấn đó. Điều này thậm chí còn ít ý nghĩa hơn khi truy vấn hoạt động trên các máy chủ khác. Tôi thậm chí đã viết một truy vấn thử nghiệm đơn giản, thật đáng buồn, vẫn trả về lỗi không đối tượng. –

+0

else { echo "Đã kết nối"; } thêm; –

0

Bạn cần xử lý lỗi nhiều hơn trên các cuộc gọi cơ sở dữ liệu khác nhau. Nhanh/phương pháp bẩn chỉ đơn giản là làm

$whatever = mysqli_somefunction(...) or die("MySQL error: ". mysqli_error()); 

Tất cả các chức năng trả về FALSE boolean nếu một lỗi xảy ra, hoặc một đối tượng mysqli phù hợp với kết quả. Nếu không có sự kiểm tra lỗi, bạn muốn được thực hiện:

$result = $mysqli->query("blah blah will cause a syntax error"); 
$data = $result->fetchRow(); // $result is "FALSE", not a mysqli_object, hence the "call to member on non-object" 
+1

Sử dụng 'mysql_error()' với MySQLi là ngu ngốc;) – Lekensteyn

+0

Vâng, lỗi chính tả. Đã sửa lỗi. –

+0

chết tôi luôn xấu. Ít nhất gửi trạng thái 503 và ** không bao giờ ** tiết lộ bất kỳ thông tin nhạy cảm nào như thông báo lỗi mysql. sử dụng trigger_error() để thay thế. Mặc dù nó khá vô dụng ở đây, như thông báo lỗi PHP đã khá thông tin, nếu có –

0

Đối với kết nối php thử nghiệm trong bạn bị đầu cuối thực hiện:

$ php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "MYSQL_USER", "MYSQL_PASS"));' 
Các vấn đề liên quan