-5

次のエラーが発生し続けます。

SQL 構文にエラーがあります。4行目の「ORDER BY date DESC LIMIT 1」付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

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

MySQL からの SQL ステートメントで次のようなエラー メッセージが表示された場合

SQL 構文にエラーがあります。n行目の ' xxxx '付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

「xxxx」ののステートメントに注意する必要があります。

SQL パーサーは、エラーのためにステートメントの解析を停止し、これ (停止) が発生した行と、解析されていないステートメントの残りの部分を示します。

この場合、(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 に答える
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

これを試して:

$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 に答える
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

date は mysql の予約語であるため、backtiks の間に日付を作成します。

于 2012-12-27T22:38:55.473 に答える