我发布了一个表单,使用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>
答案 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;错误消息可以表示任何数字 的事情,包括:
- 您尝试使用已关闭的数据库对象。重新打开数据库连接, 或者找到对mysqli_close($ db)的调用;或$ db-&gt; close(); 并将其删除。
- 由于某种原因,您的MySQLi对象已被序列化和反序列化。定义唤醒功能以重新创建数据库 连接。 http://php.net/__wakeup
- 除了你关闭你的mysqli连接之外的东西(特别是,请参阅http://bugs.php.net/bug.php?id=33772)
- 您将OOP和函数调用混合到数据库对象中。 (所以,你在同一个程序中有$ db-&gt; query() mysqli_query($分贝))。
醇>
答案 2 :(得分:0)
在postMessage(...)中你检查$ this-&gt; mysqli-&gt;错误,这不一定是连接错误(在调用构造函数和调用此函数之间还会发生什么?)。尝试在__construct中检查$ this-&gt; mysqli-&gt; connect_error,如果连接失败,请将$ this-&gt; mysqli设置为null。然后,您可以在尝试在其他地方使用之前检查$ this-&gt; mysqli是否已实例化。
答案 3 :(得分:0)
这发生在我身上。出现问题是因为我已经包含了两个php文件;一个用于数据库连接,另一个用于用户的身份验证。用户的身份验证文件本身包含数据库连接文件。实际上在一个php文件中有两个连接