我的问题是我正在尝试使用$ 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答案 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)
这似乎是同一个问题
我不知道为什么,什么会改变这个
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');