2015-12-11 4 views
1

Я новичок в PHP, поэтому, пожалуйста, проявляйте терпение.Вложенные PHP-запросы SQL в классе

Я пишу фрагмент PHP для извлечения сложной структуры данных из базы данных MySQL. (Думаю, что «имеет« объектные отношения ».) У меня есть один SQL-запрос, который переводит результаты в список объектов PHP. Эти объекты PHP содержат объекты PHP (иногда в виде массивов), определенные в других таблицах MySQL. Таким образом, конструктор первого объекта должен построить собственный SQL-запрос для построения внутреннего объекта (ов). К сожалению, я не привык делать это, так что я получаю эту ошибку:

Database error: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

Как установить это так, что, когда я называю get_tickets.php, он не имеет этих проблем SQL запросов?

config.php

<?php 
    // These variables define the connection information for your MySQL database 
    $dbhost = '####'; 
    $dbuser = '####'; 
    $dbpass = '####'; 
    $dbname = '####'; 

    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 

    // Attempt to connect to the database 
    try { 
    $db = new PDO("mysql:host={$dbhost};dbname={$dbname};charset=utf8", 
        $dbuser, $dbpass, $options); 
    } catch (PDOException $ex) { 
    die("Failed to connect to the database: " . $ex->getMessage()); 
    } 

    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

    // Disable magic quotes 
    if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) 
    { 
     function undo_magic_quotes_gpc(&$array) 
     { 
      foreach($array as &$value) 
      { 
       if(is_array($value)) 
       { 
       undo_magic_quotes_gpc($value); 
       } 
       else 
       { 
        $value = stripslashes($value); 
       } 
      } 
     } 
     undo_magic_quotes_gpc($_POST); 
     undo_magic_quotes_gpc($_GET); 
     undo_magic_quotes_gpc($_COOKIE); 
    } 

    // Tell browser to use UTF-8 encoding 
    header('Content-Type: text/html; charset=utf-8'); 

    // Start the session 
    if(!isset($_SESSION)){ 
     session_start(); 
    } 
?> 

get_tickets.php

<?php 
    require_once('config.php'); 
    require('data_access_objects.php'); 

    // Check for hash 
    if (isset($_POST['hash'])) { 
    // Get user's hash 
    $hash = $_POST['hash']; 

    // Result array to return 
    $results = Array(); 

    try { 
     // Get all ticket entries 
     $query = "SELECT * 
        FROM tickets 
        WHERE user = (
        SELECT id 
        FROM users 
        WHERE hash = :hash)"; 
     $stmt = $db->prepare($query); 
     $stmt->bindValue(':hash', $hash, PDO::PARAM_STR); 
     $stmt->execute(); 

     // Convert cursor entries into class objects 
     while($row = $stmt->fetch()) { 
     array_push($results, new Ticket($row['id'], $row['status'], $row['room'], 
        $row['location'], $row['gps_loc'], $row['subject'], 
        $row['picture'], NULL)); 
     } 

     // Display resulting array entries 
     echo json_encode(array_values($results)); 
    } catch (PDOException $ex) { 
     // Display generic error on page 
     echo 'Database error: ' . $ex->getMessage(); 
    } 
    } else { 
    // Failed, return nothing 
    echo ''; 
    } 
?> 

data_access_objects.php

<?php 
    /* Room data access object structure */ 
    class Room 
    { 
    var $id; 
    var $name; 
    var $building; 

    function __construct($id, $name, $building) 
    { 
     $this->id = $id; 
     $this->name = $name; 
     $this->building = $building; 
    } 
} 

/* Ticket data access object structure */ 
class Ticket 
{ 
    var $id; 
    ... 
    var $room; 
    ... 
    var $messages = Array(); 

    function __construct($id, $status, $room, $location, $gpsLocation, 
          $subject, $picture, $messages) 
    { 
     $this->id = $id; 
     ... 
     $this->retrieveRoom($room); 
     ... 
     $this->messages = $messages; 
    } 

    private function retrieveRoom($room_id) 
    { 
     require_once('config.php'); 
     try { 
     // Get all ticket entries 
     $query = "SELECT * 
        FROM rooms 
        WHERE id = :room_id)"; 
     $stmt = $db->prepare($query); 
     $stmt->bindValue(':id', $room_id, PDO::PARAM_INT); 
     $stmt->execute(); 

     // Convert cursor entrie into room object 
     $row = $stmt->fetch(); 
     $this->room = new Room($row['id'], $row['name'], $row['building']); 
     } catch (PDOException $ex) { 
     // Display generic error on page 
     echo 'Database error: ' . $ex->getMessage(); 
     }'' 
    } 
    ... 
    } 
?> 

ответ

1

Похоже PDO жалуется на неправильные параметры, я бы проверить точно, Что быть для вашего метода:

private function retrieveRoom($room_id) 

Для защиты квалифицируйте, что $ room_id является числовым до выдачи запроса.

Я добавлю, хотя ваш текущий метод неэффективен. Вы должны уплотнять свой запрос и создавать свои объекты из объединенных записей.

+0

Спасибо за ваш ответ. Я признаю, что это неэффективно. В любом случае, теперь я получаю новую ошибку > Примечание: неопределенная переменная: db в D: \ xampp \ htdocs \ castisy \ json_queries \ data_access_objects.php в строке 118 > Неустранимая ошибка: вызов функции-члена для подготовки () на null в D: \ xampp \ htdocs \ castisy \ json_queries \ data_access_objects.php в строке 118 – JDahmen

+0

где определено значение $ db? – Clay

+0

config.php, как видно выше – JDahmen

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