V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yibin001
V2EX  ›  PHP

有用Cakephp的朋友么?被郁闷到了。

  •  
  •   yibin001 · 2012-09-06 11:16:21 +08:00 · 3574 次点击
    这是一个创建于 4448 天前的主题,其中的信息可能已经有所发展或是发生改变。
    同样的一段代码,在我的pc上(xampp/php5.3.8/apache2)和虚拟机(linux/xampp/php5.3.8/apache2)上运行的结果一致,但到了服务器上(centos5.5/php5.3.16/nginx)得到的结果与本机不一致,导致后面的逻辑都错了,不知道问题在哪里:

    $user = $this->Login->find('first',array('conditions'=>array(
    'Login.username = '=>$username,
    'Login.password = '=>$password
    )));

    这是一段判断登录的逻辑,在后面的代码中是用$user['Login']来判断的,在我PC和虚拟上能取到$user['Login']的正确值,print_r出来后:
    Array ( [Login] => Array ( [id] => 9 [username] => aaaaaa [password] => 04b35cf604476680b22c4bb8b0888e4a [created] => 2012-08-03 10:13:38 [groupid] => 10 [status] => 1 [lastlogintime] => 2012-08-03 10:14:07 [lastloginip] => 192.168.12.78 [logincount] => 2 ) )

    但代码放到服务器上就行不通了,登录老进不去,print_r($user)后:
    Array ( [0] => Array ( [id] => 9 [username] => aaaaaa [password] => 04b35cf604476680b22c4bb8b0888e4a [created] => 2012-08-03 10:13:38 [groupid] => 10 [status] => 1 [lastlogintime] => 2012-08-03 10:14:07 [lastloginip] => 192.168.12.78 [logincount] => 2 ) )

    由Key为Login直接变成下标数组了,代码里的$user['Login']自然无效了。。。。

    震惊了。。。这问题出在哪?
    6 条回复    1970-01-01 08:00:00 +08:00
    Semon
        1
    Semon  
       2012-09-06 20:14:01 +08:00
    session开了吗?session目录权限?
    yibin001
        2
    yibin001  
    OP
       2012-09-06 20:30:46 +08:00
    @Semon 看cakephp源代码看出了问题,因为cakephp用的是pdo,而Model类里用到了PDOStatement::getColumnMeta()方法,读取表名,最后用表名作为KEY拼成数组返回。
    很不幸,PDOStatement::getColumnMeta()只是一个实验性的方法,很有可能在某些版本被XX掉,恰好,服务器上的PDOStatement::getColumnMeta()方法无法读取表名,所以返回了下标数组。。。

    不明白为什么Cakephp与PDOStatement::getColumnMeta()这么耦合,虽然可以用下标获取数据,但官方压根没提到这一点,代码里都是用ModelName为key获取数据,这不是坑爹了么。。。

    唉。
    yibin001
        3
    yibin001  
    OP
       2012-09-06 20:31:47 +08:00
    相关源代码:
    /**
    * Builds a map of the columns contained in a result
    *
    * @param PDOStatement $results
    * @return void
    */
    public function resultSet($results) {
     $this->map = array();
     $numFields = $results->columnCount();
     $index = 0;
     
    while ($numFields-- > 0) {
     $column = $results->getColumnMeta($index);
     if (empty($column['native_type'])) {
     $type = ($column['len'] == 1) ? 'boolean' : 'string';
     } else {
     $type = $column['native_type'];
     }
     if (!empty($column['table']) && strpos($column['name'], $this->virtualFieldSeparator) === false) {
     $this->map[$index++] = array($column['table'], $column['name'], $type);
     } else {
     $this->map[$index++] = array(0, $column['name'], $type);
     }
     }
    }
    Semon
        4
    Semon  
       2012-09-06 23:49:26 +08:00
    还是用ZendFramework靠谱一些。
    PrideChung
        5
    PrideChung  
       2012-09-06 23:51:07 +08:00
    @Semon 貌似ZendFramework在PHP开发者之中口碑都不太好……
    Semon
        6
    Semon  
       2012-09-07 01:03:57 +08:00
    @PrideChung 仁者见仁,我用得挺好,主要是方便。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1849 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:19 · PVG 00:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.