Codeigniter$query->;list_fields()在使用相同php代码的LINUX上不返回任何内容

Codeigniter$query->;list_fields()在使用相同php代码的LINUX上不返回任何内容,php,mysql,sql,linux,codeigniter,Php,Mysql,Sql,Linux,Codeigniter,我的问题是,我试图使用$query->list\u fields()从mysql查询中获取列 我有一台本地Windowsx64机器,需要一直使用PHP5.4,一切正常,我没有遇到任何问题。然后我转到服务器LINUX centOS,在数据库调用时没有任何列被撤回。我已经尽可能地在我的本地机器上复制了场景问题,它在我的本地机器上收回了没有问题的字段。奇怪的是,我有一段代码,可以将字段拉回到数组中,它可以用于不同的调用,但不是我想要的调用。我已经验证了sql调用,它返回一个结果,这就是我想要的,我已经

我的问题是,我试图使用$query->list\u fields()从mysql查询中获取列

我有一台本地Windowsx64机器,需要一直使用PHP5.4,一切正常,我没有遇到任何问题。然后我转到服务器LINUX centOS,在数据库调用时没有任何列被撤回。我已经尽可能地在我的本地机器上复制了场景问题,它在我的本地机器上收回了没有问题的字段。奇怪的是,我有一段代码,可以将字段拉回到数组中,它可以用于不同的调用,但不是我想要的调用。我已经验证了sql调用,它返回一个结果,这就是我想要的,我已经验证了这一点

以下是规格:

      |  Client                  |   Server
------|--------------------------|-----------------------------
OS    |  Windows x64 Professional|  CentOS release 6.4 (Final)
Apache|  Apache/2.4.4            |   2.2.24
MYSQL |  5.5.32                  |   5.5.33
PHP   |  5.4.16                  |   5.4
我使用的服务器是hostgator共享计划

以下是php代码:

private function get_single_result_from_single_row_query(&$table, &$id, &$id_var = 'id')
{
    $query = $this->db->limit(1)->get_where($table, array($id_var => $id));
    if ($query->num_rows === 1)
    {
        $rows = ($query->result_object());
        $cols = $this->get_collumns_as_array($query);
        return $this->table_object_from_cols($cols, $rows[0]);
    }
    else
    {
        return NULL;
    }
}


private function get_collumns_as_array(&$query)
{
    $collumns = array();
    foreach ($query->list_fields() as $field)
    {
        log_message('error', 'col field: '. $field);
        array_push($collumns, $field);
    }
    if(empty($collumns))
    {
        log_message('error', 'collumns is empty'. $field);
    }
    return $collumns;
}

private function table_object_from_cols(&$collumns, &$row)
{
    if ($collumns == NULL || empty($collumns))
    {
        return NULL;
    }
    $table_object = array();
    foreach ($collumns as $col)
    {
        log_message('error', 'row->col : ' . $row->$col);
        $table_object[$col] = $row->$col;
    }
    return $table_object;
}
正如你们所看到的,我在并没有列的情况下抛出了一个错误,试图找出原因!还应该看到,当行数等于1时,查询只能前进

由于我的计划,我无法远程调试服务器

基本上我完全被难倒了所有的帮助都很感激

编辑:我已经尝试从我的函数中删除“&”,但没有任何区别
编辑:我现在在服务器上使用PHP 5.4

我发现CentOS 6.4的MySQL版本比默认安装的版本(5.1.69)高一些(间歇性/奇怪的)问题,因为PHP MySQL客户端API库尚未更新(请与版本为5.1.69的phpinfo联系)。如果是这样,您应该更新它。

您可以仔细检查文件名的大小写。Windows会忽略它,因此可以找到与推荐系统命名不同的文件。将其移动到Linux会导致文件名区分大小写,系统可能找不到相关的库/模型等。

这应该不难调试,至少可以找到确切的故障点

首先,您的段落描述是完整的,但很难精确地跟踪捕获的日志记录点。至少,编辑是有帮助的

1) 调用->num_rows()而不是直接调用变量是一个更好的主意

2) 为我们确认正在调用get_collumns_as_array(),因为这就是代码问题所在

3) 在foreach循环中使用$query->functions()不是一个好主意:性能不好,而且您无法轻松测试发生了什么。将其转储到一个变量中,并使用var\u Dump()将其转储,这样我们就可以确认list\u fields()没有返回任何内容,并且它不仅仅隐藏了其他问题(例如,$list\u fields=$query->list\u fields())

4) 我不明白为什么要使用result_object()-这通常用于传入类对象;我认为您只需要result_array(),但可能您正在做一些我看不到的事情。看起来您正在设置$rows=true/false,但这里可能还有更多。似乎您使用了太多“聪明”的代码

5) 如果您确认在$list\U fields=$query->list\U fields()之前运行正常,这意味着您的问题在list\U fields()函数中。此函数仅使用mysql_fetch_field()从查询结果中提取字段。因此,在服务器上设置一个简单的php测试,以确认该函数是否正常工作


在这一点上,你至少应该更准确地缩小范围,你可以带着一个更具体的问题回来,人们可以尝试帮助你解开。

我认为你应该尝试
$this->db->list\u fields()


这似乎是同样的问题

我不知道为什么,什么会起作用正在改变这一点

private function get_collumns_as_array(&$query){
    $row = $query->first_row();
    return array_keys($row);
}
恢复任何日志功能等


查询有效吗?应用程序是否使用正确的mysql地址和正确的用户。您能否尝试以应用程序使用的用户身份登录并运行查询?

检查两个Mysql安装的设置是否相同。例如,检查两台服务器是否具有相同的sql\u模式:

SELECT @@SESSION.sql_mode;

如果示例1是严格的,而另一个不是严格的,则一个可以给出结果+警告,而另一个只给出错误。

请尝试在每个变量之前声明函数参数,但不带
&
(不带var引用),主机上可能有不同的配置。完成此操作后,没有任何区别请打开探查器
$this->output->enable_profiler(TRUE),注释掉查询后的所有重定向等。然后运行脚本,是否运行查询?生成的查询是否正确?查询生成是否正确查看代码,看不到文件名标签缺失的位置。这不是标签错误。这更像是Foo_Model应该在Foo_Model.php中,如果它在Foo_Model.php中,Windows会找到它,linux不会。我已经检查了,情况是相同的,返回表的字段,而不是他的查询字段。这个答案是不正确的
SELECT @@SESSION.sql_mode;