2010-09-29 6 views
2

Я немного новичок в ООП, но я играл с ним около месяца. Обычно я создаю класс под названием Mysql, который имеет функцию __construct, которая напрямую подключается к базе данных. И после этого у меня есть много разных функций, которые получают или вставляют данные в разные таблицы.PHP/Mysql - Динамический выбор данных?

Сегодня, на автобусе, я начал думать, и я придумал блестящую идею, которая сделала бы ее менее загроможденной. Моя идея состоит в том, чтобы использовать одну единственную функцию, которая выбирает данные (и одну для вставки), и в зависимости от того, как передаваемый запрос выглядит, он будет выбирать разные данные из разных таблиц. Отлично, правда?

Но я как бы застрял здесь. Я не знаю, как это сделать. У меня есть небольшая подсказка, как она может работать, но я не знаю, как я привяжу результаты или приведу их в массив. Запрос будет создан другим методом, а затем будет передан в функцию select/insert в классе Mysql.

Я нарисовал «эскиз» о том, как я думаю, что это может сработать. Вот он:

Конечно, приведенная ниже функция будет помещена в класс Mysql и будет иметь подключение к базе данных.

// This is an example query that could be passed in. 
$query = "SELECT * FROM table WHERE id=150"; 

function select_data($query) { 
    if ($smtp = $this->conn->prepare($query)) { 

     $smtp->execute(); 
     $smtp->bind_results(What happens here?); 

     if ($smtp->fetch()) { 

      foreach (fetched_row? as $key => $value) { 
       $return[] = $key => $value; 
      } 

      return $return; 

     } 
     else return NULL; 

    } 
    else return $this->conn->error; 
} 

Большое спасибо всем, кто может показать мне, как это можно достичь.

ответ

0

Я думаю, что вы столкнулись с проблемами, когда вам нужны связанные данные. Другими словами, когда ваш объект имеет свойство, которое является другим объектом, данные также должны собираться и динамически заполняться. Я когда-то был довольно далеко, но когда такие вещи, как INNER, LEFT и RIGHT, присоединяются к вам, вы подумаете дважды о продолжении;)

О bind_results: http: //php.net/manual/en/mysqli-stmt. связывать-result.php

(Может быть, немного не по теме;? SMTP Это mailprotocol, вы уверены, что не имею в виду STMT Mysqli в)

+0

я не буду использовать для этого присоединяется, я думаю. Но даже если я это сделаю, как бы это не помогло? Запрос всегда будет похож на тот, который указан в моем первом сообщении, возможно, запустив соединение, если оно работает ... Да, я имел ввиду STMT, а не SMTP, хе-хе. Благодаря! – Nike

0

для справки, PDO уже делает много того, что вы, кажется, хотеть сделать. Он даже имеет метод fetchAll, который возвращает массив строк, как и ваша функция. Вам не нужно связывать что-либо, чтобы использовать его, если у вас нет параметров в строке запроса (и, конечно, значения для привязки к этим параметрам).

Отъезд the PDO documentation и посмотреть, не соответствует ли это вашим потребностям. В частности, PDOStatement->fetchAll().

1

У вас есть больше возможностей для использования в PHP, и у них есть свои особенности. Я могу порекомендовать ORM как Doctrine из-за простоты использования, стабильности, сообщества и, самое главное, эффективности.

Вы можете использовать его так же легко, как:

$q = Doctrine_Query::create() 
    ->select('u.username, p.phone') 
    ->from('User u') 
    ->leftJoin('u.Phonenumbers p'); 

$users = $q->fetchArray(); 

или:

// Delete phonenumbers for user id = 5 
$deleted = Doctrine_Query::create() 
    ->delete() 
    ->from('Phonenumber') 
    ->andWhere('user_id = 5') 
    ->execute(); 

// Make all usernames lowercase 
Doctrine_Query::create() 
    ->update('User u') 
    ->set('u.username', 'LOWER(u.username)') 
    ->execute(); 

// 'like' condition 
$q = Doctrine_Query::create() 
    ->from('User u') 
    ->where('u.username LIKE ?', '%jwage%'); 

$users = $q->fetchArray(); 
+0

Мне нужно заглянуть в это немного больше, спасибо за ответ! :) – Nike