Rumah  >  Soal Jawab  >  teks badan

Patutkah kita menyemak ralat mysqli_connect() secara manual?

Manual PHP

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?

P粉031492081P粉031492081381 hari yang lalu726

membalas semua(1)saya akan balas

  • P粉251903163

    P粉2519031632023-10-28 00:52:28

    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() 获取该信息并搜索 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 必须关闭 Mesti Tutup

    Dalam pembangunan

    persekitaran, tetapan ini harus dipelihara:
    • error_reporting 必须为 E_ALL
    • log_errors 必须开启
    • display_errors 必须开启 Mesti
    • dayakan

    display_errors

    Seperti yang anda lihat dalam mesej ralat, nama pengguna dan kata laluan pangkalan data anda telah dibocorkan kepada pengguna akhir. Ini adalah maklumat sensitif yang anda tidak mahu tunjukkan kepada sesiapa. Malah, pengguna biasa tidak akan memahami mesej misteri ini. Inilah sebabnya

    mesti sentiasa dimatikan dalam persekitaran pengeluaran. Ia adalah selamat untuk log ralat pada pelayan.

    Amaran dan pengecualian die/exitAmaran 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 gunakan

    !

    Jika 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:

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
    Jangan tangkap pengecualian melainkan anda benar-benar tahu cara mengendalikannya! Kes penggunaan yang mungkin diterangkan dalam

    Cara menyambung dengan betul menggunakan mysqli

    mysqli_error()

    Bolehkah sebarang isu berkaitan sambungan dipaparkan? mysqli_error($conn) 预计 mysqli 连接成功。 $conn

    Tidak. 🎜 Mesti sambungan mysqli yang sah, jika tidak, anda akan mendapat mesej ralat ini: 🎜

    $conn->errormysqli_error($conn) Kedua-duanya tidak menunjukkan sebarang ralat berkaitan sambungan!


    Berkaitan: Adakah saya perlu menyemak ralat secara manual semasa memanggil "mysqli_stmt_prepare"?

    balas
    0
  • Batalbalas