Lunes, 22 Abril 2013 13:34

Selección múltiple de registros y transacciones PDO

Escrito por 
Valora este artículo
(1 Votar)

Debido a la frecuencia con que me preguntan como enviar una selección multiple de elementos de un formulario, he decido crear este artículo para aclarar esas dudas, vamos a crear un formulario en el cual se hará la seleccion utilizando checkbox's, un select de selección múltiple y un ejemplo de eliminado múltiple utilizando transacciones.

 

Primero crearemos nuestro formulario, esta es una vista que nos permite testear lo que estamos enviando:


<h2>Testing</h2>
{if isset($data.producto)}
    <p><strong>Productos seleccionados</strong></p>
    {foreach from=$data.producto item=pr}
        {$pr}<br>
    {/foreach}
    <hr>
{/if}
{if isset($data.categoria)}
    <p><strong>Categorías seleccionadas</strong></p>
    {foreach from=$data.categoria item=ct}
        {$ct}<br>
    {/foreach}
    <hr>
{/if}
<form method="post">
    <p><strong>Ejemplo checkbox</strong></p>
    <p>
        Producto 1: <input name="producto[]" type="checkbox" value="producto1"><br>
        Producto 2: <input name="producto[]" type="checkbox" value="producto2"><br>
        Producto 3: <input name="producto[]" type="checkbox" value="producto3"><br>
        Producto 4: <input name="producto[]" type="checkbox" value="producto4"><br>
        Producto 5: <input name="producto[]" type="checkbox" value="producto5">
    </p>
    
    
    <p><strong>Ejemplo select</strong></p>
    
    <select multiple="multiple" name="categoria[]" size="6">
        <option value="categoria1">Categoria 1</option>
        <option value="categoria2">Categoria 2</option>
        <option value="categoria3">Categoria 3</option>
        <option value="categoria4">Categoria 4</option>
        <option value="categoria5">Categoria 5</option>
        <option value="categoria6">Categoria 6</option>
    </select>
    
    <p>
        <input type="submit" value="enviar">
    </p>
</form>

Noten que los nombres de los elementos estan terminados en corchetes "[]" (producto[]  y categoria[]) indicando que es un arreglo de valores el que se está enviando como parámetro del formulario, quiere decir que los elementos $_POST['categoria'] y $_POST['producto'] son arreglos y deben tratarse como arreglos.

Luego de esto podemos realizar operaciones sobre estos, veamos como eliminaríamos varios registros seleccionados, este sería nuestro controlador:

<?php

/* testController.php */ class testController extends Controller { private $modelo; public function __construct() { parent::__construct(); $this->modelo = $this->loadModel("test"); } public function index() { if($_POST){ $this->_view->assign("data", $_POST); $categorias = $this->getPostParam("categoria"); $productos = $this->getPostParam("producto");
/* realizar operación de eliminar registros */ if(count($categorias)){ $this->modelo->eliminarCategorias($categorias); } if(count($productos)){ $this->modelo->eliminarProductos($productos); } } $this->_view->renderizar("tu-vista"); } } ?>

En el modelo utilizaremos transacciones pero al igual pueden hacerlo recorriendo el arreglo para enviar el query para eliminar:

<?php
/* testModel.php */
class testModel extends Model
{
    public function __construct() 
    {
        parent::__construct();
    }
    
    public function eliminarCategorias(array $ids)
    {
        try {  
            $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->_db->beginTransaction();
            
            foreach ($ids as $id){
                $this->_db->exec("DELETE FROM `categorias` WHERE `id` = '$id'");
            }
            
            $this->_db->commit();    
        } 
        catch (Exception $e) {
            $this->_db->rollBack();
            echo $e->getMessage();
        }
    }
    
    public function eliminarProductos(array $ids)
    {
        try {  
            $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->_db->beginTransaction();
            
            foreach ($ids as $id){
                $this->_db->exec("DELETE FROM `productos` WHERE `id` = '$id'");
            }
            
            $this->_db->commit();    
        } 
        catch (Exception $e) {
            $this->_db->rollBack();
            echo $e->getMessage();
        }
    }
}
?>

Y eso es todo amigos, así de sencillo.

Gracias y un saludo a todos

Leer 65227 veces Modificado por última vez en Jueves, 02 Mayo 2013 00:07

13 comentarios

  • Enlace al Comentario Jaisiel Delance Miércoles, 09 Octubre 2013 22:03 publicado por Jaisiel Delance

    Hola zully,
    debes incluir el archivo de adodb en el index y hacer las conexiones directamente:

    - En el constructor de la clase Model:
    $this->_db = NewADOConnection(DB_DRIVER);
    $this->_db->connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);

  • Enlace al Comentario Zully Alarcon Viernes, 04 Octubre 2013 20:22 publicado por Zully Alarcon

    Hola Jaisiel

    Soy nueva en esto de la programacion mvc, pero estoy siguiendo tus tutoriales que me parecen excelente, sin embargo, estoy intentando hacer una conexion a una base de datos oracle y estoy usando la libreria Adodb, sin embargo cuando modifico el archivo Database.php no me muestra nada, o sino el error Virtual class, not instance he aqui el codigo que tengo

    class Database extends ADOConnection
    {
    private $_conn;

    public function __construct() {
    parent::__construct();
    $this->conectarDB();
    }
    public function conectarDB()
    {
    $this->_conn = NewADOConnection(DB_DRIVER);
    $this->_conn->PConnect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    }
    }

  • Enlace al Comentario Edgard Decena Miércoles, 18 Septiembre 2013 20:46 publicado por Edgard Decena

    Hola Jaisiel, primero agradecerte por los excelentes video tutoriales de MVC con Php, con los cuales he aprendido muchísimo, al punto de estar desarrollando mi propio Framework basado en tus enseñanzas. Lo segundo, es felicitarte por tú altruismo al compartir tus conocimientos con la comunidad. Juntos sabemos más. :-)
    Ando en la búsqueda de alguna librería Php/Jquery que me permita implementar una vista Maestro-Detalle, siempre tan necesario en cualquier Framework. Espero poder contar con tu aporte. Un gran abrazo.

  • Enlace al Comentario Nelson Viernes, 26 Julio 2013 15:18 publicado por Nelson

    Excelente!! gracias de verdad esto ayuda mucho

  • Enlace al Comentario Julian_254@hotmail.com Martes, 02 Julio 2013 21:07 publicado por Julian_254@hotmail.com

    amigo dlancedu me podria ayudar como hacer una consulta de tres tablas con php:
    =================================
    1er tabla es: alumnos
    id_alu
    cod_alu
    nombre
    ===============================
    2do tabla es: notas
    id_notas
    cod_alu
    cod_curso
    cod_turno
    cod_seccion
    nota_1
    nota_2
    nota_3
    nota_4
    promedio

    =============================
    3er tabla es : planestudio
    id_plan
    cod_curso
    cur_mon
    nivel
    credito

    ==================

    yo quiero que me muestre la siguiente información:

    codigo del alumno, nombre, codigo del cuso, nombre del curso, y promedio final

  • Enlace al Comentario Jaisiel Delance Miércoles, 05 Junio 2013 11:47 publicado por Jaisiel Delance

    Entre a la web hice un par de clics y veo que funciona

  • Enlace al Comentario Jaisiel Delance Miércoles, 05 Junio 2013 11:44 publicado por Jaisiel Delance

    Ese problema reside en el hosting en la sobreescritura de url, debes tratarlo con el soporte del hosting.

  • Enlace al Comentario Richard Jhon Tafur Flores Sábado, 01 Junio 2013 15:08 publicado por Richard Jhon Tafur Flores

    Por favor necesito ayuda, estoy usando el archivo .htaccess que tienes en los videos, pero no me funciona. Subi mi aplicacion a la web de un subdominio que me ha dado 000webhost.com y solo me muestra la pagina index, he probado esta condicion:
    if(isset($_GET['url'])), y nunca entra.

    Por favor necesito saber como puedo resolver este problema. En modo local funciona normal (localhost)

    cuando cargo la pagina (de prueba que realice) de esta forma (http://anroma.webatu.com/), me da respuesta del index, pero cuando le adiciono lo siguiente: (http://anroma.webatu.com/index), no entra y me bota del subdominio de 000webhost.com.

    ayuda por favorrrrrrrrr

  • Enlace al Comentario Diego | Seguretat Lunes, 20 Mayo 2013 14:54 publicado por Diego | Seguretat

    Gracias por este aporte! Sería grandioso hacer una serie de tutoriales sobre la clase PDO. Yo creía que sabía pero siempre que investigo veo las mismas operaciones hechas en formas muy distintas.

    Saludos desde Argentina.

  • Enlace al Comentario John Aponte Viernes, 17 Mayo 2013 01:00 publicado por John Aponte

    Jaisiel y como realizo un update multiple, por ejemplo tengo una tabla categorias con un id_categoria y id_producto, cada producto puede pertencer a varias categorias, cuando edito el producto envio un array con los id de categoria, pero como hago para realizar el update en este caso.

Deja un comentario

Asegúrate de llenar la información requerida marcada con (*). No está permitido el Código HTML.

Categorías

hosting joomla