lunes, 20 de octubre de 2014

Función row_count de MySQL

La función row_count() de MySQL es una función que devuelve el número de filas afectadas de una serie de sentencias SQL tal y como veremos a continuación. Tiene una funcionalidad similar a mysql_affected_rows() de la API de C.

Según el tipo de sentencias devolverá un valor u otro:
  • Sentencias DDL: devuelve un 0. Esto es aplicable a sentencias como CREATE TABLE o DROP TABLE.
  • Sentencias DML diferentes del SELECT: devuelve el número de filas afectadas. Esto se aplica a las sentencias clásicas de INSERT, UPDATE o DELETE, así como a ALTER TABLE LOAD DATA INFILE.
  • Sentencias SELECT: devuelve un -1 si la sentencia devuelve un conjunto de registros. En caso contrario devuelve el número de registros afectados. Por ejemplo SELECT * FROM tabla devuelve -1, pero si hacemos SELECT * FROM tabla INTO OUTFILE 'fichero' devuelve el número de registros que se han volcado al fichero.
  • En las sentencias REPLACE: devuelve un 2 si el nuevo registro reemplaza el anterior. En este caso devuelve un 2 por la fila eliminada y la nueva.

Os presentamos un ejemplo de uso de esta función:

mysql> INSERT INTO tabla VALUES(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
|           3 |
+-------------+
1 row in set (0.00 sec)

mysql> DELETE FROM tabla WHERE i IN(1,2);
Query OK, 2 rows affected (0.00 sec)

mysql> SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)

Función in_array en Javascript

La función in_array() de PHP comprueba si existe un valor dentro del array y nos devuelve true o false. Esta función no existe en Javascript pero la podemos crear fácilmente.

Tenemos el siguiente array en Javascript:

var arrCiudades = ['Londres', 'París', 'Roma', 'Madrid', 'Moscú'];


Si usásemos el framework JQuery no habría problema ya que ya la lleva implementada y simplemente tendríamos que hacer lo siguiente:

if ($.inArray('Madrid', arrCiudades)){
  alert('Encontrada');
} else {
  alert('No encontrada');
}


En Javascript lo que hacemos es añadírsela al objeto Array de la siguiente forma:

Array.prototype.in_array = function(){
  for (var i in this) {
    if (this[i] == arguments[0]){
      return true;
    }
  }
  return false;
}


Podríamos haber buscado simplemente con el método indexOf() que nos devuelve un -1 si no existe o el índice si sí que encuentra el elemento, pero no funciona con el navegador Internet Explorer 8 y anteriores.

Una vez tenemos esto ya podemos buscar si el elemento existe en el array con la siguiente llamada:

if (arrCiudades.in_array('Madrid')){
  alert('Encontrada');
} else {
  alert('No encontrada');
}


Espero que les pueda servir.

domingo, 19 de octubre de 2014

Obtener el último registro insertado en una tabla en MySQL

En MySQL tenemos una característica muy común en los campos que hacen de clave primaria que es el AUTO_INCREMENT. Al insertar un registro en una tabla que tenga una clave numérica autoincrementable, es habitual necesitar dicho valor.

Para esto tenemos la función last_insert_id() de MySQL que nos devolverá dicho valor, siempre que estemos en la misma sesión en la que hayamos hecho la inserción.

Veamos un ejemplo claro de su uso con la creación de una tabla vehiculos, otra de conductores y la última que relaciona ambas llamada alquiler_vehiculos.

CREATE TABLE vehiculos(
  id_vehiculo INT NOT NULL AUTO_INCREMENT,
  marca VARCHAR(50) NOT NULL,
  modelo VARCHAR(50) NOT NULL,
  color VARCHAR(50) NOT NULL,
  PRIMARY KEY(id_vehiculo)
);

CREATE TABLE conductores(
  id_conductor INT NOT NULL AUTO_INCREMENT,
  nombre VARCHAR(50) NOT NULL,
  apellidos VARCHAR(50) NOT NULL,
  PRIMARY KEY(id_conductor)
);

CREATE TABLE alquiler_vehiculos(
  id_vehiculo INT NOT NULL,
  id_conductor INT NOT NULL,
  PRIMARY KEY(id_vehiculo, id_conductor)
);


Ahora vamos a insertar registros en la tabla vehiculos. El insert lo podemos hacer de dos formas diferentes obteniendo el mismo resultado. En la primera ponemos un null al campo AUTO_INCREMENT y en la segunda enumeramos los campos omitiendo el primero.

mysql> INSERT INTO vehiculos VALUES (null, 'Ford', 'Focus', 'Negro');
Query OK, 1 row affected (0.28 sec)

mysql> INSERT INTO vehiculos (marca, modelo, color) VALUES ('Ford', 'Focus', 'Negro');
Query OK, 1 row affected (0.28 sec)

En ambos casos podemos recuperar el valor de id_vehiculo con last_insert_id().

mysql> SELECT last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+
1 row in set (0.01 sec)

Ahora lo que haremos será lo mismo para los conductores y en ese momento aprovecharemos el resultado de last_insert_id() para insertar el registro del alquiler.

mysql> INSERT INTO conductores (nombre, apellidos) VALUES ('Carlos', 'Martín');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO alquiler_vehiculos VALUES (1, last_insert_id());
Query OK, 1 row affected (0.23 sec)


Si obtenemos los registros de la tabla veremos que nos ha insertado un 1 en el id_conductor.

mysql> SELECT * FROM alquiler_vehiculos;
+-------------+--------------+
| id_vehiculo | id_conductor |
+-------------+--------------+
|           1 |            1 |
+-------------+--------------+
1 row in set (0.00 sec)

Sin embargo, si hacemos un insert múltiple, la función last_insert_id nos dará el id del primer registro insertado.

mysql> INSERT INTO vehiculos (marca, modelo, color) VALUES ('Ford', 'Focus', 'Blanco'), ('BMW', '330D', 'Gris'), ('Honda', 'Accord', 'Negro');
Query OK, 3 rows affected (0.04 sec)
Registros: 3  Duplicados: 0  Peligros: 0

mysql> SELECT last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                2 |
+------------------+
1 row in set (0.00 sec)

En este caso, si quisiéramos saber el id del último registro deberíamos combinarlo con la función num_rows() de esta forma.

mysql> SELECT row_count()+last_insert_id()-1;
+--------------------------------+
| row_count()+last_insert_id()-1 |
+--------------------------------+
|                             4 |
+--------------------------------+
1 row in set (0.00 sec)

Espero que os pueda servir de ayuda.

jueves, 16 de octubre de 2014

Convertir la primera letra de un string en mayúsculas en PHP y Javascript

Si necesitamos convertir la primera letra de un string a mayúsculas tenemos una forma muy sencilla en PHP mediante la función directa ucfirst.

$str = 'micadena';
echo ucfirst($str); // Micadena


En cambio con Javascript no tenemos ninguna función directa y la tenemos que crear nosotros.

var str = 'micadena';
str = str[0].toUpperCase() + str.slice(1);
alert(str); // Micadena

Espero que les sirva.

Función nl2br en Javascript

La función nl2br de PHP nos proporciona una utilidad a la hora de recuperar información de la base de datos que se ha guardado con caracteres de salto de línea o break line. Lo que realiza en definitiva es convertir los caracteres \r\n, \n\r, \r y \n por <br> o <br />.

Para realizar esto mismo en Javascript podemos usar la siguiente función:

function nl2br(str, is_xhtml) {
  var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '< br />' : '< br>'; // Eliminar el espacio antes del br
 
  return (str + '')
    .replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');
}


Fuente:

http://phpjs.org/functions/nl2br/

Validar formularios con HTML5

Como muchos de vosotros ya sabréis, HTML5 ha aportado nuevas características de validación de formularios con el atributo required de los elementos <input>. Sin embargo sigue siendo necesario realizar la validación clásica ya que ciertos navegadores como Internet Explorer 9 y anteriores y Safari no soportan dicho atributo.

El primer paso que debemos dar sería indicar que un elemento es obligatorio de la siguiente forma:


<input name="email" required="" type="text">

Con esto conseguiremos que simplemente nos aparezca un mensaje genérico por parte del navegador. Si queremos personalizar dicho mensaje usaremos el atributo title:

<input name="email" required="" title="Debe introducir un email" type="text">

Si queremos ir más allá y validar que lo que escribamos en el email tenga un formato correcto añadiremos el atributo pattern:

<input name="email" pattern="^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$" required="" title="Debe introducir un email con formato mail@ejemplo.com" type="text">

Con esto ya hemos conseguido validar el formato y mostrar un mensaje personlizado, pero podemos hacérselo un poco más fácil al usuario que debe introducir su email escribiéndole por defecto el formato dentro del mismo texto con el atributo placeholder:

<input name="email" pattern="^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$" placeholder="mail@ejemplo.com" required="" title="Debe introducir un email con formato mail@ejemplo.com" type="text">

Fuentes:

http://www.w3schools.com/tags/att_input_required.asp