Когда или почему Вы использовали бы правильное внешнее объединение вместо левого?

Параметрированный запрос И проверка ввода - это путь. Существует множество сценариев, в которых может произойти 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 (при эвакуации Недостаточно)

52
задан Roman Pekar 20 February 2015 в 04:27
поделиться

6 ответов

Единственная причина, о которой я могу думать для использования ПРАВИЛЬНОГО ВНЕШНЕГО ОБЪЕДИНЕНИЯ, состоит в том, чтобы попытаться сделать SQL большим количеством самодокументирования.

Вы могли бы возможно хотеть использовать оставленные соединения для запросов, которые имеют пустые строки в зависимом (многие) примыкают связей "один ко многим" и правильных соединений на тех запросах, которые генерируют пустые строки в независимой стороне.

Это может также произойти в сгенерированном коде или если требования кодирования магазина определяют порядок объявления таблиц в ИЗ пункта.

35
ответ дан Yes - that Jake. 7 November 2019 в 09:24
поделиться

B ПРАВО ПРИСОЕДИНЯЮТСЯ, A является тем же, поскольку ЛЕВОЕ ПРАВО B

B СОЕДИНЕНИЯ ПРИСОЕДИНЯЕТСЯ к чтениям: B НА ПРАВЕ, ЗАТЕМ ПРИСОЕДИНЯЕТСЯ, A. означает, что A находится в левой стороне набора данных. все равно как ЛЕВЫЙ B

СОЕДИНЕНИЯ Там не производительность, которая может быть получена, если Вы перестроите ОСТАВЛЕННЫЙ, СОЕДИНЯЕТ для ИСПРАВЛЕНИЯ.

единственные причины я могу думать, почему можно было бы использовать ПРАВИЛЬНОЕ СОЕДИНЕНИЕ, то, если Вы - тип человека, которым нравится думать из стороны (выбор * от заголовка соединения права детали). Это похоже на других как прямой порядок байтов, других как обратный порядок байтов, другие как вершина вниз разрабатывают, другие как восходящий дизайн.

другой - то, если у Вас уже есть огромный запрос, где Вы хотите добавить другую таблицу, когда это невыносимо, чтобы перестроить запрос, поэтому просто включить таблицу к существующему запросу с помощью ПРАВИЛЬНОГО СОЕДИНЕНИЯ.

15
ответ дан Michael Buen 7 November 2019 в 09:24
поделиться

Единственное время я думал бы о правильном внешнем объединении, - то, если я фиксировал полное соединение, и это именно так произошло, что мне был нужен результат содержать все записи от таблицы справа. Как раз когда ленивый, как я, тем не менее, я, вероятно, стал бы столь раздражаемым, что я перестрою его для использования левого соединения.

Этот пример от Википедия шоу, что я имею в виду:

SELECT *  
FROM   employee 
   FULL OUTER JOIN department 
      ON employee.DepartmentID = department.DepartmentID

, Если Вы просто заменяете Word FULL RIGHT, у Вас есть новый запрос, не имея необходимость подкачивать порядок ON пункт.

8
ответ дан Bill the Lizard 7 November 2019 в 09:24
поделиться
SELECT * FROM table1 [BLANK] OUTER JOIN table2 ON table1.col = table2.col

Замена [ПРОБЕЛ] с:

ОСТАВЛЕННЫЙ - если Вы хотите все записи от table1, даже если у них нет седла, которое соответствует table2 (также включенный записи table2 с соответствиями)

ПРАВО - если Вы хотите все записи от table2, даже если у них нет седла, которое соответствует table1 (также включенный записи table1 с соответствиями)

ПОЛНЫЙ - если Вы хотите все записи от table1 и от table2

, О чем все говорят? Они - то же? Я не думаю так.

3
ответ дан Andrew G. Johnson 7 November 2019 в 09:24
поделиться

SQL-операторы, в дополнение к тому, чтобы быть корректным, должно быть максимально легко считать и выразительно краткий (потому что они представляют единственные атомарные действия, и Вашему уму нужны к grok они полностью для предотвращения непреднамеренных последствий.) Иногда выражение более ясно указано с правильным внешним объединением.

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

Долгое время, по крайней мере один из главных rdbms продуктов только поддерживал ОСТАВЛЕННОЕ ВНЕШНЕЕ ОБЪЕДИНЕНИЕ. (Я полагаю, что это был MySQL.)

2
ответ дан dkretz 7 November 2019 в 09:24
поделиться

Единственные времена я использовал правильное соединение, были, когда я хочу посмотреть на два набора данных, и у меня уже есть соединения в определенном порядке на левых или внутреннее объединение от ранее записанного запроса. В этом случае скажите, что Вы хотите видеть как один набор данных, записи, не включенные в таблицу a, но в таблицу b и в другом, установили рекорды не в таблице b, а в таблице a. Даже тогда я склонен только делать это, чтобы сэкономить время, проводя исследование, но изменил бы его, если бы это был код, который был бы выполнен несколько раз.

2
ответ дан HLGEM 7 November 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: