2014-09-22 6 views
1

У меня странная ошибка из моего WAMP (PHP 5.5.12, MySQL 5.6.17).PHP: База данных не выбрана

Основная ошибка: база данных не выбрана. У меня есть две таблицы базы данных здесь:

город: Удостоверение личности, город

и

событие (некоторые поля не включены): идентификатор, 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; 
} 

Таким образом, это БДСВЯЗЬ ($ конф) {

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

Убедитесь, что '$ conf' имеет правильные значения. – timclutton

+0

И вы подтвердили, что '$ conf' содержит все ожидаемые значения в вашей второй функции? – CBroe

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

Таким образом, вы всегда будете использовать только одно подключение к базе данных, независимо от того, сколько раз вы называете БДСВЯЗЬ(). Если соединение уже открыто, оно вернет его; иначе он откроет соединение и вернет его.

EDIT: О, почему второе соединение не работает

В функции viewEvents() вызов getCity() использует статическую версию self::getCity(); в то время как внутри функции getCity() есть два вызова метода объекта: $this->getConf() и $this->dbConnect().

Я предлагаю изменить звонок с self::getCity() по номеру $this->getCity() внутри функции viewEvents().

+0

Это решение отлично работает, оценивается Но я до сих пор не знаю, почему второй метод не хочет подключаться :(Может быть, мне стоит переустановить WAMP-сервер ... –

+0

Ой, подождите! Посмотрите, как вы называете getCity: ** self :: getCity() * * Это статический вызов метода класса, но затем внутри метода, который вы используете ** $ this-> getConf() ** и ** $ this-> dbConnect() **. Попробуйте изменить ** self: : getCity() ** для ** $ this-> getCity() ** –

+0

О, уже сделано, чем К вам! –

Смежные вопросы