1

タイトルに記載されているエラーに遭遇しました。これがPHPファイルのコードです。クエリを修正しようとしましたが、エラーを修正できませんでした。なぜこのようなエラーが発生するのか、誰かに教えてもらえますか。私はエラーを形成しますが正しくありませんか?私はいくつかの同様の投稿を見ましたが、それらの投稿から私が知っているのは、問題は私のクエリであるはずですが、それを変更する方法がわかりません。それで、私の質問の問題がどこにあるかを教えてくれるようにあなたの助けを求めることができます。これは間違いなく私の概念を明確にするのに役立ちます。

$query = "SELECT * 
    FROM Tech AS T, Client AS C, Site AS S, Log AS L 
    WHERE T.TechID=L.TechID, C.ClientID=L.ClientID, S.SiteID=L.SiteID";
if($sort=="Tech")
   $query += "ORDER BY T.TechName ASC, L.Time DSC";
else if($sort=="Client")
   $query += "ORDER BY C.ClientName ASC, L.Time DSC";
$result = mysql_query($query) or die('Error! ' . mysql_error());; 
print "Real-Time check in/check out<br>";
print "<table><th><td>Tech</td><td>Client</td><td>Site</td>";
print "<td>Date and Time</td><td>Type</td></th>";
while($row = mysql_fetch_array($result)){
print "<tr><td>".$row['T.TechName']."</td>";
print "<td>".$row['C.ClientName']."</td>";
print "<td>".$row['S.SiteName']."</td>";
print "<td>".$row['L.Time']."</td>";
print "<td>".$row['L.Type']."</td></tr>";
}
print "</table>";

以下はエラーメッセージです。

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

4

5 に答える 5

4

ゼロがどこから来ているのかわかりません。

ただし、クエリにORDER BYを追加している行では、スペースが不足しています。

オリジナルの最後にスペースを追加するか、オリジナル$queryの最初にスペースを追加します$query +=

また、下降するためにそれはすべきではありDESCませんDSC

また、+=はPHPの場合は。=である必要があります

于 2012-07-13T09:42:34.483 に答える
3

あなたの問題はWHERE条項にあります。ANDカンマの代わりにコンマを使用する必要があります。

SELECT * 
FROM Tech AS T, Client AS C, Site AS S, Log AS L 
WHERE T.TechID=L.TechID AND C.ClientID=L.ClientID AND S.SiteID=L.SiteID

それでも、さらに良い解決策は、結合を使用することです。

SELECT * 
FROM Tech AS T
JOIN Client AS C on T.TechID=L.TechID
JOIN Site AS S on C.ClientID=L.ClientID
JOIN Log AS L on S.SiteID=L.SiteID

編集:演算子の代わりに連結文字列を試しnear 0 at line 1て使用するために取得します。を使用すると、phpは両方の部分を数値に変換して追加します。文字列は数字と接触しないため、両方とも0に変換され、結果はになります。したがって、最終的なSQLは単純です。あなたはそれをチェックすることができます+.+00print_r($query);

EDIT2 :ORDER BY条項の冒頭にスペースがないことに気付いてくれたGeraldVesluisに感謝します。

于 2012-07-13T09:41:53.250 に答える
3

カンマの代わりに、

前のスペースORDER

.=それ以外の+=

$query = "SELECT * 
    FROM Tech AS T, Client AS C, Site AS S, Log AS L 
    WHERE T.TechID=L.TechID AND C.ClientID=L.ClientID AND S.SiteID=L.SiteID";
if($sort=="Tech")
   $query .= " ORDER BY T.TechName ASC, L.Time DESC";
else if($sort=="Client")
   $query .= " ORDER BY C.ClientName ASC, L.Time DESC";
于 2012-07-13T09:43:54.677 に答える
1

++=数字を追加し、文字列..=追加します。

結果配列のフィールド名には、テーブル名が含まれていません。$row['TechName']を参照する必要があります(例)$row['T.TechName']

オフトピック

DBアクセスと出力を混在させると、結合が高すぎます。理想的には、それぞれが別々のレイヤーで処理されます。このプロセスは、PDOまたは(PHP 5.4以降では)mysqliを使用して開始しforeach、DB結果クラスインターフェイスの一部であるメソッドを明示的に呼び出す代わりに、結果を繰り返し処理することができます。この魔法は、PDOStatementと(PHP 5.4以降)がインターフェースmysqli_resultをサポートしているために可能です。Traversable

<br/>意味論的であることはめったにありません; 見出し要素など、より適切なものを使用するか、既存の要素にスタイルを適用します。

<th><td>;の有効な親ではありません。<tr>親である必要があり、の代わりに<th>使用する必要があります。 <td>

ブランチが単一のステートメントで構成されている場合、角かっこはオプションですが、バグが発生することがあるため、角かっこを省略するのは通常、不適切なスタイルと見なされます。

機能的にelse ifはと同等ですがelseif、ランタイムによって本体としてのelseとして処理されます。if

if (...) {
} else {
    if (...) {
    }
}

elseif推奨される形式です。

$sort文字列以外を保持できる可能性がある場合は、偶数( )==と評価できます。厳密な比較(を使用して、値が文字列として比較されるようにします。TRUE0 == 'Tech'===

提案されたさまざまな変更を適用すると、次のような結果になります。

# Future improvement: abstract each section into methods that are part of separate layers

# Database access
$statement = 'SELECT T.TechName, C.ClientName, S.SiteName, L.Time, L.Type 
    FROM Log AS L
      JOIN Tech AS T ON T.TechID=L.TechID
      JOIN Client AS C ON C.ClientID=L.ClientID
      JOIN Site AS S ON S.SiteID=L.SiteID';

if ($sort === 'Tech') {
   $query .= ' ORDER BY T.TechName ASC, L.Time DESC';
} elseif ($sort === 'Client') {
   $query .= ' ORDER BY C.ClientName ASC, L.Time DESC';
}

try {
    $data = $db->query($statement);
} catch (PDOException $exc) {
    $data = array();
    # handle error appropriately: inform user that there was an internal error. Log the actual error and possibly notify the dev team.
    ...
}

# Output/User interface
$fields = array('TechName' => 'Tech', 'ClientName' => 'Client', 'SiteName' => 'Site', 'Time' => 'Date and Time', 'Type' => 'Type');
if ($data) {
    ?>
    <h3>Real-Time check in/check out</h3>
    <table>
      <thead>
        <tr><th><?php echo implode('</th><th>', $fields) ?></th></tr>
      </thead>
      <tbody>
        <?php foreach ($data as $row) { ?>
          <tr>
            <?php foreach ($fields as $field => $label) { ?>
              <td><?php echo $row[$field] ?></td>
            <?php } ?>
          </tr>
        <?php } ?>
      </tbody>
    </table>
    <?php
}
于 2012-07-13T09:43:43.593 に答える
0

$ queryの最後にスペースを入れる必要があると思います。これは、orderbyステートメントを間にスペースを入れずに追加するためです。

したがって、次のようになります。

L.SiteIDORDERBY

このような代わりに:

L.SiteID ORDER BY
于 2012-07-13T09:44:35.013 に答える