我的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()
。