• ベストアンサー

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) その他の方法(オススメの方法がありましたら、是非教えて下さい!) 以上、どなたか、ご助言よろしくお願い致します。

  • march4
  • お礼率83% (628/754)
  • PHP
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
回答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

  • クエリの結果をCSV形式で抽出するには

    お世話になります。 SQL SERVER 2000 で質問させてください。 クエリ(SELECT文)の結果をCSV形式のファイルに落としたいのですが、バッチファイル(osqlでクエリ実行)からクエリを実行して、指定したディレクトリにCSVファイルを作成する方法を教えてください。 よろしくお願いします。

  • SQLiteのデータベースについて

    PHP初心者です。以下のSQLiteより作成するデータベースについて教えてください。 $DB = sqlite_open('db1.db'); $sql="create table tables(id integer ,name,texts)"; $result=sqlite_query($db,$SQL); 上記、プログラムにより、同ディレクトリに、db1.dbが作成されますが、このデータベース情報はどのようにして、閲覧するのでしょうか(MS-ACCESS、SQLのように簡単に閲覧できないのか)。主キーやテーブルの名前またはフィールドの名前の変更、データ一覧閲覧などどのようにするのでしょうか。 環境は、Windows環境で、PHP4を使用しております。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PDO+SQLITEでのインジェクション対策について

    こんばんは。 いつもお世話になっております。 PDO+SQLITEで現在以下のようにbindValueを用いてクエリを発行しているのですが・・・ - $sql = $connect->prepare("INSERT INTO test_tbl(name) VALUES(:name"); $sql->bindValue(":name", $_POST["name"]); $sql->execute(); - $_POST["name"]の値をbindValueに移すだけでそのままINSERTしていますが、これだけでインジェクション対策はOKなのでしょうか? 他にも注意したほうが良い事があれば教えて下さい。

    • ベストアンサー
    • PHP
  • (PHP 4.4.8) sqlite_open関数の引数を相対パスにしたいのですが上手くいきません。

    PHP 4.4.8 SQLite Library 2.8.14 の環境で、 sqlite_open関数の引数を相対パスにしたいのですが上手くいきません。 (例)create_db.php <?php $db = sqlite_open("../db_test"); //←ここでエラーが出ます。 $query = "CREATE TABLE tbl_test(id,aaa,bbb)"; $result = sqlite_query($db,$query); sqlite_close($db); ?> ネットで調べた所、sqlite_open()は引数に「相対パス(or絶対パス)」を入れることは可能であり、 かつ、「../db_test」が無い場合、作られる仕組みということです。 エラー表示: Warning: sqlite_open() [function.sqlite-open]: unable to open database (...以下略) ちなみに、上記のコードにおいて、 「../db_test」ではなく、「db_test」として同じことをすると、上手くいきます。 つまり、スクリプトファイル(create_db.php)と同階層にファイルを作成することはできるのです。 $db = sqlite_open("db_test");   //← ○:ファイル作成成功 $db = sqlite_open("../db_test"); //← ×:ファイル作成失敗 どなたかご助言をよろしくお願い致します。

    • ベストアンサー
    • PHP
  • SQLクエリを外部から読み込む

    PHPでmysql_query関数を使ってSQLを打つ際、クエリの内容を外部ファイルから読み込むことは可能でしょうか? hoge.sqlというファイルにSQL文を書いて、その内容をmysql_queryに渡したいのですが。

    • ベストアンサー
    • PHP
  • ACCESSのクエリ実行について

    ACCESSのクエリを作成しておりますが  ・クエリを「開く」で実行すると固まる  ・クエリを「デザイン」でSQL文表示させてから実行すると固まる  ・クエリを「デザイン」でSQL文表示させてコピーし、   コピーしたSQL文を新規クエリに貼り付け、実行すると正しく動作する 上記現象の場合、考えられる原因はなんでしょうか? 環境はWIN2K、ACCESS97を利用しております。 SQL文は追加クエリ(INSERT文)で、抽出行数は1000行程度です。

  • xamppでpdoを用いてSQLiteを使う方法

    いつもお世話になります。 xamppの環境でphpからSQLite3のファイルを操作したいと思っています。 xamppのSQLiteはSQLite2が標準でSQLite3を扱うためにはpdoを使う必要がある旨のページを見て php_pdo.dll、php_pdo_sqlite.dllをphp\extフォルダへDLし、php.iniのextension=設定も行いました。 下記のようなスクリプトを書いたのですが、 Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in ・・・ というエラーメッセージが出てどうにも原因がわかりません。 どのようにしたらよいのか教えていただけないでしょうか。 <?php //---PDOでのアクセスStart $dsn = 'sqlite:mondo_quest3.db'; $pdo = new PDO($dsn); $sql="select * from ans order by id"; $entries = $pdo->query($sql); while ($entry = $entries->fetch()) { // 処理を書く } //---PDOでのアクセスEnd ?>

    • ベストアンサー
    • PHP
  • SQLITEの構築について

    現在、レンタルサーバーでSQLITEを使おうと思い、 <html> <head><title>PHP TEST</title></head> <body> <?php $link = sqlite_open('test.db', 0666, $sqliteerror); if (!$link) { die('接続失敗です。'.$sqliteerror); } print('接続に成功しました。<br>'); // SQLiteに対する処理 sqlite_close($link); print('切断しました。<br>'); ?> </body> </html> と、スクリプトを組んだのですが、ブラウザでアクセスすると Call to undefined function sqlite_open()という、エラーが出てしまいます。これがsqlite_open()関数が定義されていないという意味はわかるのですが、何故このエラーが表示されるのか理解できません。 レンタルサーバーではSQLITEが使えるとかかれており、またphpのバージョンも5.1.6と、SQLITEが標準でバンドルされているはずなんですが、何もしようともcall to undefined ~~  というエラーが出てしまいます。 レンタルサーバー内でこのエラーを出さず、sqliteを使えるようにするにはどうしたらよいでしょうか?ご教授お願いします。 また、余談かもしれませんが、自分なりに、検索し、調べた結果、php.iniというファイルを作成し display_errors = On extension=php_pdo_sqlite.dll extension=php_pdo.dll extension=php_sqlite.dll と、書き込んだファイルをサーバーにあげたのですが、無意味でした。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • SQLite:項目が存在しない場合のみINSERT

    SQLiteのテーブル内にunique属性を持つフィールドがあります。このフィールドと同名の内容を追加するとエラーが返りますが、SQLiteを呼び出すプログラム側で逐一そのエラーを例外処理しているため、プログラムとしては効率が悪いです。「(If not exist (...) insert ...のような)もしこの項目内容が存在しなければフィールドを追加する」という処理をSQLのクエリ文で完結させたいのですが、このようなことはできますでしょうか。

  • Access クエリについて

    Accessでアプリケーション開発をする場合、クエリを作成してクエリを使用するのと、VBAでSQL文を使用するのと何か効率的に差があるのでしょうか?

専門家に質問してみよう