Вместо жесткого кодирования 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 в том же файле.