回答

收藏

如何从PHP向Postgres插入null

技术问答 技术问答 182 人阅读 | 0 人回复 | 2023-09-12

我一直在开发和使用项目管理系统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 ^    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则