我的WAMP(PHP 5.5.12,MySQL 5.6.17)出现了一个奇怪的错误。
主要错误是:未选择数据库。
这里有两个数据库表:
城市:id,城市

事件(此处不包括某些字段):id、eventHeader、cityID。
所以,这是我的密码。
此函数显示所有事件,但在数据库中,city被写为cityID,因此我有另一个函数必须将cityID转换为city name。

public function viewEvents($conf) {

  // Connecting to DB with parameters from config file;
  $mysqli = $this->dbConnect($conf);

  // quering...
  $query = "SELECT * FROM events";
  $result = $mysqli->query($query);

  while($row = mysqli_fetch_array($result)) {
    if($row['featured'] == 1) {
      $row['header'] = '<b>' . $row['header'] . '</b>';
    }

    // Getting City Name;
    $city = self::getCity($row['id']);

    // Echoing table with results here.
    echo '';
  }
  $result->free();
  $mysqli->close();
}

此函数完全没有错误,工作正常。但下一个。。。
这是我的getCity($id):
 public function getCity($id) {

   $conf = $this->getConf();  // Getting config data (with db access);
   $mysqli = $this->dbConnect($conf);  // connecting to MySQL;

   // I'm echoing the possible mysql connection error here;


   // Quering...
   $query = "SELECT * FROM cities WHERE id = '" . $id . "';";
   $result = $mysqli->query($query);

   // Echoing mysql query error here with die();

   $row = $result->fetch_array();
   $city = $row['city'];
   return $city;
}

所以,这是dbConnect($conf){
public function dbConnect($conf) {
  $mysqli = mysqli_connect($conf['db-host'], $conf['db-usr'], $conf['db-psw'], $conf['db-name']);
  return $mysqli;
}

尽管我的代码有很多变化,我还是得到了同样的错误:No database selected。有没有可能,因为第一种方法工作得很好,而且它们都使用相同的dbConnect()

最佳答案

一般来说,在请求生存期内只有一个连接是一个好主意,因此这可能对您有用:

static function dbConnect($conf)
{
    static $mysqli = null;
    if ( $mysqli === null )
    {
        $mysqli = mysqli_connect($conf['db-host'], $conf['db-usr'], $conf['db-psw'], $conf['db-name']);
    }
    return $mysqli;
}

// Call this function like this:
$mysqli = self::dbConnect($conf);

现在,如果您有一个返回配置参数的可靠方法,您甚至可以这样改进它,以避免每次都必须通过配置。:
static function dbConnect()
{
    static $mysqli = null;

    if ( $mysqli === null )
    {
        $conf = $this->getConf();
        $mysqli = mysqli_connect($conf['db-host'], $conf['db-usr'], $conf['db-psw'], $conf['db-name']);
    }

    return $mysqli;
}

// Call this function like this:
$mysqli = self::dbConnect();

这样,无论调用dbConnect()多少次,都将始终只使用到数据库的一个连接。
如果连接已经打开,它将返回它;否则它将打开连接,然后返回它。
编辑:关于为什么第二个连接不起作用
viewEvents()函数中,对getCity()的调用使用静态版本;而在self::getCity()函数中,有两个对对象方法的调用:getCity()$this->getConf()
我建议在$this->dbConnect()函数中将调用从self::getCity()更改为$this->getCity()

10-07 14:02