Подготовка SQLite SQL-операторов в PHP - PullRequest
3 голосов
/ 24 сентября 2011

Я пытаюсь наилучшим образом подготовить строки SQLite SQL в PHP.Класс SQLite3 поставляется с функцией escapeString () , но вот мои проблемы:

Попробуйте 1)

$sql = "INSERT INTO items ('id','content','title','created') VALUES ('4e7ce7c18aac8', 'Does this work', NULL, '2011-09-23T16:10:41-04:00');";
$sql = SQLite3::escapeString( $sql );
echo ($sql);

Это приводит кстрока, которая все взломана:

INSERT INTO items ('' id '', '' content '', '' title '', '' made '') VALUES ('' 4e7ce7c18aac8 ''',' 'Это работает?', NULL, '' 2011-09-23T16: 10: 41-04: 00 '');

Это не двойные кавычки, скорее двойныедо одинарных кавычек.Очевидно, не будет работать.


Попробуйте 2)

$sql = 'INSERT INTO items ("id","content","title","created") VALUES ("4e7ce7c18aac8", "Does this work", NULL, "2011-09-23T16:10:41-04:00");';
$sql = SQLite3::escapeString( $sql );
echo ($sql);

В результате:

INSERT INTO items ("id", "content", "title", "созданный") VALUES ("4e7ce7c18aac8", "Работает ли это", NULL, "2011-09-23T16: 10: 41-04: 00");

Этот запрос работает нормально, но функция escapeString ничего не изменила, так как бежать нечего ...


Попробуйте 3)

$sql = 'INSERT INTO items ("id","content","title","created") VALUES ("4e7ce7c18aac8", "Doesn't this work", NULL, "2011-09-23T16:10:41-04:00");'; $sql = SQLite3::escapeString( $sql ); echo ($sql);

Вот большая проблема. Теперь у меня есть апостроф в одной из моих ценностей.Он даже не переходит в escapeString (), потому что PHP выдаст ошибку в недопустимой строке:

Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданный T_VARIABLE, ожидание ',' или ';'


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

Наконец, в чем смысл escapeString () ??Я не могу понять, как это должно использоваться правильно.

1 Ответ

12 голосов
/ 24 сентября 2011

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

$unsafe = $_GET['nastyvar'];
$safe = SQLite3::escapeString($unsafe);
$sql = "INSERT INTO table (field) VALUES ($safe);";
echo ($sql);
...