Codeigniter $ query-> list_fields()在LINUX上没有返回任何相同的PHP代码

时间:2013-10-16 13:24:47

标签: php mysql sql linux codeigniter

我的问题是我正在尝试使用$ query-> list_fields()从mysql查询中获取列。

我有一台本地Windows x64机器,需要使用PHP 5.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

6 个答案:

答案 0 :(得分:1)

由于PHP MySQL客户端API库尚未更新,因此我看到CentOS 6.4的一些(间歇/奇怪)问题,其MySQL版本高于默认安装的版本(5.1.69)。 phpinfo是版本5.1.69)。如果是这种情况,你应该更新它。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

至少要找到确切的失败点,这应该不是很难调试。

首先,您的段落描述已完成,但很难准确地遵循您捕获的哪个记录点。很少编辑会有所帮助。

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

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

3)在foreach循环中使用$ query-&gt; functions()不是一个好主意:性能不佳,你无法轻易测试正在发生的事情。将它转储到变量和var_dump()中,这样我们就可以确认list_fields()没有返回任何内容,而且它不只是隐藏了一些其他问题(即$ list_fields = $ query-&gt; list_fields())< / p>

4)我很困惑你为什么使用result_object() - 这通常用于传入一个类对象;我想你只想要result_array(),但也许你正在做一些我看不到的事情。你似乎也在设置$ rows = true / false,但也许这里还有更多。好像你使用了太多“聪明”的代码

5)如果你确认事情正常运行直到$ list_fields = $ query-&gt; list_fields(),这意味着你的问题出在list_fields()函数中。此函数只使用mysql_fetch_field()从查询结果中提取字段。因此,在您的服务器上设置一个简单的PHP测试,以确认该功能是否正常工作

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

答案 3 :(得分:0)

这似乎是同一个问题

CodeIgniter list-fields

我不知道为什么,什么会改变这个

private function get_collumns_as_array(&$query){
    $row = $query->first_row();
    return array_keys($row);
}

放回任何记录功能等

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

答案 4 :(得分:0)

检查两个Mysql安装是否都设置相同。例如,检查两个服务器是否具有相同的sql_mode:

SELECT @@SESSION.sql_mode;

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

答案 5 :(得分:-1)

我认为你应该尝试$this->db->list_fields()

$this->db->list_fields('table_name');