onunix 2012-09-11 17:15:23 4811次浏览 10条回复 0 0 0

这句话为什么执行不成功:

$a=array("f1"=>"Dog","f2"=>"Cat","Month"=>"f3","f4"=>"Horse");
abc::model().insert($a);

错误提示: Fatal error: Call to undefined function insert()

模型文件不是应该可以插入的么?abc从CActiveRecord派生出来,而CActiveRecord有insert方法的啊。

  • 回复于 2012-09-11 17:31 举报

    abc::model()->insert($a);
    这样调用吧。你那种方式好像是Java调用的方式。
    建议使用save方法。

  • 回复于 2012-09-12 08:25 举报

    这里,PHP并没有把insert解释了成员函数,而是解释为全局函数,并试图与前面的model()进行字符串连接。改用楼上的->就OK了。

  • 回复于 2012-09-12 09:56 举报

    确实是编译通过了,但是真正执行的时候发现抛出了异常:active record 由于不是新的, 无法被新增到数据库.
    为什么会这样呢?
    既然不是新的,我就new一个吧,于是,改成

    try { 
        $pic=new abc;
        $data[f1]=5;
        $data[f2]="Dog";
        $data[f3]="Cat";
        $data[f4]="Dog";
        $data[f5]="Dog";
        $pic->attributes=$data;
        $pic->save();
    } 
    catch (Exception $e) 
    {   
        echo $e->getMessage();
    }
    

    没有再抛异常,但是转而查询oracle数据库,发现对应表是空的,记录没有插进去,这是怎么回事呢?

    如果将$data[f1]=5改成$data[ ‘f1’]=5 反而会报错CDbCommand 无法执行 SQL 语句:
    SQLSTATE[HY000]: General error: 928 OCIStmtExecute: ORA-00928: missing SELECT keyword

    下面是表的结构:

    create table abc
    (
       f1  Number(8) PRIMARY KEY ,
       f2 varchar(250)  ,
       f3  varchar(500)  ,       
       f4 varchar(500)  ,
       f5 varchar(500)  
    );
    

    并添加了触发器,为f1赋值。

  • 回复于 2012-09-12 10:05 举报

    像这种,你为什么用不Gii自动生成CRUD呢?

  • 回复于 2012-09-12 10:15 举报

    本来有扩展的swfupload,但是我使用时总是报错,最后只好放弃了,用了另外一个swfupload,可以传图片、视频,但是除了图片,还有一些其他的图片说明信息,图片说明信息得自己存入数据库。因此,存入图片信息就得自己写了。
    我原来也想这个应该不会很难,不就是往数据库里插条记录嘛,没有想到还插不进去。

  • 回复于 2012-09-12 11:37 举报

    ORACL数据库不了解。从你说的,你给PK 加了触发器以自动赋值,但是你的PHP中,为什么还有对f1赋值的内容?

  • 回复于 2012-09-12 12:10 举报

    这个触发器不会影响的,因为触发器是修改这个主键,防止重复。

  • 回复于 2012-09-12 13:48 举报

    我基本上可以得到结论了:
    正确的写法是:

    try { 
        $pic=new abc;
        $data[‘f1’]=5;
        $data[’f2‘]="Dog";
        $data[‘f3’]="Cat";
        $data[’f4‘]="Dog";
        $data[‘f5’]="Dog";
        $pic->attributes=$data;     
        $pic->save();
    } 
    catch (Exception $e) 
    {   
        echo $e->getMessage();
    }
    

    但是Yii和oracle之间的兼容性存在一些问题,导致会出现:

    SQLSTATE[HY000]: General error: 928 OCIStmtExecute: ORA-00928: missing SELECT keyword

    这个问题似乎无法解决,只能放弃了。

  • 回复于 2012-09-12 13:50 举报

    大概在构造sql时,Yii在数据库字段名称上加了引号,而在oracle中,如果这样,就会报错:
    SQLSTATE[HY000]: General error: 928 OCIStmtExecute: ORA-00928: missing SELECT keyword

    这个是我猜测的原因,估计是这样。

  • 回复于 2012-09-12 14:22 举报

    问题已经解决,如上所述:我的代码和写法是正确的,但是yii和oracle之间似乎有点不兼容,必须将本来是小写的,要变成大写,才能成功执行,这应该算作Yii的一个bug吧,希望后面解决。(莫非Yii无法识别oracle数据库中的大小写?统一转变成大写了?)

您需要登录后才可以回复。登录 | 立即注册