MySQL连接结果与PHP不同?

时间:2011-09-12 15:43:53

标签: php mysql database join phpmyadmin

我有一个问题:

SELECT * FROM categorys 
LEFT JOIN category_info ON categorys.cat_id=category_info.cat_id 
WHERE `cat_name` = 'aname'
ORDER BY `cat_order`

当我在phpMyAdmin中运行时,无论第二个表中是否匹配,我都会得到一个cat_id。

然而,当我在我的PHP代码中运行此查询时,我得到一个空白的cat_id,如此print_r()所示:

  

数组([cat_id] => [cat_name] =>浴[type] => main [cat_order] =>   99 [cat_img] => [display] => 1 [删除] => 0 [desc_id] => [desc] =>   [text] => )

为什么在查询完全相同时会有不同的结果?

编辑: 我的PHP代码:

$getcatidsql = "SELECT * FROM categorys 
LEFT JOIN category_info ON categorys.cat_id=category_info.cat_id 
WHERE `cat_name` = '{$cname}'
ORDER BY `cat_order";   
$getcatidresult = $db->query( $getcatidsql );
$catdata = $db->fetchRow( $getcatidresult );

function query() {
  $this->query_total++;
  if (func_num_args() == 1) {
    $sql = func_get_arg(0);
  } else {
    $args = func_get_args();
    for ($i=1;$i<count($args);$i++) if (!is_numeric($args[$i])) $args[$i] = '"'.mysql_real_escape_string($args[$i]).'"';
    $sql = vsprintf(array_shift($args),$args);
  }
  if ($result = mysql_query($sql,$this->db_connection)) {
    return $result;
  } else {
    $this->dberror( $this->db_connection, $sql );
  }
}

function fetchRow($result,$type=MYSQL_ASSOC)
{
    if($result)
        $row = mysql_fetch_array($result,$type);
    return $row;
}

4 个答案:

答案 0 :(得分:2)

我认为你不能使用select *(也因为两个表中的列名相同),但是根据需要选择完全相应的字段

  select table_name.field, table_name.field2, other_table_name.field1 

..你可以从php代码和phpmyadmin获得正确的结果

答案 1 :(得分:1)

我认为这是因为'cat_id'在两个表中都是相同的字段名称=&gt;结果数组中的索引相同。 尝试修改查询,如:“从categoriesys中选择categoriesys.cat_id AS类别......”

答案 2 :(得分:1)

您正在从categoryscategory_info中选择*。它们都有一个cat_id列。因此,您将获得两个cat_id列。

问题是:当您在SELECT列表中遇到两个具有相同名称的列时,您正在使用的SQL库/驱动程序是做什么的?

看起来它可能会覆盖第二个遇到的第一个......如果你使用明确的SELECT列表,指定categorys.cat_id引入{{}会发生什么? 1}}?

答案 3 :(得分:0)

当你陈述

  

当我在phpMyAdmin中运行时,我得到了一个cat_id

你的意思是你为cat_id获得了一个VALUE,或者你是否为NULL?因为这是你用php得到的,cat_id的NULL值(正如你在print_r中看到的那样,它仍然出现在那里)。

如果您不希望从categorys获取该类别category_info中没有现有行的行,那么您必须使用RIGHT JOIN而不是LEFT JOIN。