Возможны ли динамические SQL-запросы в коде?

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

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

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

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

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

—РЕДАКТИРОВАТЬ:
Еще лучше: может ли сам запрос SQL быть динамическим? Я могу просто ссылаться на $ sqlA вместо всего запроса? Таким образом, если мне придется перезаписать запрос, я могу просто обновить 1 файл.

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

Активный класс записи позволяет динамически строить запросы с шагом, позволяющим логически строить их. Поэтому, чтобы взять ваш пример, используя активную запись …

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

 $this->db->select('*'); $this->db->from($table); $this->db->where($user_id, $input); 

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

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

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

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

Затем просто обработайте $query с классом базы данных так же, как и любой другой объект запроса CodeIgniter.

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

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

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

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

 SELECT * FROM Users WHERE User_ID = ? 

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

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

 SELECT * FROM Users WHERE $user_id = ? 

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

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

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

Aa вы можете видеть, вы можете использовать обычную манипуляцию с строками для создания всего 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 в том же файле.