|
我一直在开发和使用项目管理系统PHP和PostgreSQL 8.4和Model-View-Controller编码。
8 y4 E$ ?) s$ ?# r为了让大家了解具体情况,我会从根本上解释(我会尽力而为)。& Z, x; s# ]7 v
我有一个类叫Actividad,该类扩展了数据库抽象类进行查询。
2 G# u5 g( ?+ X" d* Z class Actividad extends AbstraccionBD { ** * Constructor de la clase * * @param String $nom Nombre * @param String $des Descripci贸n * @param String $fi Fecha de inicio * @param String $fc Fecha de culminaci贸n * @param Float $pon Ponderaci贸n * @param Boolean $crit Cr铆tica * @param String $le Lugar Ejeucuci贸n * @param String $rec Recursos * @param Integer $pe Presupuesto estimado * @param String $est Estado * @param Integer $cal Calificaci贸n * @param Integer $peje Presupuesto ejecutado * @param Integer $asis Asistencia */ public function __construct($nom,$des,$fi,$fc,$pon,$crit,$le,$rec, $pe,$est,$cal,$peje,$asis) Asignamos todos los valores especificados al objeto $this->nombre = $nom; $this->descripcion = $des; $this->fecha_inicio = $fi; $this->fecha_culminacion = $fc; $this->ponderaci贸n = $pon; $this->es_critica = $crit; $this->lugar_ejecucion = $le; $this->recursos = $rec; $this->presupuesto_est = $pe; $this->estado = $est; $this->calificacion = $cal; $this->presupuesto_ejec = $peje; $this->asistencia = $asis; } public function insertarObjeto() Construimos el query de inserci贸n de datos en la tabla actividad; n贸tese que se llama al procedimiento almacenado sga.max_num_actividad(int,int) para determinar el n煤mero de la actividad que se esta insertando. $this->_query = "INSERT INTO sga.actividades " . "(proyecto,ejec_proyecto,num_actividad,nombre," . "descripcion,fecha_inicio,fecha_culminacion," . "ponderacion,critica,lugar_ejecucion,recursos," . "prepuesto_estimado,estado,calificacion," . "presupuesto_ejecutado,asistencia) " . "VALUES " . "($this->proyecto,$this->ejec_proyecto," . "sga.max_num_act($this->proyecto,$this->ejec_proyecto) 1," . "'$this->nombre'," . "'$this->descripcion','$this->fecha_inicio'," . "'$this->fecha_culminacion',$this->ponderaci贸n," . "$this->es_critica,'$this->lugar_ejecucion'," . "'$this->recursos',$this->presupuesto_est," . "'$this->estado',$this->calificacion," . "$this->presupuesto_ejec,$this->asistencia);"; Ejecutamos el query de inserci贸n $this->ejecutarQuery()(要求我每行保留80个字符。 d8 X, k$ z, X: Q: L6 u1 _
表定义 (不考虑FK):
5 E$ A3 A8 K! mCREATE TABLE sga.actividades( proyecto integer NOT NULL, ejec_proyecto integer NOT NULL, num_actividad smallint NOT NULL, nombre character varying descripcion character varying fecha_inicio date NOT NULL, fecha_culminacion date NOT NULL, ponderacion numeric (3,2) NOT NULL DEFAULT 0.00, critica boolean NOT NULL DEFAULT FALSE, lugar_ejecucion character varying recursos character varying(250), prepuesto_estimado integer, estado sga.estados_actividad NOT NULL,-- Dominio estados_actividad calificacion integer, presupuesto_ejecutado integer, asistencia smallint, CONSTRAINT actividad_pkey PRIMARY KEY(proyecto,ejec_proyecto,num_actividad));现在,我想做的是传递模型中的值,就像这样:4 P1 P8 L7 X0 M9 G5 {* Q2 H$ n
$a = new Actividad('Actividad1','DescA1','14-07-14','14-07-14',0. false',null,null,0,'ACT',null,null,null); Dont worry im using __set method $act->proyecto = 1; $act->ejec_proyecto = 1; $a->insertarObjeto();如您所见,我NULL由于这些值可以在数据库中传递到构造函数中null,到目前为止都很酷。
+ }. o" r+ u" o! g当我试图操作它时,有以下查询:
# i, ~/ K( s2 Z: {INSERT INTO sga.actividades (proyecto,ejec_proyecto, num_actividad,nombre, descripcion,fecha_inicio, fecha_culminacion, ponderacion,critica, lugar_ejecucion,recursos, prepuesto_estimado,estado, calificacion,presupuesto_ejecutado, asistencia) VALUES sga.max_num_act(1,1) 1Actividad1','DescA1','14-07- -07-14',0,false,ACT,,,,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,;;这是我的问题:这个查询永远不会运行,因为我用的是NULL来自PHP当关键字转换为连接疯狂中的字符串时,它是空的(字符串中没有内容),因此Postgres(如预期)发送语法(,,,)部分错误。( n/ O# m, Z6 y& ^, |" Q( T3 \
我需要‘用’NULL为了替换那些空字符串(),关键字被替换Postgres正确识别并插入它。/ n1 a. r, l7 d0 e' p* t! b e! [
同样,构造函数中传递的某些值也包装在内insertarObjeto()函数中的单引号(character varying)。
) ^7 N# N. N Q+ Z3 W/ n! j. p' }而在Postgres中则不同NULL。% U7 j, l; k! t: n \- `- ~4 A
我试图解决的问题一种方法是放置(N)条if-else语句,并在各种情况下连接正确的语句(这是未来维护代码和系统扩展的丑陋操作),如下所示:0 h4 w! Z" o- h5 j
if(is_null($this->asistencia)){ $this->_query .= "null,";}else{ $this->_query .= "$this->asistencia,";}这种方法的问题是有很多属性(而我的类远远超过这个属性)。
4 F3 `. M# N3 t我看到的另一种方法是在构造函数中null包括在单引号中。这适用于整数(我知道这是一个糟糕的解决方案),但由函数中包含的单引号引起的将在查询中抛出
3 y& @* ]1 O# I' Inull,这也是错误的,即:
- D* |5 |3 }* d1 H: @7 ZINSERT INTO sga.actividades (proyecto,ejec_proyecto, num_actividad,nombre, descripcion,fecha_inicio, fecha_culminacion, ponderacion,critica, lugar_ejecucion,recursos, prepuesto_estimado,estado, calificacion,presupuesto_ejecutado, asistencia) VALUES sga.max_num_act Actividad1','DescA1','14-07- -07-14',0,false,'null','null',0,'ACT',null ,null ,null );有更好的解决方案吗?(n)条if-else语句之外?
( O Y2 L/ |0 C1 |
2 w% u# k$ P' [9 Z' t& N2 ^ 解决方案: |
|