El concepto CRUD está es­tre­cha­me­n­te vinculado a la gestión de datos digitales. CRUD hace re­fe­re­n­cia a un acrónimo en el que se reúnen las primeras letras de las cuatro ope­ra­cio­nes fu­n­da­me­n­ta­les de apli­ca­cio­nes pe­r­si­s­te­n­tes en sistemas de bases de datos:

  • Create (Crear registros)
  • Read bzw. Retrieve (Leer registros)
  • Update (Ac­tua­li­zar registros)
  • Delete bzw. Destroy (Borrar registros)

En pocas palabras, CRUD resume las funciones re­que­ri­das por un usuario para crear y gestionar datos. Varios procesos de gestión de datos están basados en CRUD, en los que dichas ope­ra­cio­nes están es­pe­cí­fi­ca­me­n­te adaptadas a los re­qui­si­tos del sistema y de usuario, ya sea para la gestión de bases de datos o para el uso de apli­ca­cio­nes. Para los expertos, las ope­ra­cio­nes son las he­rra­mie­n­tas de acceso típicas e in­di­s­pe­n­sa­bles para comprobar, por ejemplo, los problemas de la base de datos, mientras que para los usuarios, CRUD significa crear una cuenta (créate) y uti­li­zar­la (read), ac­tua­li­zar­la (update) o borrarla (delete) en cualquier momento. De­pe­n­die­n­do de la co­n­fi­gu­ra­ción regional, las ope­ra­cio­nes CRUD pueden im­ple­me­n­tar­se de di­fe­re­n­tes maneras, como lo muestra la siguiente tabla:

CRUD-Operation SQL RESTful HTTP XQuery
Create INSERT POST, PUT insert
Read SELECT GET, HEAD copy/modify/return
Update UPDATE PUT, PATCH replace, rename
Delete DELETE DELETE delete
Dominios web
Compra y registra tu dominio ideal
  • Domina el mercado con nuestra oferta 3x1 en dominios
  • Función Domain Connect para una co­n­fi­gu­ra­ción DNS si­m­pli­fi­ca­da gratis
  • Registro privado y gratis para mayor seguridad

Fra­me­wo­r­ks CRUD: capa de acceso a las bases de datos

Si los objetos in­di­vi­dua­les son vi­sua­li­za­dos por medio de una interfaz gráfica y mo­di­fi­ca­dos con las llamadas ope­ra­cio­nes CRUD, entonces se habla de un framework CRUD o de un CRUD grid. Por lo general, se trata de in­te­r­fa­ces HTML. Un framework CRUD demanda varios pasos de tra­n­sac­ción, de forma que los datos no se recogen una vez se han in­tro­du­ci­do, sino que es necesario pulsar la opción “Guardar” o “Continuar”. Las ope­ra­cio­nes de un framework CRUD pueden aplazarse para ser eje­cu­ta­das en di­fe­re­n­tes plazos, sin que los datos de dichos periodos de tiempo se bloqueen para otros usuarios. Este hecho resulta de gran im­po­r­ta­n­cia para sistemas mu­l­tiu­sua­rio, pues permite que varias personas lean los mismos datos al mismo tiempo.

Para llevar a cabo las ope­ra­cio­nes se utilizan las de­no­mi­na­das capas de pe­r­si­s­te­n­cia, que, por lo general, pueden ser im­ple­me­n­ta­das o están co­n­te­ni­das en forma de ex­te­n­sio­nes (módulos) en el framework. Estas rompen con la re­pre­se­n­ta­ción re­la­cio­nal y tabular de la totalidad de los datos para, en su lugar, pre­se­n­tar­los en un nivel orientado a objetos. Los fra­me­wo­r­ks CRUD facilitan el acceso al sistema de bases de datos y son uti­li­za­dos tanto en el de­sa­rro­llo como en el uso de apli­ca­cio­nes. Existen numerosos fra­me­wo­r­ks con un concepto CRUD basados en di­fe­re­n­tes lenguajes y pla­ta­fo­r­mas. A co­n­ti­nua­ción, pre­se­n­ta­mos algunos ejemplos:

Lenguaje o pla­ta­fo­r­ma Framework
Java JDBC (The Java Database Co­n­ne­c­ti­vi­ty), Hibernate, JBoss Seam, Isis
PHP Yii, CakePHP, Zikula, Symfony, TYPO3 Flow
Perl Catalyst, Gantry
Python Django, SQ­LA­l­che­my, web2py
Groovy Grails
.NET NHi­be­r­na­te, ADO.NET/Entity Framework
Ruby Ruby on Rails
Ja­va­S­cri­pt Backbone.js, AngularJS

Cómo de­sa­rro­llar un CRUD PHP grid para tu base de datos

En la siguiente parte de este artículo te mo­s­tra­re­mos cómo crear una interfaz de arranque para MySQL, el sistema de base de datos más utilizado, que permita el acceso a través ope­ra­cio­nes CRUD. Adi­cio­na­l­me­n­te podrás crear la operación “create”.  Para manipular la base de datos se utiliza, en este caso, el lenguaje de script del lado del servidor PHP y la extensión PHP Data Objects (PDO).

1. El primer paso consiste en crear una tabla de base de datos simple que pueda ser ma­ni­pu­la­da con ope­ra­cio­nes CRUD a lo largo de este tutorial. Para ello, importa la siguiente tabla de ejemplo en tu base de datos MySQL:

CREATE TABLE `customers` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 100 ) NOT NULL ,
`email` VARCHAR( 100 ) NOT NULL ,
`mobile` VARCHAR( 100 ) NOT NULL
) ENGINE = INNODB;

La tabla se utiliza para recopilar in­fo­r­ma­ción del usuario como nombre, correo ele­c­tró­ni­co y número de teléfono. A cada entrada se le asigna au­to­má­ti­ca­me­n­te una clave principal (AUTO_INCREMENT PRIMARY KEY), es decir un ide­n­ti­fi­ca­dor único.

2. A co­n­ti­nua­ción, es necesario regular las co­ne­xio­nes de apertura y de cierre de la base de datos. Crea un archivo PHP con el nombre database.php y añade la siguiente secuencia de comandos con la clase “Database” para gestionar las co­ne­xio­nes de la base de datos.

<?php
class Database 
{
private static $dbName = 'nombre_de_la_basededatos'; 
private static $dbHost = 'localhost';
private static $dbUsername = 'nombre_de_usuario';
private static $dbUserPassword = 'contraseña';
private static $cont = null;
public function __construct() {
die('Init-Función no permitida');
}
public static function connect() {
// Permitir solo una conexión para la totalidad del acceso
if ( null == self::$cont )
{
    try
    {
        self::$cont = new PDO( "mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword);
    }
    catch(PDOException $e)
    {
        die($e->getMessage());
    }
} 
return self::$cont;
}
public static function disconnect()
{
self::$cont = null;
}
}

Para que puedas utilizar la clase definida en el documento y lograr el acceso a la base de datos con PDO, necesitas los valores exactos de los elementos $dbName (nombre de la base de datos utilizada), $dbHost (nombre del host donde se ejecutará la base de datos, por lo general localhost como en el ejemplo), $dbU­se­r­na­me (nombre del usuario que accede) y $dbU­se­r­Pa­s­s­wo­rd (co­n­tra­se­ña del usuario que accede).

En esta secuencia de comandos se le asignan tres funciones a la clase “base de datos”: __construct(), el co­n­s­tru­c­tor de la clase que le recuerda a los usuarios que la ini­cia­li­za­ción (es decir, la asi­g­na­ción del valor inicial o de inicio) no está permitida. connect() hace re­fe­re­n­cia a la función principal de la clase que controla el es­ta­ble­ci­mie­n­to de la conexión y, por último, di­s­co­n­ne­ct() que se encarga de finalizar la conexión.

3.  Debido a que las ope­ra­cio­nes CRUD solo pueden uti­li­zar­se con la co­rre­s­po­n­die­n­te su­pe­r­fi­cie de contacto, es necesario crear el grid base uti­li­za­n­do Twitter Bootstrap. La versión actual de este framework puede de­s­ca­r­gar­se en su página web oficial. De­s­co­m­pri­me Bootstrap en el mismo di­re­c­to­rio donde se encuentra database.php y crea un nuevo archivo con el nombre index.php. Ahora puedes crear la interfaz:

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<h3>My CRUD PHP grid</h3>
</div>
<div class="row">
<table class="table table-striped table-bordered">
<thead>
    <tr>
        <th>Nombre</th>
        <th>Correo electrónico </th>
        <th>Móvil</th>
    </tr>
</thead>
<tbody>
<?php 
include 'database.php';
$pdo = Database::connect();
$sql = 'SELECT * FROM customers ORDER BY id DESC';
foreach ($pdo->query($sql) as $row) {
echo '<tr>';
echo '<td>' . $row['name'] . '</td>';
echo '<td>' . $row['email'] . '</td>';
echo '<td>' . $row['mobile'] . '</td>';
echo '</tr>';
}
Database::disconnect();
?>
</tbody>
</table>
</div>
</div> <!-- /container -->
</body>
</html>

En la sección <head>, se en­cue­n­tran los archivos CSS y Ja­va­S­cri­pt de Bootstrap; en la sección <body> se encuentra el an­te­rio­r­me­n­te creado database.php, in­clu­ye­n­do los intentos para es­ta­ble­cer una conexión POD (Database::connect()) y sus datos re­la­cio­na­dos (SELECT). Adi­cio­na­l­me­n­te, el archivo contiene la tabla HTML <table> con las opciones nombre, correo ele­c­tró­ni­co y móvil (que también son al­ma­ce­na­dos en la base de datos).

4. Ahora, para formar la es­tru­c­tu­ra esencial, es necesario co­n­ce­n­trar­se en la rea­li­za­ción de las di­fe­re­n­tes ope­ra­cio­nes CRUD. Por ejemplo, para poner en marcha la operación create se necesita otra página HTML con campos de fo­r­mu­la­rio para in­tro­du­cir los datos de usuario vi­n­cu­la­dos en index.php y a los que se puede acceder a través de un botón en la interfaz Bootstrap. Para mayor comodidad se re­co­mie­n­da comenzar con la creación de este botón, abriendo index.php y añadiendo el siguiente fragmento de código al elemento <div class="row"> de la tabla:

<p>
    <a href="create.php" class="btn btn-success">Create</a>
</p>

En el fragmento de código puedes ver que los datos se están vi­n­cu­la­n­do al archivo create.php aunque este todavía no exista. Al realizar una prueba del grid de Bootstrap, esta muestra que hay un botón pero, al hacer clic sobre él, este dirige a una página de error. Para finalizar y hacer válida la operación create debes crear el archivo create.php y añadir el siguiente código:

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="span10 offset1">
<div class="row">
<h3>Create a Customer</h3>
</div>
<form class="form-horizontal" action="create.php" method="post">
<div class="form-group <?php echo !empty($nameError)?'has-error':'';?>">
<label class="control-label">Name</label>
<div class="controls">
<input name="name" type="text" placeholder="Nombre" value="<?php echo !empty($name)?$name:'';?>">
<?php if (!empty($nameError)): ?>
<span class="help-inline"><?php echo   $nameError;?></span>
<?php endif; ?>
</div>
</div>
<div class="form-group <?php echo !empty($emailError)?'has-error':'';?>">
<label class="control-label">E-Mail-Adresse</label>
<div class="controls">
<input name="email" type="text" placeholder="Correo Electrónico" value="<?php echo !empty($email)?$email:'';?>">
<?php if (!empty($emailError)): ?>
<span class="help-inline"><?php echo   $emailError;?></span>
<?php endif;?>
</div>
</div>
<div class="form-group <?php echo !empty($mobileError)?'has-error':'';?>">
<label class="control-label">Móvil</label>
<div class="controls">
<input name="mobile" type="text" placeholder="Mobilnummer" value="<?php echo !empty($mobile)?$mobile:'';?>">
<?php if (!empty($mobileError)): ?>
<span class="help-inline"><?php echo $mobileError;?></span>
<?php endif;?>
</div>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-success">Create</button>
<a class="btn" href="index.php">Back</a>
</div>
</form>
</div>
</div> <!-- /container -->
</body>
</html>

El código genera el fo­r­mu­la­rio HTML que permite pe­r­so­na­li­zar la in­fo­r­ma­ción en los campos nombre, correo ele­c­tró­ni­co y móvil. Para cada casilla se crea una variable PHP que, en co­m­bi­na­ción con el fragmento de código que pre­se­n­ta­mos a co­n­ti­nua­ción (se debe añadir antes del código HTML en el archivo create.php), genera mensajes de error cuando no se realiza ninguna entrada en el campo co­rre­s­po­n­die­n­te:

<?php 
require 'database.php';
if ( !empty($_POST)) {
// Detectar errores de validación 
$nameError = null;
$emailError = null;
$mobileError = null;
// Capturar valores de entrada
$name = $_POST['name'];
$email = $_POST['email'];
$mobile = $_POST['mobile'];
// Validar entrada
$valid = true;
if (empty($name)) {
$nameError = Por favor, introduce tu nombre';
$valid = false;
}
if (empty($email)) {
$emailError = 'Por favor, introduce una dirección de correo electrónico';
$valid = false;
} else if ( !filter_var($email,FILTER_VALIDATE_EMAIL) ) {
$emailError = 'Por favor, introduce una dirección de correo electrónico';
$valid = false;
}
if (empty($mobile)) {
$mobileError = 'Por favor, introduce tu número de móvil';
$valid = false;
}
// Daten eingeben
if ($valid) {
    $pdo = Database::connect();
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO customers (name,email,mobile) values(?, ?, ?)";
    $q = $pdo->prepare($sql);
    $q->execute(array($name,$email,$mobile));
    Database::disconnect();
    header("Location: index.php");
}
     }
?>

De esta forma habrás creado una página create.php a la que se accede haciendo clic en el botón crear y que permite al usuario in­tro­du­cir su in­fo­r­ma­ción. El script se asegura de comprobar que se hayan in­tro­du­ci­do todos los datos y, en caso contrario, de mostrar los re­s­pe­c­ti­vos errores de va­li­da­ción; así, no solo se mostrarán mensajes para avisar al usuario de que los datos serán enviados a la base de datos, sino también mensajes de error cuando la entrada sea in­co­rre­c­ta. Si quieres conocer cómo crear y usar las demás ope­ra­cio­nes CRUD read, update y delete, puedes visitar este tutorial, donde también en­co­n­tra­rás in­fo­r­ma­ción para crear el grid de Bootstrap y la operación create.

Ir al menú principal