• ベストアンサー

sqlite_query()に関する質問

ブラウザからポストでSQL文を受け取り、それをもとにDBを作成するスクリプトを考えています。 スクリプトの実行権限は、ページにログインできたユーザ(サイト管理者)のみ与えられています。 では、質問に移ります。 スクリプトに渡される$_POST['sql']の値が、クエリ文の言語仕様的に正しい書式ではなかった場合、 $sql = sqlite_escape_string($_POST['sql']); sqlite_query('hoge',$sql); の結果は、 Warning: sqlite_query() [function.sqlite-query]: near "なんたら~": syntax error in /なんたら~ といったエラーを吐き、 さらに、ファイルサイズ0の余計なクズファイルが作成されてしまうのですが、、 このクズファイルが結果的に作成されないように設計するには、どのようにしたら良いでしょうか。 私なりに2つの方法を考えてみましたので、アドバイスを頂けると嬉しいです。 (1) $_POST['sql']の時点で正規表現をもとに、SQL文の書式が正しいかチェックをし、 誤った書式のSQL文をsqlite_query()に渡すことを回避する方法。 ※私の能力的に、希望とする正規表現を正確に考え出すことができるか、はなはだ怪しいため、 できれば、避けたい方法です。 (2) 正規表現を使った方法だと、やや繁雑になりそうなので、それはやめにし、 ひとまず、SQL文の正誤を問わず、sqlite_query()を実行させ、 その結果、クズファイルが出来てしまうようなら削除する、といった方法。 ※クズファイルが生成されたかどうかのチェックは、 生成されたファイルのファイルサイズ == 0? をもとに行います。 ※ただし、私の利用するサーバの仕様上、 クズファイルは 所有者=「apache」 として作成されてしまうため、 もしかしたら、スクリプトからは削除できないかもしれません。 その場合には、こちらの方法は廃案となります。汗 (3) その他の方法(オススメの方法がありましたら、是非教えて下さい!) 以上、どなたか、ご助言よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ログインしてきたユーザに何をさせたいのでしょうか。 SQL文を叩く学習をさせるという意図ですか? その作成されるファイルは、sqlite_open時に発生するものだと思います。 つまり、エラーがでようが出まいが、sqlite_openでそのファイル名を指定しているのであれば、openに成功したら出るものと思いますが。 一人のユーザは毎回同じ一つのファイルにアクセスするのであれば、その0バイトのファイルは、sqlite_openで開くことが出来ますので、そのまま置いておけばよいと思います。

march4
質問者

お礼

ひとまず、お礼を書かせて頂きます。 今回もどうもありがとうございます! >ログインしてきたユーザに何をさせたいのでしょうか。 サイト管理者がDBを自由に作成できるような仕組みで考えております。 (基本的には、サイトを破壊するような危険なSQL文が送られてくることのない状況) >その作成されるファイルは、sqlite_open時に発生するものだと思います。 うっかりしておりました。 確かに、そうですね。そうでした。汗 ということで、急いで、まずは「お礼」にて、コメントをさせて頂きました。 今一度、状況を確認し、それでもまだよく分からない箇所があるような場合には、 「補足」にて、状況を報告させて頂きます。

march4
質問者

補足

$sql = sqlite_escape_string($_POST['sql']); if($db_res = sqlite_open($_POST['db'])){ //*0バイトファイル作成   sqlite_query($db_res,$sql); //*$sqlが誤った書式だとWarning } else{die('create error');} 「*$sqlが誤った書式だとWarning」 ↑これを抑止するには、 少なくとも(2)の方法ではダメそうですね。 かと言って、(1)の方法でもって正誤判定をするとなると、 これまた大変そうですよね…。 基本的に、SQL文と言ってもCREATEに限定しているので、 それほど複雑ではないのかもしれませんが…。 (少なくとも、私には、簡単とは思えない。苦笑) ただ、自分しか使わないスクリプトなので、 自分さえ、ちゃんとSQL文をフォームからポストできれば、 確かに問題は起こらないのですが、 しかし、Warningと隣り合わせのスクリプトというのは やはり気持ちが悪いので、なんとかしたいなと考えております。 他に、代替案等、もしありましたら、アドバイスして頂けると嬉しいです。

その他の回答 (2)

回答No.3

とりあえずwarningを抑止するなら、エラー制御子がありますのでソレを使ったらよいと思います。 <?php @sqlite_query($db, $sql); ?> 関数の先頭に@をつけます。

march4
質問者

お礼

>warningを抑止するなら、エラー制御子がありますのでソレを使ったらよい そうですね。@がありますよね。 もし仮に、SQL文に誤った書式があった場合、 sqlite_open()によって、0バイトファイルは作成されるけれども、 そこにはsqlite_query()による結果は反映されない、 ということになるわけですよね。 で、2度目のトライでは、 もう既に1度目でファイルは作られているため(つまり、前述の0バイトファイル)、 それを開いて、再度、新たなsqlite_query()を実行することになりますね。 そして、sqlite_query()の頭に@を付けておけば、 どのトライにおいても、warningを抑止できる、と。 @は正直、できるだけ使わないコーディングを心掛けておりますが、 正規表現で判定するコーディングを思えば、@使用も悪くないかもしれません。 ホゲホゲさんにアドバイスして頂けると、なんだか安心してしまいますね。

  • tom233
  • ベストアンサー率17% (61/352)
回答No.2

>サイト管理者がDBを自由に作成できるような仕組みで考えております。 それならわざわざ作るまでもなく SQLiteならSQLiteManagerでも使っておけばいいのでは?

march4
質問者

お礼

アドバイスありがとうございます。 >SQLiteManagerでも使っておけばいいのでは? このようなものがあるのですね。 ざっとですが、内容を見てきました。 これがあれば、確かに自作するまでもなさそうです。 しばらくの間、こちらについて、より詳しく調べてきたいと思います。 教えて頂き、どうもありがとうございました。

関連するQ&A