Heim  >  Fragen und Antworten  >  Hauptteil

Sollten wir mysqli_connect()-Fehler manuell überprüfen?

Das PHP-Handbuch von

mysqli_connect() empfiehlt, den Rückgabewert zu überprüfen und eine Fehlermeldung auf dem Bildschirm anzuzeigen.

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

Ebenso wird für Konstrukteure im OOP-Stil Folgendes empfohlen:

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}

Einige Benutzer von Stack Overflow haben sogar Code mit mysqli_error($conn) wie diesem verwendet:

$conn = mysqli_connect('localhost', 'a', 'a');
if (!$con) {
    die('Could not connect: ' . mysqli_error($conn));
}

Aber in den letzten Wochen habe ich mir die Frage gestellt: Warum muss ich das tun? Die Ausgabe des ersten Beispiels ist:

Warnung: mysqli_connect(): (HY000/1045): Benutzerzugriff verweigert 'my_user'@'localhost' (Passwort verwenden: JA) C:xampp...mysqli.php Zeile 4

Fehler: Es konnte keine Verbindung zu MySQL hergestellt werden. Debugging-Fehlernummer: 1045 Debugging Fehler: Zugriff für Benutzer „my_user“@„localhost“ verweigert (mit Passwort: Ja)

Wie Sie sehen, wird die Fehlermeldung zweimal angezeigt! Manuelles „Debuggen“ liefert tatsächlich weniger Informationen.

Sollten wir manuell nach Verbindungsfehlern suchen? Können wir auf diese Weise mehr Informationen als durch automatisierte Warnungen erhalten? Ist dies eine empfohlene Vorgehensweise?

P粉031492081P粉031492081381 Tage vor723

Antworte allen(1)Ich werde antworten

  • P粉251903163

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

    永远不要手动显示连接错误!

    如果 MySQLi 无法打开与 MySQL 的连接,它将生成警告。此警告告诉您需要了解的所有信息,包括错误代码、错误消息以及代码中发生错误的位置。手动检查错误不会为您提供更多信息。

    如果您看不到警告并且无法创建连接,则可能意味着您的 PHP 未配置为显示它们。在这种情况下,您必须检查服务器上的错误日志文件。如果您不知道它在哪里,请使用 phpinfo() 获取该信息并搜索 error_log。它会告诉您错误日志文件所在的位置。

    如果错误日志中没有警告,则可能意味着您的 PHP 错误报告已被静默(完全或只是警告)。检查您的 PHP 配置。
    生产环境中,应保留这些设置:

    • error_reporting 必须为 E_ALL
    • log_errors 必须开启
    • display_errors 必须关闭

    开发环境中,应保留这些设置:

    • error_reporting 必须为 E_ALL
    • log_errors 必须开启
    • display_errors 必须开启

    正如您在错误消息中看到的,您的数据库用户名和密码已泄露给最终用户。这是您不想向任何人展示的敏感信息。事实上,普通用户不会理解这个神秘的消息。这就是为什么在生产环境中必须始终关闭 display_errors 的原因。在服务器上记录错误是安全的。

    警告与异常

    警告不会停止脚本。如果发出警告,脚本将继续执行,直到遇到致命错误。在大多数情况下,您需要抛出异常来停止脚本。 不要使用die/exit如果无法建立mysqli连接,则应抛出异常,如果未处理该异常,则会冒泡并以致命错误停止脚本。您可以配置 mysqli 自动抛出异常。这是非常宝贵的,因为所有 mysqli 函数都可能因多种原因而失败,并且它们不会通知您任何问题,除非您手动检查其中每一个错误。在打开连接之前使用以下行:

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

    不要捕获异常,除非您真的知道如何处理它们! 如何使用 mysqli 正确连接

    中描述了一种可能的用例

    mysqli_error() 可以显示任何与连接相关的问题吗?

    没有。 mysqli_error($conn) 预计 mysqli 连接成功。 $conn 必须是有效的 mysqli 连接,否则您会收到此错误消息:

    $conn->errormysqli_error($conn) 都无法显示任何与连接相关的错误!


    相关: 调用“mysqli_stmt_prepare”时我应该手动检查错误吗?

    Antwort
    0
  • StornierenAntwort