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 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“0”附近使用正确的语法

4

5 回答 5

4

看不到零可能来自哪里..

但是在您将 ORDER BY 附加到查询的行中,您缺少一个空格。

要么在你原来的末尾追加一个空格,要么在你$query的开头追加一个空格$query +=

DESC同样对于下降它不应该DSC

+= 也应该是 .= 对于 PHP

于 2012-07-13T09:42:34.483 回答
3

AND 而不是逗号,

之前的空间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 回答
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,因此结果为0. 因此,您的最终 SQL 很简单0。你可以检查一下print_r($query);

EDIT2:ORDER BY感谢 Gerald Vesluis 注意到子句开头缺少空格。

于 2012-07-13T09:41:53.250 回答
1

++=添加数字,..=附加字符串。

结果数组中的字段名不包括表名。您应该参考 (eg) $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以 anif为主体:

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

elseif是首选形式。

如果有任何机会$sort可以保存非字符串,==则可以评估为TRUE偶数 ( 0 == '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 的末尾放置一个空格,因为您将 order by 语句附加到它上面而没有任何空格。

所以它看起来像这样:

L.SiteIDORDERBY

而不是这样:

L.SiteID ORDER BY
于 2012-07-13T09:44:35.013 回答