Динамические запросы SQL в коде возможно? - PullRequest
2 голосов
/ 16 января 2011

Вместо жесткого кодирования SQL-запросов, таких как Select * from users where user_id =220202, они могут быть сделаны динамическими, как Select * from $users where $user_id = $input.

Причина, по которой я спрашиваю: когда требуются изменения в именах таблиц / столбцов, я могу просто обновить их в одном месте и не нужно просить разработчиков построчно искать все ссылки для обновления. Это очень много времени. И мне не нравится идея разоблачения базы данных в коде.

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

Я использую codeignitor PHP.

Если это возможно, то следующий вопрос: где хранить все ссылки? В приложении, в файле, в БД и как?

--- EDIT:
Еще лучше: можно ли сделать сам SQL-запрос динамическим? Я могу просто ссылаться на $ sqlA вместо всего запроса? Таким образом, если мне нужно переписать запрос, я могу просто обновить 1 файл.

Ответы [ 4 ]

2 голосов
/ 16 января 2011

Поскольку вы используете Codeigniter , я бы рекомендовал использовать Active Record Class для выполнения того, что вы пытаетесь сделать.

Активный класс записи позволяет вамстроить запросы динамически в шагах, позволяя вам строить их логически.Итак, чтобы взять ваш пример с использованием активной записи ...

( это может быть достигнуто с меньшим количеством кода, я просто пытаюсь проиллюстрировать Active Record )

$this->db->select('*');

$this->db->from($table);

$this->db->where($user_id, $input);

и чтобы показать, что я имею в виду при построении запроса логически, вы можете создать любую логику, какую захотите, в процессе построения запроса.Допустим, у вас есть переменная $ limit, которую вы установили, если хотите ограничить количество полученных результатов.НО, если он не установлен (или NULL), вы не хотите устанавливать предложение limit.

if ( $isset($limit) ) {
    $this->db->limit($limit);
}

и теперь выполнять ваш запрос теперь, когда он был построен

$query = $this->db->get();

Тогда просто разберитесь с $query с вашим классом базы данных , как и с любым другим объектом запроса CodeIgniter.

1 голос
/ 16 января 2011

Конечно можно, если ты этого хочешь.Я бы порекомендовал вам потратить больше времени на разработку базы данных, но изменения в схеме неизбежны в долгосрочной перспективе.

Я не думаю, что время загрузки было бы проблемой из-за этого, потому что обычно узкое место в этомПриложения находятся в базе данных.

Наконец, я рекомендую сохранить это в файл, просто объявив имена столбцов как переменные php

0 голосов
/ 16 января 2011

mysql_query () принимает строку, и она не должна быть константной строкой, она может быть переменной.

$SQL = "SELECT foo FROM bar b";
SQLSet = mysql_query($SQL);

Аа, как вы видите, вы можете использовать обычные манипуляции со строками длявесь запрос SQL.

$SQL="SELECT * FROM MyTable";
$BuzID = 5;
$Filter = "Buz=".$BuzID;
if (is_numeric($BuzID)) SQL .= " WHERE ".$Filter;
SQLSet = mysql_query($SQL);

Это расширится до "SELECT * FROM MyTable WHERE Buz=5", если для $BuzID задано любое число.Если нет, то оператор будет просто "SELECT * FROM MyTable"

. Как видите, вы можете создавать очень сложные операторы SQL на лету без необходимости поддержки переменных на сервере SQL.

ЕСЛИ вы хотитеконстанты, такие как имя базы данных, логин пользователя, вы можете включить их в отдельное включение, находящееся вне публичного каталога.

SecretStuff.inc.php
$__DatabaseName = "localhost";
$__UserName = "DatabaseAccess";
$__Password = "E19A4F72B4AA091C6D2";

Или иметь весь код подключения к базе данных PHP в одном файле.

0 голосов
/ 16 января 2011

Это зависит от того, какие драйверы баз данных вы используете.Старые драйверы баз данных PHP не поддерживали заполнители (PHP 3.x).Современные (PDO) делают.Вы пишете SQL с вопросительными знаками:

SELECT * FROM Users WHERE User_ID = ?

Затем вы предоставляете значение идентификатора пользователя при выполнении запроса.

Однако вы не можете предоставить имя столбца, как это - толькоценности.Но вы можете подготовить оператор из строки, такой как:

SELECT * FROM Users WHERE $user_id = ?

Затем вы предоставите значение во время выполнения.

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