在第4行的'ORDER BY date DESC LIMIT 1'附近使用的正确语法

时间:2012-12-27 22:09:37

标签: mysql php

我一直收到以下错误:

  

您的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()函数中。感谢所有的帮助,提前谢谢。

5 个答案:

答案 0 :(得分: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”的错误消息,这让我想知道我们是否正在查看正确的脚本!

答案 1 :(得分: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";

答案 2 :(得分:1)

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

  

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

你必须密切注意你的陈述之前'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是否包含有用的内容。

BTW:使用参数化语句也可以让你摆脱这个特殊的陷阱(以及其他几个)

答案 3 :(得分: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到{{1}}

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

答案 4 :(得分:0)

日期是变量类型。尝试用``

括起名为'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