/*****************************************************************************/
/*** Clase tablaBd Version 0.2.2 ***/
/*****************************************************************************/
/*** obj = new TablaBD($conexionBD, $nombre_tabla) ***/
/*** Metodos: ***
*** boolean actualizarCampo($que_clave,$que_actualizar) ***
*** boolean crearCursor($clave_sort = "", $clave_cursor = "") ***
*** mixto leerCursor($$que_direccion) ***
*** array dameFila($que_clave); ***
*** array dameColumna($que_columna,$que_filtro = "") ***
*** integer dameFilasAfectadas() ***
*** boolean borrarFila($que_clave) ***
*** boolean insertarFila($que_datos); ***
*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/*** Historia de modificaciones en la funcci�n ***/
/*** 20/1/04 Inicio de la función ***/
/*** 24/02/04 El tratamiento de los entrecomillados de los campos y/o */
/*** valores se realiza mediante la llamada a las **/
/*** funciones estandar de DB quoteIdentifier y quoteSmart **/
/*** Requiere version 1.6 de DB ***/
/*** v 0.2.1 26/2/04 Se añade tratamiento de numero de filas afectadas ***/
/*** Control de errores en dameFila() ***/
/*** v 0.2.2 24/3/2004 Se añade control de errores en dame columna ***/
/*** Se añade control de la columna * en dame columna ***/
/*** v 0.2.3 11/5/2006 Modificar la cración de order by para que tenga en ***/
/*** cuenta la posibilidad de que se pase modificadores ***/
/*** com asc y/o desc ***/
/*** ***/
/*****************************************************************************/
/*** Por hacer: ***/
/*** - Validar que tanto la conexion pasadas como en nombre ***/
/*** de la tabla son válidos ***/
/*****************************************************************************/
/******************************************************************/
/*** necesita obj PEAR DB ***/
/*****************************************************************/
class TablaBd {
var $conexion_bd = null;
var $nombre_tabla = "";
var $cursor = null;
var $cursor_pos = 0;
var $num_filas_cursor = 0;
var $num_filas_afecta = 0;
/*** constructor del objeto ***/
function TablaBd ($que_ptr_bd,$que_tabla) {
$this->conexion_bd = $que_ptr_bd;
$this->nombre_tabla = $que_tabla;
}
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/*** Funciones Externas ***/
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************
*** boolean actualizarCampo($que_clave,$que_actualizar) ***
******************************************************************************
*** Actualiza el valor de una columna dada para una clave dada ***
******************************************************************************
*** Parametros: ***
*** clave: Array asociativo con clave = nombre del campo clave ***
*** y valor = valor de la clave ***
*** campos a modif: Array asociativo con nombre campo ***
*** y nuevo valor campo ***
*******************************************************************************
*** Valores devueltos por la funci�n ***
*** true si todo ha ido bien ***
*** false en otro caso ***
*******************************************************************************
*** Historia de modificaciones en la funcci�n ***
*** 19/1/04 Inicio de la función ***
*********************************************************************/
function actualizarCampo($que_clave,$que_actualizar) {
//echo "actualizarCampo
\n";
if ( ! is_array($que_clave)) {
return false;
}
// 24/2/04 Inicio
// $qu = 'UPDATE "' . $this->nombre_tabla . '" SET ';
//foreach($que_actualizar as $nombre_campo => $valor_campo) {
// $qu .= '"' . $nombre_campo . '" = ';
// $qu .= is_numeric($valor_campo) ? $valor_campo : "'" . $valor_campo . "'" ;
// $qu .= ', ';
//}
$qu = 'UPDATE ' .
$this->conexion_bd->quoteIdentifier($this->nombre_tabla) .
' SET ';
foreach($que_actualizar as $nombre_campo => $valor_campo) {
$qu .= $this->conexion_bd->quoteIdentifier($nombre_campo) . ' = ';
$qu .= $this->conexion_bd->quoteSmart($valor_campo);
$qu .= ', ';
}
// 24/2/04 Final
$qu = substr($qu,0,-2); // borrar el valor ", " del final
$qu .= $this->crearWhere($que_clave);
// $qu .="; commit;";
//echo "\$qu = $qu
\n";
$resultado = $this->ejecutarQuery($qu);
if ( $resultado == false ) {
return false;
}
return true;
}
/******************************************************************************
*** boolean crearCursor($clave_sort = "", $clave_cursor = "") ***
******************************************************************************
*** Crea un cursor global a la tabla actual ***
******************************************************************************
*** Parametros: ***
*** clavesort: Array con loscampos los que se quiere el sort ***
*******************************************************************************
*** Valores devueltos por la funci�n ***
*** true si va bien ***
*** false en otro caso ***
*******************************************************************************
*** Historia de modificaciones en la funcci�n ***
*** 19/1/04 Inicio de la función ***
*********************************************************************/
function crearCursor($clave_sort = "", $clave_cursor = "") {
//echo "Entro por crearCursor
\$clave_sort = $clave_sort
\$clave_cursor = $clave_cursor
";
//24/02/04
$query = 'select * from ' .
$this->conexion_bd->quoteIdentifier($this->nombre_tabla);
$query .= $this->crearWhere($clave_cursor);
if ($clave_sort == "") {
if ($clave_cursor != "") {
foreach ($clave_cursor as $nombre_campo => $valor_campo) {
$clave_sort[] = $nombre_campo;
}
}
}
$query .= $this->crearOrderBy($clave_sort);
//echo "\$query crear cursor: $query
\n";
$this->cursor_pos = -1; // la posicion 0 es válida
$resultado = $this->cursor = $this->ejecutarQuery($query);
$this->num_filas_cursor = $resultado->numRows();
//echo "\t Salgo de crear cursor
\n";
return true;
}
/******************************************************************************
*** mixto leerCursor($$que_direccion) ***
******************************************************************************
*** Lee una fila determinada del cusor actual ***
******************************************************************************
*** Parametros: ***
*** $que_direccion: Si es un integer señala una posicion absoluta ***
*** Si es un string señala una posicion relativa ***
*******************************************************************************
*** Valores devueltos por la funci�n ***
*** null -> Si se traspasa final de fichero o ***
*** false -> Ha habido errores o ***
*** array asociativo con los datos leidos ***
*******************************************************************************
*** Historia de modificaciones en la funcci�n ***
*** 19/1/04 Inicio de la función ***
*********************************************************************/
function leerCursor($que_direccion = "") {
if ( is_null($this->cursor) ) {
//echo "Cursor NULOOOOOOOOOOOOOOOOOO
";
$this->cursor = $this->crearCursor();
}
if ( is_string($que_direccion) ) {
switch ($que_direccion) {
case "inicio":
$nueva_pos = 0;
break;
case "siguiente":
$nueva_pos = $this->cursor_pos + 1;
break;
case "anterior":
$nueva_pos = $this->cursor_pos - 1;
break;
case "final":
$nueva_pos = $this->cursor->numRows() - 1;
break;
default:
$nueva_pos = $this->cursor_pos;
break;
}
}
else {
$nueva_pos = $que_direccion;
}
if ( $nueva_pos < 0 )
{
$nueva_pos = 0;
}
else
{
if ( $nueva_pos > $this->cursor->numRows() - 1 )
{
$nueva_pos = $this->cursor->numRows() - 1;
return null;
}
}
// echo "\$nueva_pos " . " $this->nombre_tabla " . "= $nueva_pos
";
$datos = $this->cursor->fetchRow(DB_FETCHMODE_ASSOC,$nueva_pos);
if (!$datos)
{
echo " Error en fectch del cursor
$datos";
return false;
}
$this->cursor_pos = $nueva_pos;
return $datos;
}
/*****************************************************************************
*** array dameFila($que_clave); ***
******************************************************************************
*** Devuelve en un array la columna especificada ***
******************************************************************************
*** Parametros: ***
*** ninguno ***
*******************************************************************************
*** Valores devueltos por la funci�n ***
*** array con los valores de la columna ***
*** o false si hay errores ***
***************************************************************************
*** Historia de modificaciones en la funcci�n ***
*** 20/1/04 Inicio de la función ***
*** 26/02/04 Añadir control de los errores
*********************************************************************/
function dameFila($que_clave) {
// 24/02/04
//$q = 'select * from "' . $this->nombre_tabla . '"';
$q = 'select * from ' .
$this->conexion_bd->quoteIdentifier($this->nombre_tabla);
$q .= $this->crearWhere($que_clave);
//echo "\$q dameFila: $q
\n";
// return $this->conexion_bd->getRow($q,DB_FETCHMODE_ASSOC);
$respuesta = $this->conexion_bd->getRow($q,DB_FETCHMODE_ASSOC);
if (DB::isError($respuesta)) {
echo "Error obteniendo fila.
";
echo " - Query:
$que_query
";
echo $respuesta->getMessage() . "
\n";
return false;
}
return $respuesta;
}
/*****************************************************************************
*** array dameColumna($que_columna,$que_filtro = "") ***
******************************************************************************
*** Devuelve en un array la columna especificada ***
******************************************************************************
*** Parametros: ***
*** ninguno ***
*******************************************************************************
*** Valores devueltos por la funci�n ***
*** array con los valores de la columna ***
*******************************************************************************
*** Historia de modificaciones en la funcci�n ***
*** 20/1/04 Inicio de la función ***
*** 24/3/2004 Se añade control de errores ***
*** Se añade control de la columna * ***
**************************************************************************/
function dameColumna($que_columna,$que_filtro = "") {
// 24/02/04
// $q = 'select "' . $que_columna . '" from "' . $this->nombre_tabla . '"';
$q = 'select ';
if ($que_columna != "*") {
$q .= $this->conexion_bd->quoteIdentifier($que_columna);
}
else {
$q .= '*';
}
$q .= ' from ';
$q .= $this->conexion_bd->quoteIdentifier($this->nombre_tabla);
$q .= $this->crearWhere($que_filtro);
// Si se pasa un asterisco como columna no se hace order by
if ($que_columna != "*") {
$q .= $this->crearOrderBy($que_columna);
}
//echo "\$q damecolumna: $q
\n";
$respuesta = $this->conexion_bd->getCol($q);
if (DB::isError($respuesta)) {
echo "Error obteniendo fila.
";
echo " - Query:
$q
";
echo $respuesta->getMessage() . "
\n";
return false;
}
return $respuesta;
}
/***************************************************************************
*** integer dameFilasAfectadas() ***
***************************************************************************
*** Devuelve eel numero de filas afectadas por el ***
*** ultima query. Si es una select devuelve 0 segun el manul (?) ***
*** Funciona bien con updates ***
***************************************************************************
*** Parametros: ***
*** ninguno ***
***************************************************************************
*** Valores devueltos por la funci�n ***
*** integer con el numero de filas afectas ***
***************************************************************************
*** Historia de modificaciones en la funcci�n ***
*** 26/2/04 Inicio de la función ***
*********************************************************************/
function dameFilasAfectadas() {
return $this->num_filas_afecta;
}
/******************************************************************************
*** boolean borrarFila($que_clave) ***
******************************************************************************
*** borra la fila cuya clave se pasa ***
******************************************************************************
*** Parametros: ***
*** array asociativo nombrecampoclave => valorclave del ***
*** la fila que se desea borrar ***
******************************************************************************
*** Valores devueltos por la función ***
*** true -> Fila borrada correctamente ***
*** flase -> Fila NO borrada ***
******************************************************************************
*** Historia de modificaciones en la funcci�n ***
*** 20/1/04 Inicio de la función ***
******************************************************************************/
function borrarFila($que_clave) {
//24/02/04
//$q = 'delete from "' . $this->nombre_tabla . '"';
$q = 'delete from ' .
$this->conexion_bd->quoteIdentifier($this->nombre_tabla);
$q .= $this->crearWhere($que_clave);
//echo "\$q borrarFila = $q
\n";
$resultado = $this->ejecutarQuery($q);
if ( $resultado == false ) {
return false;
}
return true;
}
/******************************************************************************
*** boolean insertarFila($que_datos); ***
******************************************************************************
*** añade una fila a la bd tabla con los datos pasados ***
******************************************************************************
*** Parametros: ***
*** array asociativo nombrecampoclave => valorclave del ***
*** la fila que se desea añadir ***
******************************************************************************
*** Valores devueltos por la funci�n ***
*** true si todo va bien ***
******************************************************************************
*** Historia de modificaciones en la funcci�n ***
*** 20/1/04 Inicio de la función ***
******************************************************************************/
function insertarFila($que_datos) {
//24/02/04
//$q = 'insert into "' . $this->nombre_tabla . '" ( ';
$q = 'insert into ' .
$this->conexion_bd->quoteIdentifier($this->nombre_tabla) . ' ( ';
$valores = ' values ( ';
// el �nico campo num�rico es el codigo_cliente que ya se ha
// inicializado m�s arriba.
// el resto de los campos son string y se ponen a blanco
foreach ($que_datos as $nombre_campo => $contenido)
{
//24/02/04
//$q .= '"' . $nombre_campo . '" , ';
//$valores .= is_numeric($contenido) ? $contenido . ', ' : "'" . $contenido . "', " ;
$q .= $this->conexion_bd->quoteIdentifier($nombre_campo);
$q.= ", ";
$valores .= $this->conexion_bd->quoteSmart($contenido);
$valores .= ", ";
}
/// Sustituir la �ltima coma por cierre de par�ntesis
$q = substr_replace($q," ) ",strlen($q) - 2,2);
/// Sustituir la �ltima coma por cierre de par�ntesis
$valores = substr_replace($valores,") ",strlen($valores) - 2,2);
$q .= $valores;
//echo "\$q insertar fila = $q
\n";
$resultado = $this->ejecutarQuery($q);
if ( $resultado == false ) {
return false;
}
return true;
}
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/*** Funciones Internas ***/
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
function crearWhere ($que_dato) {
if ( $que_dato == "" ) {
return "";
}
$where = "";
if ( is_array($que_dato) ) {
$primera = true;
reset($que_dato);
foreach($que_dato as $nombre_indice => $valor_indice) {
if ( $primera ) {
$where .= ' where ' ;
$primera = false;
}
else {
$where .= " and ";
}
//$where .= '"' . $nombre_indice . '" = ';
//$where .= is_numeric($valor_indice) ? $valor_indice : "'" . $valor_indice . "'" ;
$where .= $this->conexion_bd->quoteIdentifier($nombre_indice);
$where .= " = ";
$where .= $this->conexion_bd->quoteSmart($valor_indice);
}
}
return $where;
}
/*****************************************************************************/
function crearOrderBy ($que_dato) {
//echo " Creando order By con los siguiente datos:
\n\t";
//print_r($que_dato);
//echo "
\n";
if ( $que_dato == "" ) {
return "";
}
$orderby = ' order by ';
if ( is_array($que_dato) ) {
foreach($que_dato as $campo) {
$trozos = explode(' ', $campo);
$orderby .= $this->conexion_bd->quoteIdentifier($trozos[0]);
// Si hay más de una palabra es que llega un modificador (único posible desc/asc)
if ( isset($trozos[1]) ) {
$orderby .= ' ' . $trozos[1];
}
$orderby .= ', ';
}
$orderby = substr($orderby,0,-2); // borrar el valor ", " del final
}
else {
$trozos = explode(' ', $que_dato);
$orderby .= $this->conexion_bd->quoteIdentifier($trozos[0]);
// Si hay más de una palabra es que llega un modificador (único posible desc/asc)
if ( isset($trozos[1]) ) {
$orderby .= ' ' . $trozos[1];
}
}
return $orderby;
}
/******************************************************************************
*** boolean ejecutarQuery(); ***
******************************************************************************
*** Ejecuta una query dada ***
******************************************************************************
*** Parametros: ***
*** string con la query a ejecutar ***
******************************************************************************
*** Valores devueltos por la funci�n **
*** false si algo va mal ***
*** obj resultado si toda va bien ***
******************************************************************************
*** Historia de modificaciones en la funcci�n ***
*** 20/1/04 Inicio de la función ***
******************************************************************************/
function ejecutarQuery ($que_query) {
$respuesta = $this->conexion_bd->query($que_query);
if (DB::isError($respuesta)) {
echo "Error ejecutando query
";
echo "Query:
$que_query
";
echo $respuesta->getMessage() . "
\n";
return false;
}
$this->num_filas_afecta = $this->conexion_bd->affectedRows();
return $respuesta;
}
}
?>