PHP:没有选择数据库

时间:2014-09-22 10:32:19

标签: php mysql

我的WAMP出现了一个奇怪的错误(PHP 5.5.12,MySQL 5.6.17)。

主要错误是:未选择数据库。 我这里有两个数据库表:

城市:id,城市

事件(此处未包含某些字段):id,eventHeader,cityID。

所以,有我的代码。 此函数取代所有事件,但在数据库中城市被写为cityID,所以我有另一个必须将cityID转换为城市名称的函数。

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()

1 个答案:

答案 0 :(得分:1)

一般来说,在请求生命周期内只有一个连接是个好主意,所以这可能对您有用:

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()内的viewEvents()