【问题标题】:Inner join in mysql, syntax error, regarding php querymysql中的内部连接,语法错误,关于php查询
【发布时间】:2011-12-13 14:34:07
【问题描述】:
       $threadID=$_GET['threadID'];

            $result=mysql_query("
            SELECT * FROM threads AS Threads
            INNER JOIN users AS Users ON Threads.user_id=Users.user_id 
            WHERE thread_id='$threadID' LIMIT 1
            ") or die(mysql_error());

我明白了:

你的 SQL 语法有错误;检查相应的手册 到您的 MySQL 服务器版本,以便在“11”附近使用正确的语法 第 3 行

我之前写过很多内连接。为什么我的语法在查询接近尾声时出错

更新:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 '12' LIMIT 1' 附近使用正确的语法

【问题讨论】:

  • 你能回显完整的查询(或至少 $threadID 的值)吗?看起来 $threadID 可能出于某种原因设置为 '11(带有前导单引号)。
  • 它说的一模一样 - "u have.."?
  • @Col: 必须是 Oracle 新的“MySQL,少年版”。有 12 种臀部颜色,所有输出都转换为 txt/l33t。
  • 大声笑..不,你有。我在结果上放回声吗..
  • 您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“12”LIMIT 1 附近使用正确的语法

标签: php mysql sql


【解决方案1】:

为什么不以这种方式加入您的查询:

$threadID = mysql_real_escape_string( $_REQUEST['threadID'] ); // Get some cleanup in there...

$result=mysql_query("SELECT threads.*, users.*
FROM threads, users 
WHERE threads.user_id = users.user_id 
AND threads.thread_id = '$threadID' 
LIMIT 1
") or die( mysql_error() );

【讨论】:

  • lol..也许它的意思是一样的,而且更短一些。我正在考虑使用最短的语法... USING(users.user_id),有趣的语法,你已经展示了
【解决方案2】:

啊,也许我知道答案。
我相信mysql中有一个东西叫"strict mode"或其他东西,它对数据类型过于挑剔。

尝试像这样进行查询

   $id  = (int)$_GET['threadID']; 
   $sql = "SELECT * FROM threads t INNER JOIN users u ON t.user_id=u.user_id  
           WHERE thread_id=$id LIMIT 1"; 
   $res = mysql_query($sql) or trigger_error(mysql_error().$sql);

【讨论】:

  • hmm..结尾处的语法很有趣..谢谢你的那一行..从现在开始我会使用它
【解决方案3】:

首先,您的查询对sql injection attacks 开放。

其次,要弄清楚为什么会出现语法错误,请将查询构建阶段与实际查询调用分开:

$sql = "SELECT ....";
echo $sql;
$result = mysql_query($sql) or die(...);

这样您就可以看到整个查询。 MySQL 的错误消息只报告它认为错误所在的查询部分,但有时它会判断错误并消除错误所在的实际相关部分......所以......检查整个查询。

【讨论】:

  • 投票赞成提及 SQL 注入。这很容易避免,但也很容易被忽视。
  • 你要我检查什么?请求是否来自上一页。我确实需要通过 GET 发送 threadID.. 虽然我也可以通过邮寄方式发送.. 通过 get 发送一些 id 很方便..
  • @Matrix001 这并不能回答您的主要问题,但它有助于阻止 SQL 注入。由于“threadID”查询字符串参数可以设置为任何值(例如1'; DROP TABLE threads; --),因此您应该使用带参数的准备好的语句。在 PHP 中,这是通过 MySQLi 支持的。
  • 矩阵:您必须在将用户输入插入 SQL 字符串之前对其进行清理。通常这是用 mysql_real_escape_string() 完成的。在您的情况下,由于似乎已启用严格模式,因此您必须消除查询中值周围的引号,并通过 $threadID = intval($_GET['threadID']); 将其强制为 PHP 中的 int
  • @Matrix001 不要听他的,这不是事实。您不必“清理”用户输入。您必须根据 SQL 规则格式化数据。总是。不管它是否是用户输入。它不是一种消毒,而只是一种格式。并且 mysql_real_escape_string() 也不会“清理”任何东西。
猜你喜欢
  • 1970-01-01
  • 2015-09-21
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 2015-03-10
  • 2015-07-22
相关资源
最近更新 更多