En una sección anterior, vio una forma de agregar un nuevo registro a la base de datos. Usamos la declaración INSERT para hacer esto:

$ SQL = "INSERT INTO tbl_address_book (Nombre, apellido, dirección) VALUES ('Paul', 'McCartney', 'Penny Lane')";

Sin embargo, el SQL anterior utiliza valores codificados de forma rígida ('Paul', 'McCartney', 'Penny Lane'). Sin embargo, lo que suele ocurrir es que tienes cuadros de texto donde las personas pueden ingresar detalles. Cuando se hace clic en un botón, estos VALORES se utilizan en una declaración SQL para agregar un nuevo registro. Sin embargo, antes de insertar un nuevo registro, explicaremos las declaraciones preparadas.

Hasta ahora, hemos utilizado SQL que extrajo todos los registros de una base de datos, o SQL que insertó valores codificados como 'Paul' y 'McCartney'. Sin embargo, la mayoría de las veces, esto no es lo que desea hacer. Lo que suele suceder es que tiene cuadros de texto donde las personas pueden ingresar detalles, como nombres de usuario, contraseñas y direcciones de correo electrónico. Luego, obtiene estos valores de un formulario HTML y hace algo con ellos. En esta lección, verá cómo extraer registros de una base de datos en función de un correo electrónico escrito en un cuadro de texto. Para esto, usaremos algo llamado Declaración preparada.

Declaraciones preparadas

Cuando les pide a los usuarios que ingresen detalles en un cuadro de texto y hagan clic en un botón, está abriendo su base de datos a ataques, especialmente de algo llamado ataque de inyección SQL. Por ejemplo, tome esta declaración SQL:

$ SQL = "SELECT * FROM miembros DONDE email =" $ email "";

Aquí, estamos seleccionando todos los registros de una tabla de base de datos llamada miembros. El SQL esta vez tiene una cláusula WHERE agregada. La cláusula WHERE se usa cuando desea limitar los resultados a solo los registros que necesita. Después de la palabra "DÓNDE", escribe un nombre de columna de su base de datos (Email, en nuestro caso). Luego tiene un signo igual, seguido del valor que desea verificar. El valor que queremos verificar proviene de la variable llamada $ correo electrónico. Esto está rodeado de comillas simples.

Cuando se ingresa una dirección de correo electrónico en el cuadro de texto de nuestro formulario, este valor va directamente a la variable sin ninguna verificación. Un atacante podría escribir algo más en el cuadro de texto, intentando manipular su declaración SQL. Podrían agregar una parte DELETE para eliminar registros de su base de datos, o una cláusula DROP para eliminar toda la base de datos. Hay muchas formas en que un atacante podría inyectar SQL en su código. Por lo tanto, debes defenderte de los ataques.

Para evitar ataques de inyección de SQL como estos, puede utilizar una declaración preparada. Veamos como funcionan.

Los scripts PHP

Junto con la carpeta de la base de datos entre los archivos que descargó, hay un script PHP llamado testPrep.php (en la carpeta de scripts). Usaremos este script y la base de datos para enseñarle acerca de las declaraciones preparadas.

Abra el archivo testPrep.php y verá algo de PHP en la parte superior y un FORMULARIO en la sección BODY del HTML. La forma es simplemente esta:

dirección de correo electrónico

Es un formulario simple, con un cuadro de texto y un botón. El cuadro de texto es para una dirección de correo electrónico. Cuando ingrese una dirección de correo electrónico correcta, imprimiremos una fila de la base de datos. La fila contiene un número de identificación, un nombre de usuario, una contraseña y la dirección de correo electrónico. Entonces, estamos consultando la tabla de la base de datos para ver si la dirección de correo electrónico ingresada en el cuadro de texto coincide con una dirección de correo electrónico de la tabla.

De hecho, pruébelo. Cargue testPrep.php en su navegador web. Ingrese la siguiente dirección de correo electrónico en el cuadro de texto:

[email protected]

Ahora haga clic en el botón. Si está conectado a su servidor, debería imprimir lo siguiente:

1
test1
test1
[email protected]

(Si recibe errores en la base de datos, asegúrese de tener su configure.php archivo en el lugar correcto, como se explicó en una sección anterior.)

Entonces, el ID de la fila devuelta es 1, el nombre de usuario y la contraseña son test1 y la dirección de correo electrónico es [email protected] Ahora veamos el código PHP.

$ correo electrónico = "";

if (isset ($ _ POST['Submit1'])) {

require '../configure.php';
$ correo electrónico = $ _POST['email'];

$ base de datos = "membertest";
$ db_found = new mysqli (DB_SERVER, DB_USER, DB_PASS, $ base de datos);

if ($ db_found) {

$ SQL = $ db_found-> prepare ('SELECT * FROM miembros WHERE email =?');
$ SQL-> bind_param ('s', $ correo electrónico);
$ SQL-> ejecutar ();

$ resultado = $ SQL-> get_result ();

if ($ resultado-> num_rows> 0) {

while ($ db_field = $ resultado-> fetch_assoc ()) {

imprimir $ db_field['ID'] . "
";
imprimir $ db_field['username'] . "
";
imprimir $ db_field['password'] . "
";
imprimir $ db_field['email'] . "
";

}

}
demás {

imprimir "No se encontraron registros";

}

$ SQL-> cerrar ();
$ db_found-> close ();

}
demás {

imprimir "Base de datos NO encontrada";

}

}

?>

La primera línea a examinar es esta:

$ correo electrónico = $ _POST['email'];

Esto solo obtiene el texto del cuadro de texto del formulario. Pero tenga en cuenta que no estamos haciendo ningún error al verificar aquí para ver si es una dirección de correo electrónico válida o si el usuario no ha ingresado nada malicioso. (Puede hacer una comprobación de errores aquí, si lo desea. Pero lo haremos simple para no complicar demasiado el código. Vamos a utilizar una declaración preparada, por lo que cualquier SQL malicioso que se haya agregado se convertirá en una cadena, no una declaración SQL).

Las siguientes líneas configuran el nombre de usuario y la contraseña de la base de datos, así como el nombre del servidor y la base de datos. Entonces tenemos esta línea:

$ db_found = new mysqli (DB_SERVER, DB_USER, DB_PASS, $ base de datos);

Esta es una nueva forma de conectarse a la base de datos y al servidor. Anteriormente usamos dos pasos: mysqli_connect, y mysqli_select. Ahora, solo estamos usando un paso: mysqli. Entre los paréntesis de mysqli, tenemos cuatro cosas: el nombre del servidor, el nombre de usuario, la contraseña y el nombre de la base de datos. (Los tres primeros provienen del archivo requerido, configure.php. Viste cómo configurar esto en una lección anterior). nuevo palabra clave después del signo igual. Necesita esto para configurar un nuevo objeto de base de datos.

Dentro de una declaración IF, tenemos esta línea:

$ SQL = $ db_found-> prepare ('SELECT * FROM miembros WHERE email =?');

Esta es la primera línea de nuestra declaración preparada. Estamos preparando el SQL que queremos ejecutar en la tabla de la base de datos. A la derecha de un signo igual, tenemos el nombre de nuestro objeto de base de datos, $ db_found. Debido a que es un objeto, necesita dos símbolos sin ningún espacio entre ellos: un guión (-) y un símbolo mayor que (>). Luego viene la función incorporada preparar. Entre los corchetes de preparación, debe escribir su SQL. Estamos seleccionando todos los registros DONDE se cumple una determinada condición. Lo curioso es esto:

DONDE email =?

El signo de interrogación es un marcador de posición, a menudo llamado parámetro. El Email part es el nombre de un campo en nuestra tabla de base de datos. El marcador de posición, eso?, Será reemplazado por un valor real. Hacemos esto en la siguiente línea:

$ SQL-> bind_param ('s', $ correo electrónico);

Observe que la variable $ SQL ahora es un objeto, por lo que tiene los símbolos -> después. Entonces tenemos una función incorporada llamada bind_param. Como sugiere su nombre, esto se utiliza para vincular valores a los parámetros que configura en el preparar función. Entre los corchetes de bind_param tenemos una sola letra s rodeada de comillas simples. Después de que una coma va el valor que desea vincular, en nuestro caso, este es el valor que obtuvimos del cuadro de texto en el formulario: la dirección de correo electrónico. (El nombre de la variable no tiene que coincidir con el nombre del campo en su base de datos).

Puede enlazar a más de un valor. Por ejemplo, es posible que desee comprobar un nombre de usuario y la dirección de correo electrónico. En cuyo caso, su función de preparación podría verse así:

$ SQL = $ db_found-> prepare ('SELECT * FROM miembros WHERE email =? AND username =?');

Observe que tenemos una parte AND que separa los dos campos. Email y nombre de usuario. Cada campo tiene su propio marcador de posición de signo de igual y signo de interrogación

El bind_param la función sería entonces esta:

$ SQL-> bind_param ('ss', $ correo electrónico, $ usuario);

Ahora tenemos dos letras s, una para cada uno de los parámetros. El $ correo electrónico y $ usuario serían variables que obtenemos del formulario HTML.

La 's' es la abreviatura de cadena. Es posible que tenga campos en su base de datos que sean numéricos, en cuyo caso necesita y i (para Integer) od (para doble):

$ SQL-> bind_param ('I', $ algún_valor_integer);
$ SQL-> bind_param ('D', $ algún_valor_doble);

También hay una 'b', que es la abreviatura de BLOB:

$ SQL-> bind_param ('B', $ algún_valor_bloque);

Una vez que haya vinculado sus parámetros, puede continuar y ejecutar:

$ SQL-> ejecutar ();

Para obtener algunos resultados, necesita esto:

$ resultado = $ SQL-> get_result ();

La función incorporada ahora es get_result. Esto devolverá una matriz de filas de su tabla.

Puede probar para ver si se devolvió alguna fila:

if ($ resultado-> num_rows> 0) {
}

Aquí, usamos la función incorporada num_rows. Estamos probando para ver si es mayor que cero. Si es así, tenemos esto:

while ($ db_field = $ resultado-> fetch_assoc ()) {

imprimir $ db_field['ID'] . "
";
imprimir $ db_field['username'] . "
";
imprimir $ db_field['password'] . "
";
imprimir $ db_field['email'] . "
";

}

Estamos usando un ciclo while para recorrer la matriz devuelta. La matriz se puede atravesar con:

$ campo_db = $ resultado-> fetch_assoc ()

El $ db_field es solo un nombre de variable. Puedes llamarlo casi como quieras. Pero $ resultado-> fetch_assoc () coloca cada fila de su base de datos en la variable. Luego puede hacer algo con cada fila:

imprimir $ db_field['ID'] . "
";
imprimir $ db_field['username'] . "
";
imprimir $ db_field['password'] . "
";
imprimir $ db_field['email'] . "
";

Solo estamos imprimiendo cada fila.

En el siguiente tutorial, verá cómo insertar y actualizar registros usando una declaración preparada.



<- Atrás una página | Pasar a la siguiente parte ->

Volver a la página de contenido de PHP

Recomendado para ti