mysqli_connect()
mengesyorkan menyemak nilai pulangan dan memaparkan mesej ralat pada skrin.
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db"); if (!$link) { echo "Error: Unable to connect to MySQL." . PHP_EOL; echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; exit; }
Begitu juga, untuk pembina gaya OOP, ini disyorkan:
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); if ($mysqli->connect_error) { die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); }
Sesetengah pengguna di Stack Overflow telah menggunakan kod dengan mysqli_error($conn)
seperti ini:
$conn = mysqli_connect('localhost', 'a', 'a'); if (!$con) { die('Could not connect: ' . mysqli_error($conn)); }
Tetapi, sejak beberapa minggu lalu, saya telah bertanya kepada diri sendiri, mengapa saya perlu melakukan ini? Output contoh pertama ialah:
Amaran: mysqli_connect(): (HY000/1045): Akses pengguna ditolak 'my_user'@'localhost' (gunakan kata laluan: YA) C:xampp...mysqli.php baris 4
Ralat: Tidak dapat menyambung ke MySQL. Nombor ralat penyahpepijatan: 1045 Penyahpepijatan Ralat: Akses ditolak untuk pengguna "my_user"@"localhost" (menggunakan kata laluan: Ya)
Seperti yang anda lihat, mesej ralat dipaparkan dua kali! "Penyahpepijatan" manual sebenarnya memberikan kurang maklumat.
Adakah kita perlu menyemak secara manual untuk ralat sambungan? Bolehkah kita mendapatkan lebih banyak maklumat daripada amaran automatik dengan cara ini? Adakah ini amalan yang disyorkan?
Jangan sekali-kali tunjukkan ralat sambungan secara manual!
MySQLi akan menjana amaran jika ia tidak dapat membuka sambungan ke MySQL. Amaran ini memberitahu anda semua yang anda perlu tahu, termasuk kod ralat, mesej ralat dan tempat dalam kod ralat itu berlaku. Menyemak ralat secara manual tidak akan memberi anda maklumat lanjut.
Jika anda tidak melihat amaran dan tidak dapat membuat sambungan, ini mungkin bermakna PHP anda tidak dikonfigurasikan untuk menunjukkannya. Dalam kes ini, anda mesti menyemak fail log ralat pada pelayan. Jika anda tidak tahu di mana ia, gunakan
phpinfo() code>
获取该信息并搜索error_log
. Ia akan memberitahu anda di mana fail log ralat berada.Jika tiada amaran dalam log ralat, ini mungkin bermakna pelaporan ralat PHP anda telah disenyapkan (sepenuhnya atau hanya amaran). Semak konfigurasi PHP anda.
Dalam pengeluaranpersekitaran, tetapan ini harus dipelihara:
error_reporting
必须为E_ALL
log_errors
必须开启
display_errors
必须关闭
MestiDalam pembangunan
persekitaran, tetapan ini harus dipelihara:error_reporting
必须为E_ALL
log_errors
必须开启
display_errors
必须开启
Mestidisplay_errors
mesti sentiasa dimatikan dalam persekitaran pengeluaran. Ia adalah selamat untuk log ralat pada pelayan.
Amaran dan pengecualian
!die/exit
Amaran jangan hentikan skrip. Jika amaran dikeluarkan, skrip akan meneruskan pelaksanaan sehingga ralat maut ditemui. Dalam kebanyakan kes, anda perlu membuang pengecualian untuk menghentikan skrip. Jangan gunakanJika sambungan mysqli tidak dapat diwujudkan, pengecualian harus dibuang, yang jika tidak dikendalikan akan menggelembung dan menghentikan skrip dengan ralat yang membawa maut. Anda boleh mengkonfigurasi mysqli untuk membuang pengecualian secara automatik. Ini tidak ternilai kerana semua fungsi mysqli boleh gagal atas pelbagai sebab, dan mereka tidak akan memberitahu anda tentang sebarang masalah melainkan anda menyemak setiap satu daripadanya secara manual untuk ralat. Gunakan talian berikut sebelum membuka sambungan: Jangan tangkap pengecualian melainkan anda benar-benar tahu cara mengendalikannya! Kes penggunaan yang mungkin diterangkan dalam
Cara menyambung dengan betul menggunakan mysqlimysqli_error()
Bolehkah sebarang isu berkaitan sambungan dipaparkan?
Tidak. 🎜 Mesti sambungan mysqli yang sah, jika tidak, anda akan mendapat mesej ralat ini: 🎜mysqli_error($conn)
预计 mysqli 连接成功。$conn
$conn->error
和mysqli_error($conn)
Kedua-duanya tidak menunjukkan sebarang ralat berkaitan sambungan!Berkaitan: Adakah saya perlu menyemak ralat secara manual semasa memanggil "mysqli_stmt_prepare"? p>