2014-09-19 169 views
0

我在维护一个旧的网站,它在mysql查询上抛出一些sql错误。错误如下...嵌套查询的SQL语法错误

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 'OR syprc_serial IN (SELECT b.syprc_serial FROM syproductcategories.b WHERE b.syp' at line 1 

我怀疑这是与我的嵌套选择的语法,但我没有成功地解决这个问题呢!任何人都得到了一些见解

$query = "SELECT syprc_serial, syprd_serial, sypcd_description, sypdd_title, sypdd_shortdescription, sypdd_longdescription, sypdd_primarypackage, sypdd_owner, syprd_image01, syprc_subcategoryof ". 
    "FROM syproductcategories, syproductcategoriesdescription, syproducts, syproductsdescription ". 
    "WHERE syprc_serial = sypcd_productcategoryserial ". 
    "AND syprd_categoryserial = syprc_serial ". 
    "AND sypdd_languagecode = '". $_SESSION['language']."' ". 
    "AND sypcd_languagecode = '". $_SESSION['language']."' ". 
    "AND syprd_serial = sypdd_productserial ". 
    "AND syprc_companyserial = '" . $_SESSION['company'] ."' ". 
    "AND syprd_companyserial = '" . $_SESSION['company'] ."' ". 
    "AND syprd_active = 1 ". 
    "AND (syprc_serial = $syprc_serial ". 
     "OR syprc_serial IN (SELECT b.syprc_serial FROM syproductcategories b WHERE b.syprc_subcategoryof = $syprc_serial) ". 
     "OR syprc_subcategoryof IN (SELECT b.syprc_serial FROM syproductcategories b WHERE b.syprc_subcategoryof = $syprc_serial) ". 
    ") ". 
    "ORDER BY syprc_serial, sypdd_title, syprd_serial"; 
+2

如果您只是在该行后面打印您的查询,您应该看到它的外观以及检查错误的方式。 – Olli 2014-09-19 09:59:01

+1

@TheChaos如果没有真正的查询,我们只能推测'$ syprc_serial'计算结果为空字符串... – VMai 2014-09-19 10:05:14

+1

你在哪里定义'b'?错误消息和查询看起来不一样:'FROM syproductcategories b'没有点... – 2014-09-19 10:07:33

回答

1

语法对我来说看起来很好。无论是$ _SESSION ['language']还是$ _SESSION ['company']都将放入字符串文字中。但$ syprc_serial不会。所以很可能$ syprc_serial不包含数字。

  • 这是应该发生的:WHERE b.syprc_subcategoryof = 123)
  • 而这不是:WHERE b.syprc_subcategoryof = ABC)
  • 而这两者都不是:WHERE b.syprc_subcategoryof =)
  • 甚至这个:WHERE b.syprc_subcategoryof =(),-_;)

syprc_subcategoryof是什么列类型?如果它是一个字符串,然后用引号括起来,就像你对会话变量所做的那样。否则,只需确保该变量包含一个数字。

像这样的事情很容易发现:打印最后的声明。如果你没有立即看到有什么问题,那么直接使用dbms。删除并添加部件,直到它工作。