我有这个错误:无法获取mysqli,没有数据库错误


I have this error: Couldn't fetch mysqli, with no database errors

我正在发布一个表单以使用 mysqli 将值插入数据库,我收到以下错误:

Warning: mysqli::real_escape_string() [mysqli.real-escape-string]: Couldn't fetch mysqli in /home/richa161/public_html/chat/chat.class.php

我尝试将其包装在 if 语句中以检查从数据库返回的错误,但没有。这是我的代码:

require_once('config.php');
class Chat {
private $mysqli;
//open database connection
function __construct(){
    $this->mysqli = new mysqli(DB_HOST,DB_USER,DB_PASS,DATABASE);
    if($this->mysqli->connect_error){
        die('error');
    } else {
        die('ok');
    }
}
//insert message to database
public function postMessage($username, $message){
    if ($this->mysqli->connect_error) {
        die('Connect Error: ' . $this->mysqli->connect_error);
    } else {
        //make data safe for database
        $username = $this->mysqli->real_escape_string($username);
        $message = $this->mysqli->real_escape_string($message);
        //build query
        $query = "INSERT INTO chat (post_date, username, message) VALUES(NOW(),'".$username."','".$message."')";
        //execute query and store in $result
        $result = $this->mysqli->query($query);
        echo $query;
    }
}
//close database connection
function __destruct(){
    $this->mysqli->close();
}
}

我正在使用jQuery获取表单数据并将其发送到另一个文件,然后该文件使用类来调用所需的函数。但是,我认为问题不在于这些文件。如果你认为我需要发布它们,我会的。但是,可以肯定错误出在上面。

连接详细信息 100% 正确。.

jQuery将值用户名和消息发布到此页面,然后调用该类:

require_once('chat.class.php');
session_start();
if(!isset($_SESSION['chat'])){
    $_SESSION['chat'] = new chat();
}
$chat = $_SESSION['chat']; 
$username = $_POST['username'];
$message = $_POST['message'];
//run function
$chat->postMessage($username, $message);

开始认为这是我发布到我的文件ajaxRouter的方式.php在此文本上方。

索引.php内容:

<script type="text/javascript">
$("#chatForm").submit(function(e){
e.preventDefault();
var username = $("input[name='username']").val();
var message = $("input[name='message']").val();
charCount = username.length;
if(!/[^a-zA-Z0-9]/.test(username) && charCount > 2) {
    $.ajax({
        url: 'ajaxRouter.php',
        type: 'post',
        data: { 'username' : username, 'message' : message },
        success:function(result){
            console.log(result);
        }
    });
} else {
    alert("Username must be more than 2 charcters, no special charcters allowed");
}
});
</script>

您不是在构造mysqli对象,则类mysqli_connect不存在。

您需要将构造函数更改为:

function __construct(){
    $this->mysqli = new mysqli(DB_HOST,DB_USER,DB_PASS,DATABASE);
                        ^^^^^^ You need to construct a `mysqli` object
}

这也是错误的:

$query = "INSERT INTO chat (post_date, username, message) VALUES(NOW(),".$username.",".$message.")";

假设$username$message是字符串,您需要用引号括起来:

$query = "INSERT INTO chat (post_date, username, message)
            VALUES(NOW(),'{$username}','{$message}')";
                         ^           ^ ^          ^ here

编辑:构造函数中没有任何错误处理。要查看是否所有 mysqli 调用都毫无问题地执行,您可以将 mysqli 设置为在出现问题时抛出异常,这样您就不必在每次调用时手动检查。为此,请将其添加到脚本的顶部:

ini_set('display_errors',1);
error_reporting(E_ALL | E_STRICT);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

编辑 2:您不能像这样在会话中保留数据库连接。每次启动脚本时都需要启动新的数据库连接。最合乎逻辑的解决方案是将数据库操作与chat类分开,并始终实例化该操作。

在postMessage(...)中,你检查$this->mysqli->error,这不一定是连接错误(在调用构造函数和调用此函数之间还发生了什么?)。尝试在__construct中检查 $this->mysqli->connect_error,如果连接失败,请将 $this->mysqli 设置为 null。然后,您可以在尝试在其他地方使用它之前检查是否实例化了$this->mysqli。

http://php.net/manual/en/mysqli.connect-error.php

http://php.net/manual/en/mysqli.error.php

你要检查的是你的DB_HOST,DB_USER,DB_PASS,数据库常量。当其中一些没有适当的值时,可能会发生此错误。

还要确保你引用你的值作为弗雷德-ii-指向:

$query = "INSERT INTO chat (post_date, username, message) VALUES(NOW(),'".$username."','".$message."')";

编辑:

这是来自手册:

神秘的"无法获取mysqli"错误消息可能意味着任何数字 的事情,包括:

  1. 您正在尝试使用已关闭的数据库对象。重新打开数据库连接, 或找到拨打mysqli_close($db); 或 $db->close(); 并将其删除。
  2. 由于某种原因,您的 MySQLi 对象已被序列化和取消序列化。定义唤醒函数以重新创建数据库 连接。http://php.net/__wakeup
  3. 除了你关闭了你的mysqli连接之外的东西(特别是,见 http://bugs.php.net/bug.php?id=33772)
  4. 您混合了对数据库对象的 OOP 和函数调用。(因此,>$db您在与 mysqli_query($db))。

这发生在我身上。出现问题是因为我包含两个 php 文件;一个用于数据库连接,另一个用于用户身份验证。用户的身份验证文件本身包含数据库连接文件。实际上,一个 php 文件中有两个连接