4

我的问题是我正在尝试使用 $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

4

6 回答 6

1

由于 PHP MySQL 客户端 API 库尚未更新(请检查 phpinfo,即版本 5.1.69)。如果是这种情况,您应该更新它。

于 2013-10-16T19:35:51.277 回答
0

这里似乎是同样的问题

CodeIgniter 列表字段

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

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

放回任何日志记录功能等

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

于 2013-11-29T12:41:39.093 回答
0

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

于 2013-11-26T07:37:59.693 回答
0

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

SELECT @@SESSION.sql_mode;

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

于 2013-12-02T13:01:19.343 回答
0

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

首先,您的段落描述是完整的,但很难准确地跟踪您的哪些日志记录点正在被捕获。稍加编辑会有所帮助。

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

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

3) 在 foreach 循环中使用 $query->functions() 不是一个好主意:性能不佳,并且您无法轻松测试正在发生的事情。将其转储到变量中并 var_dump() 以便我们可以确认 list_fields() 没有返回任何内容,并且它不仅仅是隐藏其他问题(即 $list_fields = $query->list_fields() )

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

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

在这一点上,您至少应该更精确地缩小范围,然后您可以提出一个更具体的问题,人们可以尝试帮助您解开。

于 2013-11-26T12:06:43.747 回答
-2

我觉得你应该试试$this->db->list_fields()

$this->db->list_fields('table_name');
于 2013-11-29T12:29:41.377 回答