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

时间:2015-01-20 14:48:19

标签: php oop mysqli

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

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

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

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的方式,它位于此文本之上。

index.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>

4 个答案:

答案 0 :(得分:2)

您没有构建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类分开并始终实例化。

答案 1 :(得分:0)

您需要检查的是DB_HOST,DB_USER,DB_PASS,DATABASE常量。 当其中一些不具备适当的值时,可能会发生此错误。

还要确保将您的值引用为Fred -ii-pointed:

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

修改

这来自manual

  

神秘的&#34;无法获取mysqli&#34;错误消息可以表示任何数字   的事情,包括:

     
      
  1. 您尝试使用已关闭的数据库对象。重新打开数据库连接,   或者找到对mysqli_close($ db)的调用;或$ db-&gt; close();   并将其删除。
  2.   
  3. 由于某种原因,您的MySQLi对象已被序列化和反序列化。定义唤醒功能以重新创建数据库   连接。 http://php.net/__wakeup
  4.   
  5. 除了你关闭你的mysqli连接之外的东西(特别是,请参阅http://bugs.php.net/bug.php?id=33772
  6.   
  7. 您将OOP和函数调用混合到数据库对象中。 (所以,你在同一个程序中有$ db-&gt; query()   mysqli_query($分贝))。
  8.   

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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