查询字符串未从子类处理

时间:2011-10-07 15:18:19

标签: php database oop login

这是我第一次来这里,所以我希望你能帮助我。这是我的问题:

我正忙着在oop中使用登录脚本。

我准备好以下课程:

  • 数据库类
    这只是一个连接/断开连接类

  • 查询类扩展了数据库类
    只有一个函数,它只接受一个查询字符串并通过数据库获取它,并最终返回一个包含数据的数组。

  • 登录类
    该类将获取用户登录信息并从数据库中获取用户信息。

这是文件夹结构:

/
/cgi-bin -> holds the database and query class
/libraries -> holds the login class

然后剩下2个文件,它们是index.php和global.php。

在我的索引中我有这个:

require_once('global.php');

print_r($login->userCheck('test'));

这是我的global.php:

include('cgi-bin/database.php');
include('cgi-bin/query.php');
include('libraries/login.lib.php');


$login = new Login();

这是我的登录类

class Login extends Query{

  public function Login(){

  }

  public function userCheck($userCredentials){
  $result = $this->qString('SELECT * FROM users');
  return $result;

}

}

和我的查询类

class Query extends Database{
  function qString($qString){

    //Start connection with database
    $this->conncect();

    $result = $this->db->query($qString);
    // fetch associative array
    while ($row = mysqli_fetch_assoc($result)) {
      $data[] = $row;
    }

    // free result set 
    mysqli_free_result($result);

    //Close connection with database
    $this->disconnect();

    //Check mysqli connection
    //print_r(explode('  ', mysqli_stat($this->db)));

    return $data; 

  }
}

和数据库类:

class Database {

  //Private variables for database connection.
  private $server;
  private $usern;
  private $userp;
  private $database;

  //The database object.
  protected $db;

  function Database(){

    $dbCredentials = explode(',',file_get_contents('cgi-bin/dbcredentials.txt'));

    $this->server = $dbCredentials[0];
    $this->usern  = $dbCredentials[1];
    $this->userp  = $dbCredentials[2];
    $this->db     = $dbCredentials[3];

  }

  protected function conncect(){            
    $this->db = mysqli_connect($this->server, $this->usern, $this->userp, $this->db);
  }

  protected function disconnect(){
    mysqli_close($this->db);
  }

}   

现在,当我运行它时,它说:

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\Login\cgi-bin\query.php on line 11

Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\Login\cgi-bin\query.php on line 16

Notice: Undefined variable: data in C:\xampp\htdocs\Login\cgi-bin\query.php on line 25

为什么我收到此错误?

编辑12-10-2011:

我发现错误是什么。

与您分享: 有错误的是,数据库类的构造从未运行过。

因此,用户名和密码之类的连接细节从未设置为私有变量,因此永远无法连接。

结果是查询永远不能从登录类运行。

最后这很简单。

1 个答案:

答案 0 :(得分:2)

您需要阅读mysqli::query的文档。只有在有结果时才会返回结果集。出错时,它将返回布尔值false,对于许多类型的查询,它将在成功时返回布尔值true

  

失败时返回FALSE。对于成功的SELECT,SHOW,DESCRIBE或EXPLAIN查询,mysqli_query()将返回一个MySQLi_Result对象。对于其他成功的查询,mysqli_query()将返回TRUE。

您也没有检查$this->db->query(...)的返回值。如果它失败并返回false,您将盲目地将布尔值传递给mysqli_fetch_assoc,因此出现错误消息

mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given

请为您的代码添加一些基本的错误处理:

$result = $this->db->query($qString);

if ($result === false) {
  // error in query
  die("'$query' failed");
}

if ($result === true) {
  // not a query which returns results
  return true;
}

// fetch associative array
while ($row = mysqli_fetch_assoc($result)) {
  $data[] = $row;
}