“неоднозначное имя столбца” во ВНУТРЕННЕМ ОБЪЕДИНЕНИИ SQLite

Используйте Function.protytype.call, чтобы явно определить контекст для исключения функции:

if(trigger){
  click.call(that)
}

5
задан codelogic 17 February 2009 в 01:48
поделиться

3 ответа

Я избегал бы позволять пользователю писать пункты SQL непосредственно. Это - источник уязвимостей Внедрения SQL.

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

Вот некоторый код C# для показа общего представления

// from user input
string user_column = "ItemID";
string user_value = "3";

string sql = "SELECT INVITEM.CharId AS CharId, INVITEM.ItemId AS ItemId FROM (INVITEM as INVITEM INNER JOIN SHOPITEM AS SHOPITEM ON SHOPITEM.ItemId = INVITEM.ItemId) ";

if (user_column == "ItemID")
{
    // using Int32.Parse here to prevent rubbish like "0 OR 1=1; --" being entered.
    sql += string.Format("WHERE INVITEM.ItemID={0}",Int32.Parse(user_value));
}

Очевидно, если бы Вы имеете дело больше чем с одним пунктом, необходимо было бы занять место И ГДЕ в последующих пунктах.

0
ответ дан 13 December 2019 в 22:17
поделиться

Я записал бы этому запросу этот путь:

SELECT i.CharId AS CharId, i.ItemId AS ItemId 
FROM INVITEM as i INNER JOIN SHOPITEM AS s USING (ItemId)
WHERE i.ItemId = 3;

Я использую USING (ItemId) синтаксис, который является просто вопросом вкуса. Это эквивалентно ON (i.ItemID = s.ItemID).

Но я разрешил неоднозначность путем квалификации i.ItemID в WHERE пункт. Вы думали бы, что это является ненужным с тех пор i.ItemID = s.ItemID. Они оба равны коммутативностью, таким образом, нет никакой семантической неоднозначности. Но по-видимому SQLite не достаточно умен для знания этого.

Мне не нравится использовать NATURAL JOIN. Это эквивалентно объединению по эквивалентности каждого столбца, который существует в обеих таблицах с тем же именем. Мне не нравится использовать это, потому что я не хочу, чтобы это сравнило столбцы, что я не хочу это к, просто потому что у них есть то же имя.

10
ответ дан 13 December 2019 в 22:17
поделиться

Просто измените свой псевдоним столбца на что-то подобное, но уникальный (такое как ITEM_ID).

0
ответ дан 13 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

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