PHP / Mysql - динамический выбор данных? - PullRequest
2 голосов
/ 29 сентября 2010

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

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

Но я застрял здесь. Я совсем не уверен, как этого добиться. У меня есть небольшая подсказка, как это может работать, но я не знаю, как связать результаты или извлечь их в массив. Запрос будет создан в другом методе, а затем передан в функцию выбора / вставки в классе 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;
}

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

Ответы [ 3 ]

1 голос
/ 29 сентября 2010

У вас есть больше возможностей для использования в 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 голосов
/ 29 сентября 2010

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

Ознакомьтесь с документацией PDO и посмотрите, не соответствует ли это вашим потребностям. Особенно PDOStatement->fetchAll().

0 голосов
/ 29 сентября 2010

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

О bind_results: http://php.net/manual/en/mysqli-stmt.bind-result.php

(Может быть, немного не по теме; SMTP? Это почтовый протокол, вы уверены, что не имеете в виду STMT MySQLi?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...