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 列中的值来检索第三列中的值。每次单击该按钮时,我都会收到解析错误,以发现我的 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

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

于 2012-08-13T14:30:18.173 回答
0

您收到的“未定义索引”消息是因为未设置这些变量。检查您是否确实将它们发布到脚本中。

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

考虑使用PDO,因为“mysql_”命令已被弃用。在将输入传递给查询之前,您应该检查输入。 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

检查 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";
 }
于 2012-08-13T14:35:42.277 回答