我正在发布一个表单以使用 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"错误消息可能意味着任何数字 的事情,包括:
- 您正在尝试使用已关闭的数据库对象。重新打开数据库连接, 或找到拨打mysqli_close($db); 或 $db->close(); 并将其删除。
- 由于某种原因,您的 MySQLi 对象已被序列化和取消序列化。定义唤醒函数以重新创建数据库 连接。http://php.net/__wakeup
- 除了你关闭了你的mysqli连接之外的东西(特别是,见 http://bugs.php.net/bug.php?id=33772)
- 您混合了对数据库对象的 OOP 和函数调用。(因此,>$db您在与 mysqli_query($db))。
这发生在我身上。出现问题是因为我包含两个 php 文件;一个用于数据库连接,另一个用于用户身份验证。用户的身份验证文件本身包含数据库连接文件。实际上,一个 php 文件中有两个连接