0
<?php
mysql_connect("localhost","root","");
mysql_select_db("hftwmvirtualdb");
$Booknum = mysql_real_escape_string($_POST['Booknum']); 
$Chapternum = mysql_real_escape_string($_POST['Chapternum']); 
$Versenum = mysql_real_escape_string($_POST['Versenum']); 
$sql = mysql_query("SELECT `VERSETEXT` FROM `booktable` WHERE `BOOKID` = $Booknum AND `CHAPTERID` = $Chapternum AND `VERSENO` = $Versenum");
echo mysql_error();
while($row=mysql_fetch_assoc($sql));
print(json_encode($row));
mysql_close();
?>

Androidアプリケーションから投稿されたデータを使用してクエリをトリガーし、mysqlデータベースから結果を取得しようとしています。テーブルには4つの列があり、最初の3列の値を定義して、3番目の列の値を取得しようとしています。ボタンをクリックするたびに、解析エラーが発生し、PHPスクリプトがSQLクエリを処理していないことがわかりました。ブラウザからスクリプトを実行すると、次のメッセージが表示されます。

  • 未定義のインデックス:4行目のC:\ wamp \ www\GetVerse.phpのBooknum
  • 未定義のインデックス:5行目のC:\ wamp \ www\GetVerse.phpのChapternum
  • 注意:未定義のインデックス:6行目のC:\ wamp \ www\GetVerse.phpのVersenum
  • SQL構文にエラーがあります。1行目の「AND CHAPTERID=AND =」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。VERSENO
  • 警告:mysql_fetch_assoc()は、パラメーター1がリソースであると想定しています。ブール値は9行目のC:\ wamp \ www\GetVerse.phpで指定されています。

警告メッセージ1〜3が表示されるのは、投稿データを送信しなかったためですが、正しい構文を使用してみたため、修正方法がわかりません。「like」の「=」を削除してみました。それも失敗しました。何が問題ですか?。

4

4 に答える 4

2

指定したundefined indexとおり、投稿データを送信しなかったためにエラーが発生しています。これにより、変数、、、$Booknumおよび$Chapternum$Versenum空になります。

空の変数を使用すると、MySQLクエリは次のWHEREような句で生成されます。

WHERE `BOOKID` =  AND `CHAPTERID` =  AND ...

欠落している値は無効なMySQLを引き起こしているため、エラーが発生します。さらに、POST値が文字列(使用法と名前に基づいて想定した整数ではない)であることを(コメントで)指定したので、MySQLクエリで値を引用符で囲む必要がありますそれも。値を引用符で囲まないと、有効な文字列でもクエリが失敗する可能性があります。

これを修正するには、次のようにしてみてください。

$Booknum = isset($_POST['Booknum']) ? mysql_real_escape_string(trim($_POST['Booknum'])) : null;
$Chapternum = isset($_POST['Chapternum']) ? mysql_real_escape_string(trim($_POST['Chapternum'])) : null;
$Versenum = isset($_POST['Versenum']) ? mysql_real_escape_string(trim($_POST['Versenum'])) : null;
if (!empty($Booknum) && !empty($Chapternum) && !empty($Versenum)) {
    $sql = mysql_query("SELECT `VERSETEXT` FROM `booktable` WHERE `BOOKID` = '" . $Booknum . "' AND `CHAPTERID` = '" . $Chapternum . "' AND `VERSENO` = '" . $Versenum . "'");
    echo mysql_error();
    while($row=mysql_fetch_assoc($sql));
    print(json_encode($row));
    mysql_close();
}

これにより、値が正しく設定されていることが確認されます。設定されていない場合は、に設定されnullます。3つの値すべてが空でない場合、PHPを介してempty()、クエリが実行されます。

于 2012-08-13T14:30:18.173 に答える
0

表示される「未定義のインデックス」メッセージは、これらの変数が設定されていないためです。それらを実際にスクリプトに投稿していることを確認してください。

空の変数は、クエリが間違っていてエラーが発生する理由です。

「mysql_」コマンドは非推奨になるため、PDOの使用を検討してください。入力をクエリに渡す前に、入力を確認する必要があります。 isset()はそのために機能します。

于 2012-08-13T14:30:02.773 に答える
0

これは、変数が次のように置き換えられたときにSQLクエリがどのように表示されるかを示しています。

SELECT `VERSETEXT` FROM `booktable` WHERE `BOOKID` =  AND `CHAPTERID` =  AND `VERSENO` = 

変数にコンテンツが含まれていない場合(データを送信しない場合はコンテンツが含まれないため)、クエリは無意味です。構文が正しくありません。

クエリを実行する前に、データが投稿されているかどうかを確認してください。さらに、セキュリティと利便性のために、パラメータ化されたクエリ(MySQLiまたはPDOを使用)の使用を開始することも有益です。

于 2012-08-13T14:30:23.260 に答える
-2

投稿データが来るかどうかを確認します。未定義のインデックスは、使用した変数のデータがないためです。したがって、最初にそれを確認してから、SQLクエリを実行します。

if(isset($_POST['Booknum']) && isset($_POST['Chapternum']) && isset($_POST['Versenum']))
 {
   $Booknum = mysql_real_escape_string($_POST['Booknum']); 
   $Chapternum = mysql_real_escape_string($_POST['Chapternum']); 
   $Versenum = mysql_real_escape_string($_POST['Versenum']); 
   $sql = mysql_query("SELECT `VERSETEXT` FROM `booktable` WHERE `BOOKID` = $Booknum AND    `CHAPTERID` = $Chapternum AND `VERSENO` = $Versenum");
   echo mysql_error();
   while($row=mysql_fetch_assoc($sql));
   print(json_encode($row));
  }
else
{
 echo "No post data";
 }
于 2012-08-13T14:35:42.277 に答える