我一直收到以下错误:
您的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()
函数中。感谢所有的帮助,提前谢谢。
答案 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