Строка запроса не обработана из дочернего класса - PullRequest
2 голосов
/ 07 октября 2011

Я здесь впервые, поэтому надеюсь, что вы мне поможете. Это моя проблема:

Я занят сценарием входа в систему в oop.

У меня готовы следующие классы:

  • класс базы данных
    это просто класс подключения / отключения

  • класс запросов расширяет класс базы данных
    существует только 1 функция, которая принимает только строку запроса и передает ее через базу данных, а затем возвращает массив с данными.

  • логин
    этот класс будет получать информацию для входа в систему и получать информацию о пользователе из базы данных.

это структура папок:

/
/cgi-bin -> holds the database and query class
/libraries -> holds the login class

Тогда осталось 2 файла, это index.php и global.php.

В моем индексе у меня есть это:

require_once('global.php');

print_r($login->userCheck('test'));

и это внутри моего global.php:

include('cgi-bin/database.php');
include('cgi-bin/query.php');
include('libraries/login.lib.php');


$login = new Login();

это мой логин

class Login extends Query{

  public function Login(){

  }

  public function userCheck($userCredentials){
  $result = $this->qString('SELECT * FROM users');
  return $result;

}

}

и мой класс запросов

class Query extends Database{
  function qString($qString){

    //Start connection with database
    $this->conncect();

    $result = $this->db->query($qString);
    // fetch associative array
    while ($row = mysqli_fetch_assoc($result)) {
      $data[] = $row;
    }

    // free result set 
    mysqli_free_result($result);

    //Close connection with database
    $this->disconnect();

    //Check mysqli connection
    //print_r(explode('  ', mysqli_stat($this->db)));

    return $data; 

  }
}

и класс базы данных:

class Database {

  //Private variables for database connection.
  private $server;
  private $usern;
  private $userp;
  private $database;

  //The database object.
  protected $db;

  function Database(){

    $dbCredentials = explode(',',file_get_contents('cgi-bin/dbcredentials.txt'));

    $this->server = $dbCredentials[0];
    $this->usern  = $dbCredentials[1];
    $this->userp  = $dbCredentials[2];
    $this->db     = $dbCredentials[3];

  }

  protected function conncect(){            
    $this->db = mysqli_connect($this->server, $this->usern, $this->userp, $this->db);
  }

  protected function disconnect(){
    mysqli_close($this->db);
  }

}   

теперь, когда я запускаю это, он говорит это:

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\Login\cgi-bin\query.php on line 11

Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\Login\cgi-bin\query.php on line 16

Notice: Undefined variable: data in C:\xampp\htdocs\Login\cgi-bin\query.php on line 25

Почему я получаю эту ошибку?

Изменить 12-10-2011:

Я обнаружил, в чем была ошибка.

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

Из-за этого детали соединения, такие как имя пользователя и пароль, никогда не устанавливались в частные переменные, и при этом они никогда не могли соединиться.

В результате запрос никогда не может быть запущен из класса входа в систему.

В конце концов, все было довольно просто.

1 Ответ

2 голосов
/ 07 октября 2011

Вам необходимо прочитать документацию для mysqli::query. Он возвращает набор результатов только при наличии результатов . В случае ошибки он возвращает логическое значение false, а для многих типов запросов он возвращает логическое значение true в случае успеха:

Возвращает FALSE при ошибке. Для успешных запросов SELECT, SHOW, DESCRIBE или EXPLAIN mysqli_query () вернет объект MySQLi_Result. Для других успешных запросов mysqli_query () вернет TRUE.

Вы также не проверяете возвращаемое значение $this->db->query(...). Если он завершается с ошибкой и возвращает false, вы слепо передаете это логическое значение mysqli_fetch_assoc, следовательно, сообщение об ошибке

mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given

Пожалуйста, добавьте базовую обработку ошибок в ваш код:

$result = $this->db->query($qString);

if ($result === false) {
  // error in query
  die("'$query' failed");
}

if ($result === true) {
  // not a query which returns results
  return true;
}

// fetch associative array
while ($row = mysqli_fetch_assoc($result)) {
  $data[] = $row;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...