*
  • str_tabla - Contiene el nombre de la tabla a la que hace referencia.
  • *
  • obj_conexion - El objeto conexión por el que se ha accedido a la tabla
  • *
  • $obj_errorBD - Referencia al objeto de error global
  • * * * @link http://www.gvhidra.gva.es * @copyright Copyright (C) 2006 Generalitat Valenciana. * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License v.2 * @version $Id: IgepPersistencia.php,v 1.39 2019-05-05 15:23:13 belenguer_jor Exp $ * @author David Pascual * @author Keka Bermejo * @author Verónica Navarro * @author Raquel Borjabad * @author Toni Felix * @author Jorge Belenguer * * @package gvHidra */ class IgepPersistencia { /** * tabla a modificar * * @var string $str_tabla */ var $str_tabla; /** * objeto conexion * * @var IgepConexion $obj_conexion */ var $obj_conexion; /** * variable de error * * @var object $obj_errorNegocio */ var $obj_errorBD; /** * Indica si la conexión se realiza mediante PDO. * * @var bool $is_pdo */ private $is_pdo = FALSE; /** * Constructor * * @access public * @param IgepConexion $obj_conexion * @param string $str_tabla */ public function __construct ($obj_conexion, $str_tabla) { //Instanciamos la clase global $g_error; $this->obj_errorBD =& $g_error; $this->obj_conexion = $obj_conexion; $this->str_tabla = $str_tabla; (get_class($obj_conexion)=='PDO') ? $this->is_pdo=TRUE : $this->is_pdo=FALSE; } /** * This magic method is executed prior to any serialization of the object * * @return array */ public function __sleep() { if ( $this->is_pdo ) { unset($this->obj_conexion); $this->obj_conexion = null; } return array_keys(get_object_vars($this)); } /** * Retorna el nombre de la tabla a la que hace referencia. * * @access public * @return string */ public function getTabla() { return $this->str_tabla; } /** * Dada una matriz asociativa de datos realiza los INSERTs en la tabla * asociada al objeto. * * @access public * @param array $m_datos Matriz de vectores asociativos por nombres de columna / valor */ public function insertar($m_datos) { $query = ''; $numFilas = 0; if (is_array($m_datos)) { $numFilas = count($m_datos); } if ($numFilas<1) { IgepDebug::setDebug(DEBUG_IGEP, 'IgepPersistencia: Se ha intentado ejecutar INSERT con una matriz de datos vacía.'); return; } //Para cada dato $numInsercion = 0; foreach ($m_datos as $v_filaDatos) { $numInsercion++; $query = "INSERT INTO {$this->str_tabla}"; $queryKeys =' ('; $queryValues =" \nVALUES ("; foreach ($v_filaDatos as $colName=>$value) { $queryKeys.= $colName.', '; if ( $value=='' || is_null($value) ) $queryValues.= 'null, '; else $queryValues.= "'$value', "; }//Fin for columnas $queryKeys = substr_replace ($queryKeys, ') ', -2, 2); $queryValues = substr_replace ($queryValues, ') ', -2, 2); $query .=$queryKeys.$queryValues; //Debug:Indicamos que ejecutamos la consulta IgepDebug::setDebug(DEBUG_IGEP, "".__CLASS__ . ": Ejecutamos inserción ({$numInsercion} de {$numFilas}):
    {$query}"); try { $res = $this->obj_conexion->exec($query); } catch (Exception $e) { //Excepciones PDO $this->obj_errorBD->setError('IGEP-1', 'IgepPersistencia.php', "'Insertar ($numInsercion de $numFilas)", $e->getMessage()); return; } //Tratamiento de errores if ((!$this->is_pdo AND PEAR::isError($res)) OR ($this->is_pdo AND $res===FALSE)) { $this->obj_errorBD->setError('IGEP-1', 'IgepPersistencia.php', "'Insertar ($numInsercion de $numFilas)", $res); return; } }//Fin for filas }//Fin insertar /** * Dada una tupla o fila de la tabla realiza el DELETE. La * tupla debe ser un array asociativo del modo ["campo"] * =>"valor". Esta función recibe la fila a borrar porque * realiza una comprobación de consistencia (se borra la * tupla siempre y cuando alguien no la haya modificado). * * @access public * @param array $v_filaDatosWhereConcurrencia */ // REDMINE #23202 $v_filaDatosWhereConcurrencia // $v_filaDatosWhereConcurrencia, que contendrá los campos a añadir al where y no encontrarse con problemas de concurrencia public function borrar($v_filaDatosWhereConcurrencia) { $str_WHERE = ''; if (is_array($v_filaDatosWhereConcurrencia) && (count($v_filaDatosWhereConcurrencia) > 0)) { foreach($v_filaDatosWhereConcurrencia as $prop => $val) { if ($str_WHERE != '') { $str_WHERE .= ' AND '; } $str_WHERE .= $prop; if (gettype($val) == "string") { if($val != "") { $str_WHERE .= "='".$val."'"; } else { $str_WHERE .= " is null"; } } else { if($val != "") { $str_WHERE .= "=".$val; } else { $str_WHERE .= " is null"; } } }//FIN foreach $str_WHERE = " \nWHERE {$str_WHERE}"; } // Se monta la query con los datos obtenidos $consulta = "DELETE FROM {$this->str_tabla} {$str_WHERE}"; //Debug:Indicamos que ejecutamos la consulta IgepDebug::setDebug(DEBUG_IGEP,"". __CLASS__ . ": Ejecutamos borrado:
    {$consulta}"); try { $res = $this->obj_conexion->exec($consulta); } catch (Exception $e) { //Excepciones PDO $this->obj_errorBD->setError("IGEP-2",'IgepPersistencia.php',"borrar",$e->getMessage(),$consulta); return; } //Tratamiento de errores if ((!$this->is_pdo AND PEAR::isError($res)) OR ($this->is_pdo AND $res===FALSE)) $this->obj_errorBD->setError("IGEP-2",'IgepPersistencia.php',"borrar",$res,$consulta); else { //Comprobamos si existe error de concurrencia. if ($res==0) $this->obj_errorBD->setError('IGEP-4','IgepPersistencia.php','borrar','','Error de Concurrencia: '.$consulta); } }// Fin de borrar /** * Dada una tupla o fila de la tabla realiza el UPDATE. Recibe * dos parámetros; uno es la tupla con los nuevos datos y otro es * la tupla con los datos que fueron visualizados.Esto se debe a * que realiza una comprobación de consistencia (se actuliza la * tupla siempre y cuando alguien no la haya modificado). Los dos * parámetros son arrays asociativos de la forma ["campo"]=>"valor". * * @access public * @param array $v_filaDatos * @param array $v_filaDatosAntiguos: Datos con los valores anteriores a los nuevos cambios en los campos * @param array $v_filaDatosWhereConcurrencia: Campos que se aplicarán en el WHERE del UPDATE y evitar los problemas de concurrencia */ // REDMINE #23202 $v_filaDatosWhereConcurrencia // Se necesitan dos arrays, el de datos antiguos para comparar si ha habido cambios, y el, m_datosWhereConcurrencia, que contendrá los campos a añadir al where y no encontrarse con problemas de concurrencia public function actualizar($v_filaDatos, $v_filaDatosAntiguos, $v_filaDatosWhereConcurrencia) { // Definimos el SET del UPDATE $str_SET = ''; foreach($v_filaDatos as $prop => $val) { if( $v_filaDatosAntiguos[$prop]!==$val || (!isset($v_filaDatosAntiguos[$prop]) && isset($val)) ) { if ($str_SET != '') { $str_SET .= ' ,'; } $str_SET .= $prop; if (gettype($val) == "string") { if($val != "") { $str_SET .= "='".$val."'"; } else { $str_SET .= "= null"; } } else { if($val != "") { $str_SET .= "=".$val; } else { $str_SET .= "= null"; } } } }//FIN foreach // Definimos el WHERE del UPDATE $str_WHERE = ''; if (is_array($v_filaDatosWhereConcurrencia) && (count($v_filaDatosWhereConcurrencia) > 0)) { foreach($v_filaDatosWhereConcurrencia as $prop => $val) { if ($str_WHERE != '') { $str_WHERE .= ' AND '; } $str_WHERE .= $prop; if (gettype($val) == 'string') { if($val != '') { $str_WHERE .= "='".$val."'"; } else { $str_WHERE .= ' is null'; } } else { if($val != '') { $str_WHERE .= '='.$val; } else { $str_WHERE .= ' is null'; } } }//FIN foreach $str_WHERE = " \nWHERE {$str_WHERE}"; } // Ejecutamos la sentencia de Actualización if ($str_SET !='') { $consulta = "UPDATE {$this->str_tabla} SET {$str_SET} {$str_WHERE}"; //Debug:Indicamos que ejecutamos la consulta IgepDebug::setDebug(DEBUG_IGEP, __CLASS__ . ": Ejecutamos actualización:
    {$consulta}"); try { $res = $this->obj_conexion->exec($consulta); } catch (Exception $e) { //Excepciones de PDO $this->obj_errorBD->setError('IGEP-3','IgepPersistencia.php','actualizar',$e->getMessage(), $consulta); return; } //Errores de pear o pdo if ((!$this->is_pdo AND PEAR::isError($res)) OR ($this->is_pdo AND $res===FALSE)) $this->obj_errorBD->setError('IGEP-3','IgepPersistencia.php','actualizar',$res, $consulta); else { //Comprobamos si existe error de concurrencia. if ($res==0) { $this->obj_errorBD->setError('IGEP-4','IgepPersistencia.php','actualizar','','Error de Concurrencia:
    '.$consulta.'
    '); } } }//if de condición no vacia }//FIN de actualizar }//FIN clase IgepPersistencia ?>