我有一个错误,需要眼睛看一下mysql语句

时间:2011-03-16 21:21:50

标签: mysql

$query_article = sprintf("SELECT * FROM articles, articles_cat_main 
    WHERE articles.id = %s 
    AND articles.cat_main = articles_cat_main.id_articles_cat_main", 
    $colname_article);

我得到:你的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的'AND articles.cat_main = articles_cat_main.id_articles_cat_main'附近使用正确的语法

我看不出任何明显的事情......这是漫长的一天。

由于

5 个答案:

答案 0 :(得分:1)

编辑后

如果变量是数字,只需使用concat而不是使用sprintf

$query_article = "
SELECT * FROM articles, articles_cat_main 
WHERE articles.id = " . $colname_article . "
AND articles.cat_main = articles_cat_main.id_articles_cat_main";

但在任何一种情况下,如果变量为空或不包含任何内容,则查询变为

WHERE articles.id = AND articles.cat_main

所以它出错了。

原始

很明显,您展示的PHP 正在运行的内容!

它有一个

  

WHERE articles.cat_main ..

错误消息

  

靠近 AND articles.cat_main

检查您的代码以了解您的实际运行情况

答案 1 :(得分:0)

你在'articles_cat_main'中有一个名为'id_articles_cat_main'的字段吗?如果没有,那么你有一些要删除的东西,应该修复它。

答案 2 :(得分:0)

您需要将其设为JOIN才能包含第二个表格articles_cat_main。所以:

$query_nextprev = "SELECT * FROM articles JOIN articles_cat_main ON articles.cat_main = articles_cat_main.id_articles_cat_main WHERE articles.active = 'y' ORDER BY articles_cat_main.name_cat_main, articles.`order`";

答案 3 :(得分:0)

SELECT * FROM articles, articles_cat_main
WHERE articles.id = %s AND ...

%s被替换为名为$ colname_article的变量的内容。基于该变量的名称,我认为它不包含整数,可以在没有引号的情况下插入。

如果它为空或包含没有引号的字符串,则会导致您看到的语法错误。

请注意,这种动态SQL语句可以修剪SQL injection个漏洞。

答案 4 :(得分:0)

$colname_article中的价值是什么导致了您的问题。很可能该值不是数字,但在查询中,mysql期望它是数字或列名。很可能该值是一个字符串。或者它是空的。

你可以这样引用它:

$query_article = sprintf("SELECT * FROM articles, articles_cat_main WHERE articles.id = '%s' AND articles.cat_main = articles_cat_main.id_articles_cat_main", $colname_article);

如果您希望它是一个字符串。或者如果你想要它是一个数字,你应该使用%d而不是%s,因为如果你有一个不是数字的东西你会得到一个PHP警告(但查询仍然会失败)< / p>

作为奖励,您目前拥有的设置可能会导致SQL注入攻击。您可能有其他代码可以防止这种情况,但如果不是,您应该使用$colname_article转义mysql_real_escape_string()或者更好地使用PDO和占位符,这些替换将执行与此处sprintf相同的替换并处理逃跑。