2015-09-05 2 views
0

Я знаю, что проблема связана с первым параметром mysqli_query, но я не могу, чтобы жизнь меня определяла, какой именно параметр должен быть. Я могу заставить это работать с mysql_query, но я пытаюсь изучить OOP, а также преобразовать в mysqli. Я хотел бы иметь возможность вызвать соединение (и отключить в конце концов), когда оно мне понадобится, а затем выполнить запросы после его подключения. Любая помощь была бы фантастической.php class mysqli_query issue

database.php

class Database{ 

private $db_host = "localhost"; 
private $db_user = "root"; 
private $db_pass = "root"; 
private $db_name = "db"; 

public function __construct(){ 

    $this->connect(); 

} 

public function connect() 
{ 
    //If database is not connected, look to connect 
    if(!$this->con) 
    { 
     $myconn = mysqli_connect($this->db_host,$this->db_user,$this->db_pass); 
     //If database is connected, select table 
     if($myconn) 
      { 
      $seldb = mysqli_select_db($this->db_name,$myconn); 
      //If database is selected, return conn 
      if($seldb) 
      { 
       $this->con = true; 
       return true; 
      } else 
      { 
       return false; 
      } 
     } else 
     { 
      return false; 
     } 
    } else 
    { 
     return true; 
    } 
} 

public function disconnect() 
{ 
if($this->con) 
{ 
    if(mysqli_close()) 
    { 
     $this->con = false; 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 
} 

} 

school.php

require_once('database.php'); 

class Schools{ 

public function __construct() 
{ 
    $connection = new Database(); 
    $this->getAllSchools(); 
} 

public function getAllSchools($connection){ 

$schoolsql = "SELECT SID, schoolName, schoolCity, schoolCountry, schoolRegion FROM schools ORDER BY SID"; 

$schoolquery = mysqli_query($connection->con, $schoolsql); 
$results = array(); 

while($row = mysqli_fetch_array($schoolquery)) 
     { 
      $results[] = array(
       'id' => $row['SID'], 
       'name' => $row['schoolName'], 
       'city' => $row['schoolCity'], 
       'country' => $row['schoolCountry'], 
       'region' => $row['schoolRegion'] 
      ); 
     } 

     $json = json_encode($results); 
     echo $json; 

} 
} 

$school = new Schools; 

Я знаю, что это, где все это терпит неудачу. $ schoolquery = mysqli_query ($ connection-> con, $ schoolql);

Я просто не знаю, какая перестановка переменной соединения mysqli действительно ожидает от класса Database?

Этот набор кодов «работает». Я знаю, что это проблемы безопасности, но сейчас, когда я учусь, я просто пытаюсь получить результат из базы данных, которую я ожидаю, но в конце концов структура кода не то, что я хочу. Я бы предпочел, чтобы файл database.php содержал класс, который я могу создать в файле schools.php. Сейчас он просто создает соединение, и я могу загрузить его в класс Schools. Я рассмотрел несколько проблем подключения класса mysqli на SO (и в Google) и попробовал несколько перестановок, но я не мог заставить параметр класса базы данных работать.

database.php

$db_host = "localhost"; 
$db_user = "root"; 
$db_pass = "root"; 
$db_name = "db"; 

$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name); 
if (!$mysqli) { 
    die("Connection failed: " . mysqli_connect_error()); 
} 

schools.php

class Schools{ 

function __construct($mysqli){ 
    $this->mysqli = $mysqli; 
} 

//Method to return all schools 
function getAllSchools() { 
    $query = "SELECT SID, schoolName, schoolCity, schoolCountry, schoolRegion FROM schools ORDER BY SID ASC"; 
    $results = array(); 
     if ($result = $this->mysqli->query($query)) 
     { 
      while ($row = $result->fetch_assoc()) { 
       $results[] = array(
        'id' => $row['SID'], 
        'name' => $row['schoolName'], 
        'city' => $row['schoolCity'], 
        'country' => $row['schoolCountry'], 
        'region' => $row['schoolRegion'] 
       ); 
      } 
     $json = json_encode($results); 
     echo $json; 
     $result->close(); 
     } else { 
      echo "No results"; 
     } 
    } 
//Method to return one school 
function getASchool ($id) { 

    $query = "SELECT SID, schoolName, schoolCity, schoolCountry, schoolRegion FROM schools WHERE SID=$id"; 
    $results = array(); 
     if ($result = $this->mysqli->query($query)) 
     { 
      while ($row = $result->fetch_assoc()) { 
       $results[] = array(
        'id' => $row['SID'], 
        'name' => $row['schoolName'], 
        'city' => $row['schoolCity'], 
        'country' => $row['schoolCountry'], 
        'region' => $row['schoolRegion'] 
       ); 
      } 
     $json = json_encode($results); 
     echo $json; 
     $result->close(); 
     } else { 
      echo "No results"; 
     } 
} 
} 

$school = new Schools($mysqli); 
$school->getASchool("120"); 
+0

Мы можем видеть '$ this-> db_host, $ this-> db_user ...', но где '$ this-> con'? –

+0

'$ conn = mysqli_connect ($ servername, $ username, $ password, $ dbname);' мы не можем видеть, откуда пришли все эти переменные? Почему бы не использовать, например, '$ this-> db_user' и т. д. –

ответ

-1

ПРИМЕЧАНИЕ: Есть несколько вещей, которые могут/должны быть улучшены о структуре кода, однако этот ответ предназначен, чтобы ответить на ваш прямой вопрос только.

Есть две части:

в вашем class Database, вместо return true;, вам нужно return $this->con, например, так:

class Database{ 

    private $db_host = "localhost"; 
    private $db_user = "root"; 
    private $db_pass = "root"; 
    private $db_name = "db"; 
    // Add this class variable to store con 
    private $con = FALSE; 

    public function __construct(){ 
     // Return the connection 
     return $this->connect(); 

    } 

    public function connect() { 
     //If database is not connected, look to connect 
     if(! $this->con) { 
      $myconn = mysqli_connect($this->db_host,$this->db_user,$this->db_pass); 
      //If database is connected, select table 
      if($myconn) { 
       $seldb = mysqli_select_db($this->db_name,$myconn); 
       //If database is selected, return conn 
       if($seldb) { 
        // Assign the class variable to the connection 
        $this->con = $myconn; 
        // Return the connection 
        return $this->con; 
       } else { 
        return false; 
       } 
      } else { 
       return false; 
      } 
     } else { 
      // Return the connection 
      return $this->con; 
     } 
    } 
// ... the rest of your class ... 

} 

Тогда в вашем class Schools, вы должны использовать переменную класса для вашего $connection, например, так:

class Schools{ 
    // Class variable to store your database connection 
    private $connection; 

    public function __construct() { 
     // Assign the connection to your class variable 
     $this->connection = new Database(); 
     $this->getAllSchools(); 
    } 

    public function getAllSchools($connection){ 
     $schoolsql = "SELECT SID, schoolName, schoolCity, schoolCountry, schoolRegion FROM schools ORDER BY SID"; 
     // Use the class variable to connect 
     $schoolquery = mysqli_query($this->connection, $schoolsql); 
     $results = array(); 
    // ... rest of your code 
    } 
} 

Редактировать на основе расширенного ответа:

Во-первых, ваша линия здесь: $school = new Schools($mysqli); - это форма dependency injection. Это то, что было бы хорошо узнать/познакомиться, поскольку это очень ценно при написании классов, которые «зависят» от других классов.

Что касается определения того, почему приведенный ниже код не выполняет то, что вы ожидаете, мне нужно будет увидеть вашу версию кода. Обратите внимание, что в номерах класса Database, которые я предоставил , есть три новых линий return. Если какой-либо из них отсутствует, код может не работать.

Код действительно должен был сбой с фатальной ошибкой - функция getAllSchools ожидала параметр, но вызов к нему не включал этот параметр.

НАКОНЕЦ, самое лучшее, что нужно сделать, это научиться отлаживать это. Получить некоторые поиск неисправностей происходит, путем изменения функции Schools класса, как показано ниже:

public function getAllSchools(){ 
    $schoolsql = "SELECT SID, schoolName, schoolCity, schoolCountry, schoolRegion FROM schools ORDER BY SID"; 
    // Use the class variable to connect 
    $schoolquery = mysqli_query($this->connection, $schoolsql); 
    // Is there an issue? Let's output it: 
    var_dump(mysqli_error($this->connection)); 
    $results = array(); 
// ... rest of your code 
} 

предоставить нам подробные сведения об ошибке (ы), и не забудьте обновить нас с определенным кодом, который вы используете, что порождает ошибка (ы).

+0

мы можем видеть' $ this-> db_host, $ this-> db_user ... ', но где' $ this-> con'? –

+0

@cale_b Спасибо за ваше время и ответ. К сожалению, даже с изменениями кода я получаю пустой массив при возврате. Первоначально у меня была функция getJSON, которая вызывала вызов, но затем я только начал получать доступ к php-странице сам по себе - и все равно ничего. Когда я добавляю метод mysqli_error в запрос, он возвращает ошибку подключения. Самое смешное, что если я просто использую функции mysql, ВСЕ вернется, как и ожидалось. Это как-то связано с первым параметром запроса. Это не запрос MYSQL, потому что, если я помещаю его в phpMyAdmin, все работает отлично. – user1557966

+0

@cale_b благодаря вашему предложению. Я отредактировал вопрос. две нижние ссылки на код - это текущие наборы кода, которые «работают», но у меня больше нет класса базы данных. Я просто подключаюсь и загружаю файл database.php. Я не мог, в своей жизни, получить запрос mysql для использования возвращаемого соединения из класса. Я думаю, что я просто недостаточно понимаю, как возвращенные данные из функции могут передаваться между/внутри классов? – user1557966

0

Я предпочел бы иметь файл database.php содержать класс

у вас есть. Имейте в виду, что Mysqli - это класс первого класса.

, который я могу создать в файле schools.php.

У вас не может быть этого. Создание экземпляра класса mysqli означает создание нового соединения с mysql, которое вы обязательно хотите сделать только после за сценарий. Таким образом, вам нужно создать экземпляр только один раз, а затем передать этот экземпляр экземпляра другим классам, как и вы.