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
(请注意额外的下划线)。