0

sqliteデータベースに既存の行があるかどうかを確認しようとしています。存在しない場合は追加します。しかし、私のクエリに何か問題があります。誰かが私のエラーを見つけられることを願っています。

具体的には、クエリ行にエラーがあります。

$query = 'SELECT * FROM plant WHERE common_Name = '. $commonName . ' AND latin_Name = '. $latinName . 'AND  url = '. $URL ;

ありがとう、トッド

// set path of database file
$file = "db/plants.db";

// create database object
$db = new SQLiteDatabase($file) or die("Could not open database");

// see if the EXACT same tag exists
$query = 'SELECT * FROM plant WHERE common_Name = '. $commonName . ' AND latin_Name = '. $latinName . 'AND  url = '. $URL ;
$result = $db->query($query) or die("Error in query");
$rows = sqlite_num_rows($result);


if($rows>0) return; //do not add it

// generate query string
$query = 'INSERT INTO plant (common_Name, latin_Name, url) VALUES("'.$commonName.'","'. $latinName.'","'.$URL.'")';

// execute query
// return result object
$result = $db->query($query) or die("Error in query");


// destroy database object
unset($db);
4

2 に答える 2

2

SELECTクエリに引用符がないため、失敗しています。

$query = "SELECT * FROM plant WHERE common_Name = '$commonName' AND latin_Name = '$latinName' AND  url='$URL'";
         ^                                        ^           ^ etc...

示された引用符の変更とフォーマットの違いに注意してください。また、コードスニペット以外の場所で実行した場合を除き、このタイプのクエリ構築はSQLインジェクション攻撃に対して脆弱であることに注意してください。このコードを使用する前に、これらを読んで学習する必要があります。

次回エラーハンドラー(ちなみに、戻り値をチェックするためのkudos)を挿入するときは、静的な「何かがうまくいかなかった」というエラーメッセージを出力するだけではいけません。それは診断には役に立たない。データベースは何が悪かったのかを正確に教えてくれるので、代わりにDBのエラーメッセージを出力しますsqlite_error_message()

于 2012-06-17T14:36:21.560 に答える
0

自分の質問に答えるのは嫌いですが……。

パラメータの前後に二重引用符がありませんでした。これが機能するクエリです。

$query = 'SELECT * FROM plant WHERE common_Name ="'. $commonName .'" AND latin_Name = "'.$latinName .'" AND url = "'.$URL.'"';

トッド

于 2012-06-17T14:36:47.437 に答える