【问题标题】:php mysqli "No database selected" using classphp mysqli“未选择数据库”使用类
【发布时间】:2014-09-06 14:27:05
【问题描述】:

当我在没有类的情况下使用 mysqli 时,一切正常:

index.php

require_once(dirname(__FILE__) . '/config.php');

$mysqli = new mysqli($hostname, $username, $password, $dbname);
$queryText = "SELECT * FROM User";
if($query = $mysqli->query($queryText)) {
    $results = $query->fetch_array();
    echo $results['userId'];
} else {
     echo "Error ";
     echo $mysqli->errno . " " . $this->mysqli->error;
}

?>

但是当我开始在类中使用 mysqli 时,出现了问题。 connectDB 没有给出任何错误,所以我连接到 DB。但是当尝试做任何查询时,它给了我“没有选择数据库错误” index.php 的结果是:Error 1046 No database selected

index.php

<?php
require_once(dirname(__FILE__) . '/banana.php');

$banana = new Banana(1);
if ($banana->connectDB()) {
    $banana->doQuery();
}
?>

banana.php

<?php

require_once(dirname(__FILE__) . '/config.php');

class Banana {

     private $mysqli, $userId, $query;

     function __construct($userId) {
          $this->userId = $userId;
     }

     function __destruct() {
        $this->mysqli->close();
     }

     public function connectDB() { // Подключение к БД
          $this->mysqli = new mysqli($hostname, $username, $password, $dbname);
          if ($this->mysqli->connect_errno) {
               echo "Error (" . $this->mysqli->connect_errno . ") " . $this->mysqli->connect_error;
               return false;
          }
          return true;
     }

     public function doQuery() {
        $queryText = "SELECT * FROM User";
        if($this->query = $this->mysqli->query($queryText)) {
            $results = $query->fetch_array();
            echo $results['userId'];
        } else {
            echo "Error ";
            echo $this->mysqli->errno . " " . $this->mysqli->error;
        }
    }

?>

所以这很令人沮丧。我在 php 中大约 2 周,但几天都找不到答案。我想答案很明显,但我看不到。 感谢您的时间和耐心。

【问题讨论】:

  • 你应该阅读变量范围:php.net/manual/en/language.variables.scope.php
  • 检查你的变量:$results = $query-&gt;fetch_array(); - '$this' 在哪里?
  • $mysqli 是 Banana 类的私有属性。我在课堂上的任何地方都将它用作 $this->mysqli.
  • 你不应该用给出的答案来改变你原来的问题,因为那样答案就没有意义了。
  • @jeroen 好的,下次不会了

标签: php mysql class mysqli


【解决方案1】:

您在运行脚本时会遇到的第一个问题是:

 public function connectDB() { // Подключение к БД
      $this->mysqli = new mysqli($hostname, $username, $password, $dbname);

请注意,您在函数调用中使用的所有 4 个变量($hostname 等)都未在方法范围内定义。

有几种方法可以解决这个问题:

  • 将变量作为参数传递给方法:
    public function connectDB($hostname, ...
  • 将必要的变量传递给您的类构造函数并在您的类中设置您以后可以使用的配置属性;
  • 使用常量而不是变量;
  • 将变量声明为全局变量。

我会推荐前两个中的一个,绝对不是最后一个。

你可以阅读更多关于variable scope的php手册。

【讨论】:

  • 谢谢,它有帮助。实际上,我确实在 config.php 中将其声明为全局并将其导入 require_once(dirname(FILE) . '/config.php');奇怪的是 $this->mysqli = new mysqli() 没有给我 $this->mysqli->connect_errno
  • @TimurKhay 即使在您的配置文件中没有全局声明,它也可能是全局的。但是,除非您使用 global 关键字在方法本身中明确指定,否则该方法无法访问全局范围内的变量。
【解决方案2】:

看起来您是复制粘贴的受害者。在 doQuery() 中更改:

if($this->query = $this->mysqli->query($queryText)) {
        $results = $query->fetch_array();

收件人:

if($this->query = $this->mysqli->query($queryText)) {
        $results = $this->query->fetch_array();

【讨论】:

  • 感谢您的回答。我做了改变,但它没有帮助。我想我在执行此操作时会引发错误 if($this->query = $this->mysqli->query($queryText)) 因为它会进入 else 块并回显“Error”
  • @TimurKhay 错误信息是什么?还是一样Error 1046 No database selected
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2013-01-02
  • 1970-01-01
  • 2017-01-31
相关资源
最近更新 更多