4

PHPでSQLiteSQL文字列を準備する最善の方法を試しています。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''、'' created'')VALUES('' 4e7ce7c18aac8''、'' Does this work''、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"、 "created")VALUES( "4e7ce7c18aac8"、 "Does this work"、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);

ここに大きな問題があります-今、私は自分の価値観の1つにアポストロフィがあります。PHPは無効な文字列に対してエラーをスローするため、escapeString()には到達しません。

PHP解析エラー:構文エラー、予期しないT_VARIABLE、「、」または「;」が必要です


どのように私はこれに近づくことになっていますか?実際のコードでは、パラメーター値は変数になるので、文字列に渡す前に各変数をエスケープする必要があることに注意してください。もしそうなら、私はどの機能を使用しますか?

最後に、escapeString()のポイントは何ですか?どうやって正しく使うのかわからない。

4

1 に答える 1

16

クエリ全体をエスケープすることはありません。クエリに挿入している安全でないデータをエスケープします。例:

$unsafe = $_GET['nastyvar'];
$safe = SQLite3::escapeString($unsafe);
$sql = "INSERT INTO table (field) VALUES ($safe);";
echo ($sql);
于 2011-09-23T21:11:27.020 に答える