查询字符串未从子类处理

Posted

技术标签:

【中文标题】查询字符串未从子类处理【英文标题】:Query string not handled from child class 【发布时间】:2011-12-03 02:36:37 【问题描述】:

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

我正忙于 oop 中的登录脚本。

我准备好了以下课程:

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

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

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

这是文件夹结构:

/
/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

为什么会出现这个错误?

2011 年 12 月 10 日编辑:

我找到了错误所在。

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

因此,用户名和密码等连接详细信息从未设置为私有变量,因此它永远无法连接。

导致查询永远无法从登录类运行。

所以最后还是很简单的。

【问题讨论】:

【参考方案1】:

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

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

您也没有检查$this->db->query(...) 的返回值。如果它失败并返回false,则您将boolean 值盲目地传递给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;

【讨论】:

感谢@mellamokb 和 meagar 的回答。尽管我的问题有点不完整。对此感到抱歉。但问题不在于错误处理(尽管确实不存在),但查询是 100% 正确的。我知道这一点,因为当我在索引中建立查询类并运行查询时,它会给我正确的结果。所以我过去一个小时一直在想,这与我的变量在数据库和查询类中的封装有关。现在想不出更多的东西:S 您对错误处理的权利。我需要把它放在那里。我也这样做了,错误消失了。但是我仍然没有从查询中得到任何结果,这就是问题所在。我仍然对这怎么可能感到困惑。所以我会进一步寻找答案,所以如果你可能对错误有一个想法,那就太好了 @Controvi 您可以告诉我们的最重要的事情仍然缺失:db->query 的返回值是多少?请问可以var_dump吗?您能否通过在执行之前转储$qString 来验证您正在运行的查询?如果您不再收到错误但得到空结果,您能否验证您的查询确实产生了结果? 我已经在参数过去的传入查询中尝试了 var_dump。还尝试了结果 var 的 var 转储,但返回 false。太奇怪了,在索引中创建一个查询实例后,$query->qString('SELECT * FROM users') 它可以工作,但是当我从扩展类调用该函数时它失败了。 我刚刚想到的是,调用查询的函数类可能是第三个扩展。我的意思是 login.lib.php 扩展查询扩展数据库。我现在要调查一下。

以上是关于查询字符串未从子类处理的主要内容,如果未能解决你的问题,请参考以下文章

发布未从 appsettings.production.json 获取连接字符串

字符串参数未从本地通知发送到活动

程序未从文本文件 c++ 中打印出字符串

Hive 外部表未从 CSV 源读取整个字符串

特殊字符 $ 未从命令行 python 读取

连接显示为null,磨损未从DataLayer接收