【问题标题】:php connect_errno vs checking if db == falsephp connect_errno vs 检查 db == false
【发布时间】:2017-09-04 18:46:42
【问题描述】:

我正在做一个小型个人项目来了解 PHP 和 MySql。我设置了一个简单的类来开始与数据库建立连接,并想验证连接是否良好,并尝试使用 connect_errno 属性,但没有得到预期的结果。这只是测试代码,因此它可能缺少一些通常包含在此类代码中的错误/安全检查。

请注意,代码在 LAMP Stack 上运行,Ubuntu 16.04 和 PHP 版本:PHP 版本 7.0.22-0ubuntu0.16.04.1

在下面的代码中,我故意将 DB_PASS 常量设置为无效值,以测试两种不同的连接验证方法。

使用 connect_errno 方法似乎不起作用。

class Database
{
    public $conn;
    public $connStatus;

    public function __construct()
    {
        echo "Hi There, I am a database! <br><br>";
        $this->conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);

        if($this->conn->connect_errno)
        {
            echo "Bad Connection using connect_errno method <br/>";
        }
        else
        {
            echo "Good Connection using connect_errno method <br/>";
        }

        if ($this->conn == false)
        {
            echo "Bad Connection using db==false method <br/>";
        }
        else
        {
            echo "Good Connection using db==false method <br/>";
        }
    }

}

此代码块表明连接良好,尽管 DB_PASS 不正确。返回:使用 connect_errno 方法的良好连接。

if($this->conn->connect_errno)
        {
            echo "Bad Connection using connect_errno method <br/>";
        }
        else
        {
            echo "Good Connection using connect_errno method <br/>";
        }

此代码块表示连接错误,由于DB_PASS不正确,这是正确的。返回:使用 db==false 方法的错误连接

if ($this->conn == false)
        {
            echo "Bad Connection using db==false method <br/>";
        }
        else
        {
            echo "Good Connection using db==false method <br/>";
        }

我可以使用“db==false”检查方法,但我对此很好奇。我已经阅读了 Stack Exchange 中的几篇文章并尝试了其中一些示例,但它们似乎不起作用。

示例 1:echoing-mysqli-connect-errno-not-working.

示例 2:error on mysqli::connect_errno

【问题讨论】:

  • 这似乎与您链接的答案完全一致 - stackoverflow.com/questions/25809912/… 您混合了 OO 界面和程序界面。
  • 我尝试了这些示例,但它们不起作用。我不确定我做错了什么。
  • “他们不会工作”并不能真正帮助任何人回答你的问题,没有具体细节。您的代码与您链接的答案中的代码不匹配。您正在使用 mysqli_connect 并期望 OO 接口正常工作。这在欺骗中专门解决了,请再次阅读答案。
  • 问题是你不应该混合程序和 OOP。它通常会起作用 - 但有一个重要区别:使用 OOP 连接(与您正在做的不同)将始终返回一个对象。然后您需要使用connect_errno 属性,这比检查布尔值要好。

标签: php mysql mysqli


【解决方案1】:

好的,在返回并查看其他帖子后,我现在明白了这个问题。程序方法是这样设置的:

$this->conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);

而 OOP 方法是这样设置的:

$this->conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

所以我想我对 PHP 和 MySQL 还比较陌生,直到退后一步,我才真正看到了区别。感谢大家的帮助!

【讨论】:

    【解决方案2】:

    不同之处在于 mysqli_connect() 将返回一个 mysqli 对象或布尔值false。但是您不能在不是对象的变量上使用 -&gt; 运算符。

    $x = false;
    echo $x->attrib; // fatal error, booleans can't have OO members or methods
    

    这是 PHP 中的 WTF 时刻之一。由于其历史原因,PHP 语言设计是面向对象和非面向对象的弗兰肯斯坦怪物(由于多年开发语言而没有明智的设计过程而变得更糟)。

    所以 PHP 中有很多函数返回 一个对象或一个非对象。这使得编写安全代码变得很困难,因为你永远不知道是否可以在函数返回的东西上使用-&gt;,直到你检查它是什么类型。

    如果您使用new mysqli(),混淆会减少,因为OO 运算符new 保证返回该类型的对象,即使连接失败是因为您输入了错误的密码或其他原因。

    $conn = new mysqli(...);
    if ($conn->connect_errno) {  // this is not a fatal error even if the connect failed
        ...
    }
    

    【讨论】:

    • 投反对票的人,你能帮我理解为什么你认为这是一个不好的答案吗?也许我可以改进它。
    猜你喜欢
    • 1970-01-01
    • 2017-08-02
    • 2023-03-31
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多