Так что это больше о том, как получить ваше мнение о наилучшем подходе для этого.
У меня есть то, что я считаю довольно элегантным способом построения простого динамического оператора SQL с простым предложением WHERE. Предложение WHERE может включать несколько полей, но оно ограничено, так как оно не позволяет использовать операторов (сравнительный или логический).
я могу построить следующее с этим:
SELECT * from table_name WHERE field_1 = "value_1" AND field_2 = "value_2";
//or I can do
SELECT * from table_name WHERE field_1 = "value_1" OR field_2 = "value_2";
//or I can do
SELECT * from table_name WHERE field_1 <> "value_1" AND field_2 <> "value_2";
Я не построить следующее:
SELECT * from table_name WHERE field_1 = "value_1" AND field_2 <> "value_2";
//nor can I do
SELECT * from table_name WHERE field_1 = "value_1" AND field_2="value_2" OR field_3 = "value_3
Это становится реальной проблемой при работе с числами и датами, когда я хочу ищите записи со значениями между значением, которое мне нужно передать тем же, что и дважды, с двумя отдельными значениями .... не так ли?
SELECT * from table_name WHERE price BETWEEN 10 AND 20;
SELECT * from table_name WHERE date BETWEEN "2016-08-01" AND "2016-08-15";
И не забывая при этом несколько критериев с «IN» или подобные заявления, которые это также не скапливается, а именно:
SELECT * from table_name WHERE field_1 IN("value_1","value_2, "value_3");
SELECT * from table_name WHERE field_1 LIKE "val%";
Вот что мой текущий код выглядит следующим образом:
// db contains my DB connection
$db = new DB();
$where = 'WHERE';
$criteria = array();
foreach ($_GET as $key => $value) {
$where = $where.' '.$key.'=? AND';
array_push($criteria,$value);
}
if(count($_GET) > 0){
// $sql will look like: SELECT * FROM table_name WHERE field_1 = ? AND field_2 = ?
// $criteria is an array of values to pair with the above prepared statement.
// Will look like: $criteria("value_1", "value_2")
$sql = 'SELECT * FROM mcl_data_gap '.$where;
$results = $db->query($sql,$criteria);
} else {
$sql = 'SELECT * FROM mcl_data_gap';
$results = $db->query($sql);
}
// .... continue on using above SQL statement
В приведенном выше коде я использовал get, но мое предположение также будет работать.
Единственная идея, с которой я столкнулся, состоит в том, чтобы вставить больше пар ключей, содержащих операторы, требуемые в кодированном формате, которые позволили бы мне затем искать эти операторы и строить инструкцию на их основе, но мне просто хочется есть лучший способ, и именно это я надеюсь, что вы сможете помочь.
Другой вариант, о котором я только что подумал, заключается в создании SQL, прежде чем передать его на сервер и просто выполнить это.
Или я могу публиковать объекты, содержащие весь сегмент инструкции WHERE?
ваш код уязвим для SQL-инъекций. ** никогда не доверяют пользовательскому вводу **, даже не как имя переменной. я должен был попробовать один раз, потому что PHP автоматически заменяет пробелы символами подчеркивания, но он не заменяет табуляции, которые, однако, mysql принимают как пробельные символы. поэтому, кто-то недружелюбно пытается запросить 'yourfile.php?% 27; DROP% 09TABLE% 09SomeImportantTable;% 09 - = a' преуспеет в * агрессивном похудении * вашей базе данных. –
Проблема с SQL-инъекцией. Пользователь мог бы сделать значение '$ key' чем угодно и вызвать массу проблем для вас. Вы все равно можете создавать динамические запросы, но вы должны набрать весь SQL и просто использовать параметры '$ _GET', чтобы определить, какие фрагменты SQL используются в конечном запросе. – CptMisery
Строка и параметры SQL передаются классу, который использует подготовленные инструкции PDO для запроса моего db. Мое понимание заключалось в том, что готовые заявления PDO используются для защиты от SQL-инъекций. –