$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'附近使用正确的语法
我看不出任何明显的事情......这是漫长的一天。
由于
答案 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
相同的替换并处理逃跑。