2013-02-09 38 views
2

我有这样的SQL查询:在PHP脚本MySQL查询将返回NULL列

SELECT * 
FROM products p, products_description pd, products_to_categories c left 
    join products_sex ps on (c.products_id = ps.products_id), 
    categories cc 
WHERE p.products_id = pd.products_id 
     and p.products_id = c.products_id 
     and cc.categories_id = c.categories_id 
     and p.products_status = 1 
     and p.products_price >= 15.8333333333 
     and p.products_price <= 40 
     and p.products_quantity > 0 
     and (ps.products_sex = "U" or ps.products_sex is null) 
     and (c.categories_id = 77 or cc.parent_id = 77) 
ORDER BY products_sort_order, p.products_date_added desc, pd.products_name ASC 
LIMIT 0, 40 

如果我在MySQL客户端(命令行或Navicat的)执行它,我得到这样的结果:

products_id | dodavatelia_id ... 
2153   | 67    ... 

但是,如果我得到的产品通过PHP脚本(与mysql_query中mysql_fetch_assoc),我得到:

array ( 
    'products_id' => NULL, 
    'dodavatelia_id' => '67', 
    ... 
); 

为什么我得到products_id NULL?

回答

2

这可能是因为您要加入包含具有相同名称的列的多个表,因此您可以使用此名称检索最后一列的值(可能为NULL)。

你应该把一个别名,列要检索:在SQL别名

$result['pPropId'] 

更多信息:

SELECT p.products_id AS pPropId, p.* FROM products p, ... 

然后在你的PHP的结果,你可以像这样访问你的专栏功能here

编辑:为什么它在命令行工作,而不是在这里?

SQL查询正常工作,将返回每个名称列​​。问题是你使用mysql_fetch_assoc(),根据你的结果返回一个关联数组。而且数组中的同一个键不能有多个值。

因此,它可能会在内部执行的操作是$result['products_id'] = p.products_id,但是对于下一个具有相同名称的列删除先前的值也是如此。您可以使用mysql_fetch_row(),它不存在此问题。

一个好的做法是列出您真正想要在SELECT中检索的列,而不仅仅是SELECT *。那么具有相同名称的两列需要不同的别名就变得合乎逻辑了。

+0

谢谢,这就是它。但我不明白,为什么它在mysql命令行工作,而在PHP中没有。 – yetty 2013-02-09 09:54:57

+1

@yetty>因为SQL查询工作正常。检查我更新的答案 – koopajah 2013-02-09 10:00:27