2017-03-31 7 views
0

ているとき、私はコントローラがデータを取得し、それをクラスに渡す配列に変換するPostgresqlのテキストフィールドは、彼らがヌル

CREATE TABLE public.art_movimientos 
(
    cmovimiento bigint NOT NULL DEFAULT nextval('art_movimientos_cmovimiento_seq'::regclass), 
    tipo character varying(3) NOT NULL, -- Tipos de Valores:... 
    fecha_mov timestamp without time zone NOT NULL, 
    documento integer NOT NULL, 
    control integer, 
    fecha_doc timestamp without time zone NOT NULL, 
    corden integer NOT NULL DEFAULT 0, 
    calmacen integer NOT NULL, 
    calmacen2 integer, 
    status character varying(13) NOT NULL DEFAULT 'PENDIENTE'::bpchar, -- PENDIENTE... 
    donado integer NOT NULL DEFAULT 0, 
    monto_mov numeric(11,2) NOT NULL DEFAULT 0.00, 
    monto_desc numeric(11,2) NOT NULL DEFAULT 0.00, 
    monto_total numeric(11,2) NOT NULL DEFAULT 0.00, 
    observacion text, 
    casiento integer, 
    crea_user character varying(25), 
    crea_date timestamp without time zone, 
    mod_user character varying(25), 
    mod_date timestamp without time zone, 
    cproveedor integer NOT NULL DEFAULT 0, 
    CONSTRAINT pk_cmovimiento_art_movimientos PRIMARY KEY (cmovimiento) 
    USING INDEX TABLESPACE sistema_index, 
    CONSTRAINT fk_calmacen_art_movimientos FOREIGN KEY (calmacen) 
     REFERENCES public.almacen (calmacen) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE RESTRICT, 
    CONSTRAINT ck_donado_art_movimientos CHECK (donado = ANY (ARRAY[0, 1])), 
    CONSTRAINT ck_monto_total_art_movimientos CHECK (monto_total > 0::numeric AND monto_total >= monto_mov), 
    CONSTRAINT ck_status_art_movimientos CHECK (status::text = ANY (ARRAY['PENDIENTE'::character varying, 'PROCESADO'::character varying, 'APROBADO'::character varying, 'CONTABILIZADO'::character varying]::text[])), 
    CONSTRAINT ck_tipo_art_movimientos CHECK (tipo::text = ANY (ARRAY['AJE'::character varying, 'AJS'::character varying, 'SI'::character varying, 'CSM'::character varying, 'COI'::character varying, 'COM'::character varying, 'DEV'::character varying, 'TRF'::character varying]::text[])) 
) 
WITH (
    OIDS=FALSE 
); 

art_movimientosと呼ばれるテーブルを持っている「」を取得しますDBクラスは関数を持ち、別の関数を呼び出して結果を返します。

public function new_mov($array){ 
      return $mov = $this->db->procedure("insert_art_mov",$array); 
     } 
... 
public function procedure($procedure=false,$rows=false){ 
     $response=array(); 
     if($procedure==false){ 
      $response="Query is Empty!"; 
     }else{ 
      $sql = "SELECT ".$procedure."("; 
      for ($i=1; $i<=count($rows); $i++){ 
       $sql .= "$".$i.","; 
      } 
      $sql = substr($sql,0,-1); 
      $sql .= ")"; 
      //echo $sql; 
      $res = pg_prepare($this->linkid, "my_query", $sql); 
      $res = @pg_execute($this->linkid, "my_query", $rows); 
      if($res){ 
       while($consF=pg_fetch_assoc($res)) 
        array_push($response,$consF[$procedure]); 
      }else{ 
       array_push($response,"ERROR"); 
       array_push($response,$this->validateOperation()); 
      } 
      $sql = sprintf('DEALLOCATE "%s"',pg_escape_string("my_query")); 
      if(!pg_query($sql)) { 
       die("Can't query '$sql': " . pg_last_error()); 
      } 
      return $response; 
     } 
    } 

次に、私はProce DB:

CREATE OR REPLACE FUNCTION public.insert_art_mov(...IN _observacion text,..) 
INSERT INTO art_movimientos(tipo,fecha_mov,documento,control,fecha_doc,corden,cproveedor,calmacen,status,donado,monto_mov,monto_desc,monto_total,observacion,crea_user) 
      VALUES(_tipo,NOW(),_documento,_control,_fecha_doc,_corden,_cprov,_calmacen,'PENDIENTE',_donado,MONTO_MOV,_monto_desc,MONTO_TOT,_observacion,_crea_user) RETURNING cmovimiento INTO new_cmov; 

しかし、observacionの表で私は "(単純なcuotes)を参照してください、なぜ私は知っていますか?

答えて

1

空の文字列をチェックしないため、一重引用符が表示されます。私がお勧めしたいのは、これも同様に、すべての文字列フィールドに対して、関数に渡してデータまたはNULLのいずれかを返すことです。

DICLAIMER:ハーフ答えが、ほとんどのガイド:)

バックエンドで追加する必要がある文字列があるとき、あなたは以下の機能を試すことができます。

function chech_string ($str) { 
    return (0 != strlen($str)) ? $str : NULL; 
} 

それとも、あなたの文字列が

のようになります。終わりに

$sql = "INSERT INTO table(col1, col2) VALUES ('; 

if (0 != strlen($str1)) 
    $sql .= "'$str1'"; 
else 
    $sql .= "NULL"; 

if (0 != strlen($str2)) 
    $sql .= "'$str2'"; 
else 
    $sql .= "NULL"; 

    $sql .= ')'; 

に従うようにSQL文字列を作成します

$sql = "INSERT INTO table(col1, col2) VALUES ('STR1', 'STR2')"; 
OR 
$sql = "INSERT INTO table(col1, col2) VALUES ('STR1', NULL)"; 

だからあなたは、フロントエンドのために、あなたの手順と同様

を作成するには、このmethingを使用することができます。

<input type="text" value="<?php echo (0 != strlen($col_val)) ? $col_val : '' ?>"/> 

あなたがフロントエンドに必要な結果が得られます

+0

しかし、私はNULLSまたは単純な引用符( '')だけのフィールドを空にしたくない – JuJoGuAl

+1

データベースがNULLSか空文字列を返していますか? postgresqlはemoty文字列として格納できるので、どちらのcasでもフロントエンドで同じロジックを使用できます。 value = '<?php echo(0!= strlen($ col_val))? $ col_val: ''?> ' フロントエンドに必要な結果を与える – CAllen

+0

私のフロントエンドは何も表示しませんが(空の値)、必要なクエリがあればデータなしで「observaciones」を選択しますか? SELECT * FROM art_movimientosどこobservaciones = ''ですか? – JuJoGuAl