PHP mysql_query语法错误

时间:2012-08-13 14:27:03

标签: php android mysql post

<?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列中的值来检索第三列中的值。每次我点击按钮,我都会得到解析错误,以找出我的PHP脚本没有处理SQL查询。通过浏览器运行脚本时,我收到消息:

  • 未定义的索引:第4行的C:\ wamp \ www \ GetVerse.php中的Booknum
  • 未定义的索引:第5行的C:\ wamp \ www \ GetVerse.php中的Chapternum
  • 注意:未定义的索引:第6行的C:\ wamp \ www \ GetVerse.php中的Versenum
  • 您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在第1行的'AND CHAPTERID = AND VERSENO ='附近使用正确的语法
  • 警告:mysql_fetch_assoc()要求参数1为资源,在第9行的C:\ wamp \ www \ GetVerse.php中给出布尔值。

我理解我得到警告消息1-3是因为我没有提交帖子数据但后者我不知道如何解决,因为我尝试使用正确的语法,我尝试删除“=”为“像“那也失败了。有什么问题?。

4 个答案:

答案 0 :(得分:2)

正如您指定的那样,undefined index错误发生是因为您没有提交发布数据。反过来,这会导致变量$Booknum$Chapternum$Versenum为空。

使用空变量,正在使用WHERE子句生成MySQL查询,如:

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。如果所有三个值都不为空,则通过PHP的empty(),您的查询将被执行。

答案 1 :(得分:0)

您获得的“未定义索引”消息是因为未设置这些变量。检查您是否实际将这些内容发布到脚本中。

空变量是您的查询错误并且出错的原因。

考虑使用PDO,因为不推荐使用“mysql_”命令。您应该在将输入传递给查询之前检查输入。 isset()将为此工作。

答案 2 :(得分:0)

这是在以下代码中替换变量时SQL查询的样子:

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

当变量不包含任何内容时(如果您不提交数据则不会),查询没有意义:语法格式不正确。

在执行查询之前检查数据是否已过帐。此外,它还有利于您开始使用参数化查询(使用MySQLi或PDO)以确保安全性和便利性。

答案 3 :(得分:-2)

确定Post数据是否来,未定义索引这是因为,您使用的变量没有数据。首先验证它,然后执行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";
 }