繁体   English   中英

SQL语法错误,请检查正确的语法以在第1行附近使用“ 0”附近

[英]Error in SQL syntax, check for right syntax to use near '0' at line 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'附近使用正确的语法

无法看到零的来源。

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

可以在原始$query末尾添加一个空格,也可以在$query +=的开头添加一个空格$query +=

同样对于下降,应该是DESC而不是DSC

另外,对于PHP,+ =应该是。=

您的问题出在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);检查print_r($query);

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

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";

++=加上数字. .=附加字符串。

结果数组中的字段名称不包含表名称。 您应该引用(例如) $row['TechName']而不是$row['T.TechName']

无关

DB访问和输出混合会产生很高的耦合。 理想情况下,每个都将在单独的层中进行处理。 您可以使用PDO或(在PHP 5.4和更高版本中)mysqli启动此过程,并使用foreach遍历结果,而不是显式调用作为数据库结果类接口一部分的任何方法。 因为PDOStatement和(从PHP 5.4起) mysqli_result支持Traversable接口,所以这种魔术是可能的。

<br/>很少具有语义 ; 使用更合适的内容,例如标题元素,或将样式应用于现有元素。

<th>不是<td>的有效父代; <tr>应该是父级,并且应该使用<th> 代替 <td>

当分支由单个语句组成时,括号是可选的,但通常忽略括号将其视为错误的样式,因为它偶尔会导致错误。

else if在功能上等效于elseif ,它在运行时作为if的主体作为else进行处理:

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
}

我认为您需要在$ query的末尾放置一个空格,因为您要将order by语句追加到其上,且之间没有任何空格。

所以它看起来像这样:

L.SiteIDORDERBY

而不是像这样:

L.SiteID ORDER BY

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 您的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册,以获取在第 5 行的“*”附近使用的正确语法 您的SQL语法错误; 检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的&#39;WHERE id =&#39;9&#39;附近使用 您的SQL语法有误; 检查与您的MySQL服务器版本相对应的手册,以在第4行的&#39;)&#39;附近使用正确的语法 您的SQL语法有误; 检查与您的MySQL服务器版本相对应的手册,以找到在第7行的&#39;&#39;附近使用的正确语法 您的SQL语法有误; 检查与您的MySQL服务器版本相对应的手册以在第1行的&#39;)&#39;附近使用正确的语法 您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在第2行的&#39;&#39;&#39;&#39;&#39;&#39;附近使用正确的语法 您的SQL语法有误; 检查与您的MariaDB服务器版本相对应的手册以在第1行的&#39;)&#39;附近使用正确的语法 SQL语法错误; 检查与您的MySQL服务器版本相对应的手册,以在第1行的&#39;-10,10&#39;附近使用正确的语法 您的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册,以获取在第 3 行的 &#39;&#39; 附近使用的正确语法 您的SQL语法有错误; 检查与您的MariaDB服务器版本相对应的手册以获取在第1行附近使用的正确语法
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM