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