Php 如果包含在另一个对象中,则无法使用mysqli::\构造?
我创建了两个文件:Php 如果包含在另一个对象中,则无法使用mysqli::\构造?,php,mysql,mysqli,Php,Mysql,Mysqli,我创建了两个文件: 1.databaseconnect.php 2.checklogin.php databaseconnect.php: class DatabaseConnection{ public $connected; public $connection; public function __construct($host="localhost", $username="abc", $password="def", $dbname="ghi") { $tbl_name="l
1.databaseconnect.php
2.checklogin.php databaseconnect.php:
class DatabaseConnection{
public $connected;
public $connection;
public function __construct($host="localhost", $username="abc", $password="def", $dbname="ghi") {
$tbl_name="login"; // Table name
$this->connection = new mysqli($host, $username, $password, $db_name);
/* check connection */
if ($mysqli->connect_error){
$this->connected=false;
}
else{
$this->connected=true;
}
}
}
checklogin.php:
<?php
include 'databaseconnect.php';
if($_POST){
$db = new DatabaseConnection;
if($db->connected){
//code flow enters here
$tbl_name = "login";
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];
$myusername = htmlspecialchars($myusername);
$mypassword = htmlspecialchars($mypassword);
$sql="SELECT user_id FROM $tbl_name WHERE user_id='$myusername' or primary_mail='$myusername'";
if($result=$db->connection->query($sql)){
//do something
//not coming in this loop
}
}
?>
错误可能是什么?正确的语法是什么?提前感谢我不是MySQLi的专家,但:
if ($mysqli->connect_error){
$this->connected=false;
}
这看起来是错误的,请尝试以下操作以正确获取错误:
if ($this->connection->connect_error){
die('Connect Error: ' . $this->connection->connect_error);
}
else{
$this->connected=true;
}
未定义文件databaseconnect.php中的变量
$mysqli
因为您正在使用$this->connection=newmysqli($host、$username、$password、$db_name)打开连接
,连接将存储在$this->connection
中,而不是$mysql
。因此,您将替换此:
if ($mysqli->connect_error){
$this->connected=false;
}
为此:
if ($this->connection->connect_error){
$this->connected=false;
}
其次,与其使用$db->connection->query($sql)
进行查询,为什么不在databaseconnect.php中创建一个query()
方法并从那里调用它呢?它使你的代码更干净
databaseconnect.php:
public function query ($sql)
{
return $this->connection->query ($sql);
}
public function query ($sql)
{
return $this->connection->query ($sql) or die ("MySQLi error: '" . $this->connection->error . "' for query: {$sql}");
}
checklogin.php:
$sql="SELECT user_id FROM $tbl_name WHERE user_id='$myusername' or primary_mail='$myusername'";
if($result=$db->query($sql)){
//do something
}
如果您正在调试查询不执行的原因,可以向databaseconnect.php添加调试文本:
public function query ($sql)
{
return $this->connection->query ($sql);
}
public function query ($sql)
{
return $this->connection->query ($sql) or die ("MySQLi error: '" . $this->connection->error . "' for query: {$sql}");
}
为什么要将MySQLi放在另一个类中?@ajtrichards,这样我就可以简单地创建DatabaseConnection对象,而不是在我需要访问数据库的每个文件中使用MySQLi::u构造,并且随着作用域的关闭,将调用析构函数来关闭连接,我在这里没有写过。您遇到了什么样的错误?@Zagor23无法进入if循环。不知道错误。请在编写任何SQL接口代码之前,您必须仔细阅读以避免严重错误。使用
mysqli
时,您应该使用参数化查询,并将用户数据添加到查询中。切勿使用字符串插值来完成此操作htmlspecialchars
不是数据库转义方法,它只应该在呈现HTML结果时使用。是的,没错。但这仍然不能解决问题True,但它意味着您可以处理错误,因为$this->connected将为false。True将改变这一点。但是为什么我不能使用$db->connection->query($sql)如果您更改了它并正确处理了错误,您应该能够找到原因。可能是回显连接错误?我已经更新了我的答案,见上文。谢谢,它提供了帮助,但它抛出了一个错误,即:未选择数据库,但我已在mysqli::_构造函数中提供了数据库名称从mysqli::_构造函数中删除了数据库名称,并在Select查询中添加了databasename。这解决了问题。用于参数的变量与用于连接的变量不匹配。您正在使用$dbname
作为databaseconnect.php的\uu construct()
的第四个参数,但在打开连接时最终使用了$db\u name
(请注意额外的下划线)。