【问题标题】:The right syntax to use near 'ORDER BY date DESC LIMIT 1' at line 4 [closed]在第 4 行的“ORDER BY date DESC LIMIT 1”附近使用的正确语法 [关闭]
【发布时间】:2012-12-27 22:09:36
【问题描述】:

我不断收到以下错误:

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

【问题讨论】:

  • 你得到的错误是ORDER BY name,而不是date
  • 请不要使用mysql_* 函数编写新代码。它们不再维护,社区已经开始deprecation process。看到 red box 了吗?相反,您应该了解prepared statements 并使用PDOMySQLi。如果你不能决定哪一个,this article 会帮助你。如果你选择 PDO,here is good tutorial.
  • IN-JECTION、lalali、lalada、lala in-ject-la-di-da。
  • 这不是骗子。好吧,我的意思是,骗子帮助,但这不是骗子。这只是一个普通的坏问题。我的意思是说真的,用户甚至都懒得把正确的错误代码放在那里。现在是认真的。我的意思是来吧。 如果您不给我们真实的、损坏的代码,我们应该如何给您一个具体、有用的答案!?

标签: mysql php


【解决方案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
"
;

$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”的错误消息,所以我想知道我们是否正在查看正确的脚本!

【讨论】:

  • 啊,我看到编辑更改了错误消息。所以我会提出另一个建议。在 MySQL 中,“日期”是一个保留字。您应该尽量避免使用保留字作为列名。但是,如果您坚持使用它,请尝试将其括在反引号中(在数字 1 左侧的键盘上),如下所示...(但使用反引号而不是撇号) ORDER BY 'date' DESC
  • date 不是 MySQL 中的保留字。
  • 我的错误。一定是我记得的一些旧数据库!
【解决方案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";

【讨论】:

  • +1 "在 'xxx' 附近使用的正确语法" -> 你必须在那个 'xxx' 之前看一下,你就会知道,出了什么问题 - 我猜 $this-&gt;sid 什么都不包含并且你得到... AND l.promotee = ORDER BY ...:o)
  • 当我这样做时,它给了我以下错误:表'1202341_us.log'不存在
  • 嗯,这意味着这个错误出现在你系统的另一部分,所以你发布的内容实际上已经解决了......
【解决方案3】:

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

将名为“日期”的字段括起来

示例。

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

【讨论】:

  • 惊喜...date 不是保留字,可以不用反引号:) dev.mysql.com/doc/refman/5.5/en/reserved-words.html
  • 日期是一个变量类型。编写清晰的代码比聪明更重要。将名为 date 的字段放在反引号内使代码更易于阅读。
  • 我仍然收到错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 ') ORDER BY date DESC LIMIT 1' 附近使用正确的语法
  • 奇怪的是错误信息没有改变。您是否尝试过@Ray Paseur 建议的解决方案。他的解决方案将显示失败的确切 SQL,然后您可以直接使用 MySQL 客户端/gui 尝试。
【解决方案4】:

当你从 MySQL 中收到一条 SQL 语句的错误消息时

您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 n

行使用 near 'xxxx' 的正确语法

你必须留意你的陈述之前'xxxx'。

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

在这种情况下,语句(由 MySQL 接收)将如下所示($this-&gt;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-&gt;sid 是否包含有用的内容。

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

【讨论】:

    【解决方案5】:

    既然你没有说你的桌子,那么

    通过别名分配您的列

        $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 的保留字

    【讨论】:

      猜你喜欢
      • 2019-08-17
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      相关资源
      最近更新 更多