Параметрированный запрос И проверка ввода - это путь. Существует множество сценариев, в которых может произойти SQL-инъекция, хотя используется mysql_real_escape_string()
.
Эти примеры уязвимы для SQL-инъекции:
$offset = isset($_GET['o']) ? $_GET['o'] : 0;
$offset = mysql_real_escape_string($offset);
RunQuery("SELECT userid, username FROM sql_injection_test LIMIT $offset, 10");
или
$order = isset($_GET['o']) ? $_GET['o'] : 'userid';
$order = mysql_real_escape_string($order);
RunQuery("SELECT userid, username FROM sql_injection_test ORDER BY `$order`");
В обоих случаях вы не можете использовать '
для защиты инкапсуляции.
Источник : Непредвиденная инъекция SQL (при эвакуации Недостаточно)
Единственная причина, о которой я могу думать для использования ПРАВИЛЬНОГО ВНЕШНЕГО ОБЪЕДИНЕНИЯ, состоит в том, чтобы попытаться сделать SQL большим количеством самодокументирования.
Вы могли бы возможно хотеть использовать оставленные соединения для запросов, которые имеют пустые строки в зависимом (многие) примыкают связей "один ко многим" и правильных соединений на тех запросах, которые генерируют пустые строки в независимой стороне.
Это может также произойти в сгенерированном коде или если требования кодирования магазина определяют порядок объявления таблиц в ИЗ пункта.
B ПРАВО ПРИСОЕДИНЯЮТСЯ, A является тем же, поскольку ЛЕВОЕ ПРАВО B
B СОЕДИНЕНИЯ ПРИСОЕДИНЯЕТСЯ к чтениям: B НА ПРАВЕ, ЗАТЕМ ПРИСОЕДИНЯЕТСЯ, A. означает, что A находится в левой стороне набора данных. все равно как ЛЕВЫЙ B
СОЕДИНЕНИЯ Там не производительность, которая может быть получена, если Вы перестроите ОСТАВЛЕННЫЙ, СОЕДИНЯЕТ для ИСПРАВЛЕНИЯ.
единственные причины я могу думать, почему можно было бы использовать ПРАВИЛЬНОЕ СОЕДИНЕНИЕ, то, если Вы - тип человека, которым нравится думать из стороны (выбор * от заголовка соединения права детали). Это похоже на других как прямой порядок байтов, других как обратный порядок байтов, другие как вершина вниз разрабатывают, другие как восходящий дизайн.
другой - то, если у Вас уже есть огромный запрос, где Вы хотите добавить другую таблицу, когда это невыносимо, чтобы перестроить запрос, поэтому просто включить таблицу к существующему запросу с помощью ПРАВИЛЬНОГО СОЕДИНЕНИЯ.
Единственное время я думал бы о правильном внешнем объединении, - то, если я фиксировал полное соединение, и это именно так произошло, что мне был нужен результат содержать все записи от таблицы справа. Как раз когда ленивый, как я, тем не менее, я, вероятно, стал бы столь раздражаемым, что я перестрою его для использования левого соединения.
Этот пример от Википедия шоу, что я имею в виду:
SELECT *
FROM employee
FULL OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID
, Если Вы просто заменяете Word FULL
RIGHT
, у Вас есть новый запрос, не имея необходимость подкачивать порядок ON
пункт.
SELECT * FROM table1 [BLANK] OUTER JOIN table2 ON table1.col = table2.col
Замена [ПРОБЕЛ] с:
ОСТАВЛЕННЫЙ - если Вы хотите все записи от table1, даже если у них нет седла, которое соответствует table2 (также включенный записи table2 с соответствиями)
ПРАВО - если Вы хотите все записи от table2, даже если у них нет седла, которое соответствует table1 (также включенный записи table1 с соответствиями)
ПОЛНЫЙ - если Вы хотите все записи от table1 и от table2
, О чем все говорят? Они - то же? Я не думаю так.
SQL-операторы, в дополнение к тому, чтобы быть корректным, должно быть максимально легко считать и выразительно краткий (потому что они представляют единственные атомарные действия, и Вашему уму нужны к grok они полностью для предотвращения непреднамеренных последствий.) Иногда выражение более ясно указано с правильным внешним объединением.
, Но можно всегда преобразовываться в другой, и оптимизатор сделает также с одним как другой.
Долгое время, по крайней мере один из главных rdbms продуктов только поддерживал ОСТАВЛЕННОЕ ВНЕШНЕЕ ОБЪЕДИНЕНИЕ. (Я полагаю, что это был MySQL.)
Единственные времена я использовал правильное соединение, были, когда я хочу посмотреть на два набора данных, и у меня уже есть соединения в определенном порядке на левых или внутреннее объединение от ранее записанного запроса. В этом случае скажите, что Вы хотите видеть как один набор данных, записи, не включенные в таблицу a, но в таблицу b и в другом, установили рекорды не в таблице b, а в таблице a. Даже тогда я склонен только делать это, чтобы сэкономить время, проводя исследование, но изменил бы его, если бы это был код, который был бы выполнен несколько раз.