Security Warning: этот ответ не соответствует лучшим рекомендациям по безопасности. Эвакуация неадекватна для предотвращения SQL-инъекции , вместо этого используйте подготовленные операторы . Используйте стратегию, изложенную ниже, на свой страх и риск. (Кроме того,
mysql_real_escape_string()
был удален в PHP 7.)Вы могли бы сделать что-то основное:
$safe_variable = mysql_real_escape_string($_POST["user-input"]); mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')");
Это не решит каждую проблему, но это очень хороший ступень. Я оставил очевидные элементы, такие как проверка существования переменной, числа (числа, буквы и т. Д.).
Я имею статья об этой самой теме . (Это имеет много примеров.)
В сущности, закрытие является блоком кода, который может быть выполнен в более позднее время, но который поддерживает среду, в которой оно было сначала создано - т.е. оно может все еще использовать локальные переменные и т.д. метода, который создал его, даже после того, как тот метод закончил выполняться.
общая опция закрытий реализована в C# анонимными методами и лямбда-выражениями.
Вот пример с помощью анонимного метода:
using System;
class Test
{
static void Main()
{
Action action = CreateAction();
action();
action();
}
static Action CreateAction()
{
int counter = 0;
return delegate
{
// Yes, it could be done in one statement;
// but it is clearer like this.
counter++;
Console.WriteLine("counter={0}", counter);
};
}
}
Вывод:
counter=1
counter=2
Здесь мы видим, что действие, возвращенное CreateAction все еще, имеет доступ к переменной счетчика и может действительно увеличить его, даже при том, что сам CreateAction закончился.
Закрытия являются функциональными значениями, которые придерживаются ценностей переменных от их исходного объема. C# может использовать их в форме анонимных делегатов.
Для очень простого примера, возьмите этот код C#:
delegate int testDel();
static void Main(string[] args)
{
int foo = 4;
testDel myClosure = delegate()
{
return foo;
};
int bar = myClosure();
}
В конце его, панель будет установлена на 4, и делегат myClosure может быть роздан, чтобы использоваться в другом месте в программе.
Закрытия могут использоваться для большого количества полезных вещей, как задержанное выполнение или упростить интерфейсы - LINQ главным образом создается с помощью закрытий. Самым непосредственным путем это пригождается для большинства разработчиков, добавляют обработчики событий к динамично созданным средствам управления - можно использовать закрытия для добавления поведения, когда управление инстанцируют, вместо того, чтобы хранить данные в другом месте.
Func<int, int> GetMultiplier(int a)
{
return delegate(int b) { return a * b; } ;
}
//...
var fn2 = GetMultiplier(2);
var fn3 = GetMultiplier(3);
Console.WriteLine(fn2(2)); //outputs 4
Console.WriteLine(fn2(3)); //outputs 6
Console.WriteLine(fn3(2)); //outputs 6
Console.WriteLine(fn3(3)); //outputs 9
закрытие А является анонимной функцией, переданной за пределами функции, в которой оно создается. Это поддерживает любые переменные от функции, в которой это создается, что это использует.
Вот изобретенный пример для C#, который я создал из подобного кода в JavaScript:
public delegate T Iterator<T>() where T : class;
public Iterator<T> CreateIterator<T>(IList<T> x) where T : class
{
var i = 0;
return delegate { return (i < x.Count) ? x[i++] : null; };
}
Так, вот некоторый код, который показывает, как использовать вышеупомянутый код...
var iterator = CreateIterator(new string[3] { "Foo", "Bar", "Baz"});
// So, although CreateIterator() has been called and returned, the variable
// "i" within CreateIterator() will live on because of a closure created
// within that method, so that every time the anonymous delegate returned
// from it is called (by calling iterator()) it's value will increment.
string currentString;
currentString = iterator(); // currentString is now "Foo"
currentString = iterator(); // currentString is now "Bar"
currentString = iterator(); // currentString is now "Baz"
currentString = iterator(); // currentString is now null
Hope, которая несколько услужлива.
В основном закрытие является блоком кода, который можно передать как аргумент функции. C# поддерживает закрытия в форме анонимных делегатов.
Вот простой пример:
Список. Найдите, что метод может принять и выполнить часть кода (закрытие) для нахождения объекта списка.
// Passing a block of code as a function argument
List<int> ints = new List<int> {1, 2, 3};
ints.Find(delegate(int value) { return value == 1; });
Используя синтаксис C#3.0 мы можем записать это как:
ints.Find(value => value == 1);
Закрытия являются блоками кода, которые ссылаются на переменную вне себя, (от ниже их на стеке), который можно было бы назвать или выполнить позже, (как то, когда событие или делегат определяются и могли зайтись некоторый неопределенный момент в будущем вовремя)... Поскольку внешняя переменная, что блок ссылок кода может вышедший объем (и был бы иначе потерян), то, что на это ссылается блок кода (названный закрытием), говорит времени выполнения "содержать" ту переменную в объеме, пока это больше не необходимо блоку закрытия кода...
Закрытие является функцией, определенной в функции, которая может получить доступ к локальным переменным его, а также ее родителя.
public string GetByName(string name)
{
List<things> theThings = new List<things>();
return theThings.Find<things>(t => t.Name == name)[0];
}
так функция в методе находки.
t => t.Name == name
может получить доступ к переменным в его объеме, t, и имени переменной, которое находится в его родительском объеме. Даже при том, что это выполняется методом находки как делегат от другого объема все вместе.