como cambiar de mysql_query a mysqli_query?

publicado por: Anonymous

Cambiar de mysql_query a mysqli_query bueno en realidad no le entiendo mucho al cambio espero me pudieras ayudar a cambiar mi consulta que estoy haciendo es para verificar el usuario y contraseña de mi login les dejo el código no le entiendo muy bien al cambio por mysqli

$re=mysqli_query("select * from user_alumno where CURP='".$_POST['Usuario']."' AND 
                CONTRASENA='".$_POST['Password']."'")   or die(mysql_error());
while ($f=mysqli_fetch_array($re)) {
        $arreglo[]=array('Id'=>$_POST['id']);

solución

Migrar de mysql_* a mysqli o a PDO es un cambio muy importante, ya que la primera ha sido declarada obsoleta. ¿El motivo? Entre otros, porque no se pueden manejar los datos con seguridad (otros motivos son explicados en el enlace al final de esta respuesta).

Las consultas con mysql_* son una puerta abierta a la Inyección SQL.

Imaginemos que en esta consulta:

select * from user_alumno where CURP='".$_POST['Usuario']."' AND 
            CONTRASENA='".$_POST['Password']`

tienes un formulario para que cualquier usuario escriba su contraseña.

Hasta ahí todo bien… pero que tal si hay un usuario malicioso que donde va el password escribe esto:

1; DELETE FROM user_alumno; --

Con esa simpleza, cualquiera inyectaría código malicioso el cual en este caso borraría completamente la tabla user_alumno. ¡Y esto es lo menos grave que podría pasar cuando hablamos de Inyección SQL.! Si dejas esa puerta abierta un usuario con ciertas habilidades podría tomar el control de la base de datos e incluso del sistema y alterar los datos. Imagina alterar los valores de las cuentas en una institución bancaria… podrías terminar en la cárcel.

Entonces, el paso a MySQLi o a PDO, es vital.

Ahora bien, mucha atención a esto:

De nada sirve pasar a MySQLi si sigues construyendo tus consultas como
más arriba, ya que, aunque tengas MySQLi te van a seguir inyectando
código malicioso.

Es aquí cuando entran en juego las consultas preparadas. Lo que hace MySQLi y PDO es permitirnos construir consultas preparadas, cosa que mysql_* no hace y por eso entre otras cosas ha sido descartada. Es decir, la seguridad implica no solamente usar MySQLi o PDO, sino usarlos aplicando consultas preparadas, cuando sean requeridas.

Las consultas preparadas lo que hacen es enviar por separado la instrucción SQL y los valores que ésta debe tener, en el caso de consultas que usen valores desde el exterior.

Otra cosa que se descarta, al usar consultas preparadas, es el uso de funciones de escape que durante muchísimo tiempo se usaron creyendo que eran seguras para sanear los datos. La experiencia ha demostrado que se puede preparar una inyección SQL perfectamente sin tener que escapar nada en los valores.

Veamos brevemente lo que habría que hacer paso a paso para migrar a mysqli:

  1. Crear una instancia de la conexión:

    $mysqli = new mysqli($host_name, $user_name, $pass_word, $database_name, $port);
    
  2. Crear la consulta aplicando lo que ya dijimos: consultas preparadas:

    $sql= "select * from user_alumno  
              where CURP = ? AND CONTRASENA = ?";
    

Como ves, los valores son reemplazados por signos de interrogación, porque serán pasados aparte. De ese modo se evita la Inyección.

  1. Recuperar los valores que vienen desde fuera.

Los valores que vienen de fuera, son recuperados como de costumbre por $_POST y son pasados usando métodos con los que ya cuenta MySQLi:

    $usuario=$_POST['Usuario'];
    $password=$_POST['Password']
  1. Preparar la consulta y pasar los datos usando los método de MySQLi

Vamos a preparar la consulta y a pasarle los valores aparte.
En el método bind_param se debe indicar por las letras entre comillas de que tipo es cada dato. En este caso, si ambos son del tipo string, se ponen dos s. Si alguno fuese del tipo integer, se pondría una i. Cada letra va en el orden de la variable que se está pasando.

$stmt=$mysqli->prepare($sql);
$stmt->bind_param("ss", $usuario,$password);
  1. Ejecutar la consulta

Una vez preparada la consulta la ejecutamos.

$stmt->execute();
  1. Recuperar los resultados

Luego que la consulta se prepara y se ejecuta, hay varias formas de obtener los resultados.

Te dejo un código completo de ejemplo que muestra una de las formas de obtener los resultados.

Hay comentarios en el código que explican más o menos lo que se hace. Podrás adaptarlo a tu situación. Lo que se hace en este caso es obtener los primeros cinco libros de una bd, aplicando dos criterios.


Código: ver demo

<?php

require "util/public_db_info.php";

$mysqli = new mysqli($host_name, $user_name, $pass_word, $database_name, $port);

$sql = "SELECT id, title FROM books WHERE id > ? AND ean = ? LIMIT 5";  

    /*
      * Valores que  habitualmente  son  recuperados  por  $_POST
    */

$id=0;
$ean="X8";


//Preparar la consulta
$stmt=$mysqli->prepare($sql);

//Evaluar si  tuvo  éxito
if ($stmt) {
    /*
      * Pasar parámetros separados  de la instrucción SQL
      * Ejecutar
      * Almacenar los resultados
    */
    $stmt->bind_param("is", $id,$ean);
    $stmt->execute();
    $stmt->store_result();
    echo "<pre>";

    /*
      * Imprimir los  resultados
      *  asignándolos a  variables
    */



     $stmt->bind_result($id, $titulo);
     while ($stmt->fetch()) 
     {
        echo 'ID: '.$id.' - ';
        echo 'Titulo: '.$titulo.'<br>';
      }
      echo "</pre>";

    /*
      * Cerrar  recursos
    */

    $stmt->close();
}else{
    echo "Hubo un fallo en la consulta";
}
$mysqli->close();

?>

Resultado:

ID: 1 - Titulo: Un hombre para la  eternidad
ID: 2 - Titulo: Un hombre para la eternidad
ID: 3 - Titulo: Romeo y Julieta
ID: 4 - Titulo: El Quijote
ID: 5 - Titulo: Los Miserables

PDO es otra opción

Yo recomiendo usar PDO en lugar de MySQLi ya que ofrece varias ventajas.

Con PDO aunque cambies el motor de base de datos, puedes seguir usando el mismo código, cambiando solamente una mínima parte del código.

La obtención y manejo de datos se hace mucho más fácil y clara.

El peligro de PDO, como de MySQLi, es que lo uses mal y sobre todo que lo configures mal al momento de obtener la conexión.

Para evitar riesgos y también facilitar las cosas lo mejor sería tener una sola clase que cree tu conexión a la base de datos y que contenga los métodos necesarios para consultarla y obtener los datos.

Esta clase PHP-PDO podría serte de utilidad si quieres migrar tu código definitivamente a PDO.

Ejemplo de uso:

//Incluir la clase y crear una instancia de la misma
require_once("DbPDO.class.php");
$pdo=new DbPDO();

//Consultar
$sql= "select * from user_alumno  
       where CURP = :curp AND CONTRASENA = :password";
$params=array("curp"=>"1","password"=>"5")
$datos=$pdo->query($sql,$params);

//En $datos tendríamos un arreglo con los resultados
//Una forma de mostrarlos sería

foreach ($datos as $row)
{
    echo $row["nombre"]." ".$row["apellido"]."<br>";
}

La clase tiene métodos para obtener una sola columna, una sola fila. Y le puedes incorporar métodos personalizados según tus necesidades.


Enlaces relacionados:

Recomiendo la lectura de estas preguntas de SO para tener una visión más amplia del tema:

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *