Используйте Function.protytype.call
, чтобы явно определить контекст для исключения функции:
if(trigger){
click.call(that)
}
Я избегал бы позволять пользователю писать пункты 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));
}
Очевидно, если бы Вы имеете дело больше чем с одним пунктом, необходимо было бы занять место И ГДЕ в последующих пунктах.
Я записал бы этому запросу этот путь:
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
. Это эквивалентно объединению по эквивалентности каждого столбца, который существует в обеих таблицах с тем же именем. Мне не нравится использовать это, потому что я не хочу, чтобы это сравнило столбцы, что я не хочу это к, просто потому что у них есть то же имя.
Просто измените свой псевдоним столбца на что-то подобное, но уникальный (такое как ITEM_ID).