![](/img/trans.png)
[英]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*' at line 5
[英]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
可能容纳非字符串,则==
甚至可以评估为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
}
我认为您需要在$ query的末尾放置一个空格,因为您要将order by语句追加到其上,且之间没有任何空格。
所以它看起来像这样:
L.SiteIDORDERBY
而不是像这样:
L.SiteID ORDER BY
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.