在PHP中准备SQLite SQL语句

Yar*_*rin 3 php sql sqlite escaping escapestring

我正在尝试如何最好地在PHP中准备我的SQLite SQL字符串.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);
Run Code Online (Sandbox Code Playgroud)

这导致一个字符串全部被抬起:

INSERT INTO项目(''id'',''content'',''title'',''created'')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);
Run Code Online (Sandbox Code Playgroud)

这导致:

INSERT INTO项目("id","content","title","created")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);
Run Code Online (Sandbox Code Playgroud)

这是一个大问题 - 现在我的一个值中有一个撇号.它甚至不会使它成为escapeString()因为PHP将在无效字符串上抛出错误:

PHP解析错误:语法错误,意外T_VARIABLE,期待','或';'


我该怎么接近这个?请记住,在实际代码中,我的参数值将是变量,所以我应该在将每个变量传递给字符串之前将其转义?如果是这样,我会使用什么功能?

最后,escapeString()有什么意义?我无法弄清楚应该如何正确使用它.

Mar*_*c B 12

您无法转义整个查询.您可以转义要插入查询的不安全数据,例如

$unsafe = $_GET['nastyvar'];
$safe = SQLite3::escapeString($unsafe);
$sql = "INSERT INTO table (field) VALUES ($safe);";
echo ($sql);
Run Code Online (Sandbox Code Playgroud)

  • http://php.net/magic_quotes它是一个被弃用的(并且开始时是彻头彻尾的蠢)功能,如果你在打开它的系统上运行,它们配置错误和/或运行过时的PHP版本. (3认同)