-5

我不断收到以下错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 4 行的“ORDER BY date DESC LIMIT 1”附近使用正确的语法

function printSoldiersOfRank($rank, $branch)
{
  $soldier = new soldierClass;
  $sql = "SELECT * FROM soldier WHERE rank = $rank AND branch = '$branch'";
  $result = mysql_query($sql);
  while($row = mysql_fetch_array($result)):
    $soldier->getInfo($row['sID']);
    $soldier->printInfo(); 
  endwhile;

function printInfo()
  {
    $sql = "SELECT promoter, name, date
    FROM soldier s, log l
    WHERE s.sID = l.promoter AND l.promotee = $this->sid
    ORDER BY date DESC LIMIT 1";
    $result = mysql_query($sql) or die(mysql_error());
    $row = mysql_fetch_array($result);
    echo "<div class='soldierInfo'>";
    echo "<a href='index.php?page=soldier&sid=$this->sid'>";
    echo $this->name;
    echo "</a><br />";
    echo "Last Promoted: ";
    echo date("d M Y", $row['date']);
    echo "<br />By: <a href='index.php?page=soldier&sid=$row[0]'>";
    echo $row['name'];
    echo "</a></div>";
  }

我假设错误在我的printInfo()函数中。感谢所有帮助,在此先感谢。

4

5 回答 5

2

不要假设错误在任何地方。而是创建一条错误消息,为您提供调试所需的所有信息。这是一个例子。

$sql = 
"
SELECT promoter, name, date
FROM soldier s, log l
WHERE ( s.sID = l.promoter AND l.promotee = $this->sid )
ORDER BY date DESC 
LIMIT 1
"
;

$result = mysql_query($sql);
if (!$result)
{
    echo PHP_EOL;
    echo "<br/>";
    echo "FAILED QUERY $sql";
    echo "<br/> ON ";
    echo __LINE__;
    echo " IN ";
    echo __FILE__;
    echo "<br/>";
    echo " BECAUSE ";
    die(mysql_error());
}

如果您使用类似的东西,您将能够确定地看到失败的查询和失败的位置。就目前而言,您有一个使用“ORDER BY date DESC”的查询和一条显示“ORDER BY name ASC”的错误消息,所以我想知道我们是否正在查看正确的脚本!

于 2012-12-27T22:35:41.640 回答
1

尝试这个:

$sql = "SELECT promoter, name, date
    FROM soldier s, log l
    WHERE s.sID = l.promoter AND l.promotee = '".$this->sid."'
    ORDER BY date DESC LIMIT 1";
于 2012-12-27T22:46:16.680 回答
1

日期是一个变量类型。尝试用 `` 将名为 'date' 的字段括起来

例子。

set @soldierId = 1 ;

SELECT promoter, name, `date`
    FROM soldier s, log l
    WHERE s.sID = l.promoter AND l.promotee = @soldierId
    ORDER BY `date` DESC LIMIT 1
于 2012-12-27T22:48:58.487 回答
1

当您收到来自 MySQL 的 SQL 语句的错误消息时,例如

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第n行的“ xxxx附近使用正确的语法

你必须留意你在“xxxx”之前的陈述。

SQL Parser 由于错误而停止解析语句,并告诉您此(停止)发生在哪一行以及未解析语句的其余部分是什么。

在这种情况下,语句(由 MySQL 接收)将如下所示($this->sid不包含任何内容)

SELECT promoter, name, date
FROM soldier s, log l
WHERE s.sID = l.promoter AND l.promotee = 
ORDER BY date DESC LIMIT 1

试一试,您将收到相同的错误消息。

您应该$this->sid在查询之前检查是否包含有用的内容。

顺便说一句:使用参数化语句也会让你摆脱这个特殊的陷阱(以及其他几个陷阱)

于 2012-12-27T23:33:03.960 回答
0

因为你当时没有说你的桌子

通过别名分配您的列

    $sql = "SELECT s.`promoter`, s.`name`, s.`date`
                   ^-----------^--------------------------------if they are log table then replace by l
          FROM soldier s, log l
         WHERE s.sID = l.promoter AND l.promotee = '".$this->sid."'

         ORDER BY s.`date` DESC LIMIT 1";
                  ^--------------------------------look what table the date is.

我只是猜测并做出了soldier如果它的log桌子然后改变那里的s地方l

并在 backtiks 之间创建日期,因为 date 是 mysql 的保留字

于 2012-12-27T22:38:55.473 回答