1

Estoy siguiendo el ejemplo que me dieron en mi anterior respuesta para mostrar si existo o no usuario. Ahora, lo que quiero hacer es que me muestre la constraseña mediante la consulta y esto es lo que hago:

PHP ACTUALIZADO

<?php
  require ('conexion.php');
  
  //$user = $_GET['usuario'];
  $user = 'franco';
  
  $conn = Conectar();
  
  
  $consultaUsuarios = Conectar()->prepare("SELECT usuario, password
                                         FROM usuarios 
                                         WHERE usuario = :usuario");
  $consultaUsuarios->bindParam(":usuario", $user);
  $consultaUsuarios->execute();
  
  $arrDatos=$consultaUsuarios->fetchAll(PDO::FETCH_ASSOC);
   foreach ($arrDatos as $muestra) {
       print_r($muestra['usuario']);
       print_r($muestra['password']);
    }

Por url paso:

dom.com/log.php?usuario=franco

Pero, esto me devuelve que no hay ningún usuario que se llame franco lo cual es incorrecto porque sí existen usuarios con ese nombre. ¿Qué estoy haciendo mal?

ACTUALIZACIÓN:

Me devuelve: francoasd123francofrancofranco$2y$13$AhMtYC.iM0G9Md2.DsIF8OktFkT2X5IU77Fc4fc8RksckWILsEcTq

¿Cómo puedo concatenar para que me vaya imprimiendo usuario + contraseña + salto de línea?

Adjunto captura de la consulta escrita en MySQL

introducir la descripción de la imagen aquí

Franqo Balsamo
  • 937
  • 1
  • 11
  • 34
  • 1
    Los comentarios no deben usarse para discusiones extendidas; esta conversación ha sido [trasladada a un chat](https://chat.stackexchange.com/rooms/115747/discussion-on-question-by-franqo-balsamo-consulta-mysql-con-php-usando-pdo). – Pikoh Nov 02 '20 at 07:53

1 Answers1

2

Resumiendo un poco todo lo que yo y otros usuarios te hemos venido señalando sobre este código, una posible solución sería la siguiente.

He puesto comentarios en varios puntos para que se entienda toda la evolución del problema:

/*
    Recogemos el valor del GET usando un ternario
*/
$user = !empty($_GET['usuario']) ? $_GET['usuario'] : NULL;
/*
    Verificamos si hay datos pasados en GET
*/
if($user) {
    require ('conexion.php');
    $conn = Conectar();
    /*
        Como comenta quevedo, debes usar $conn
        Y, ad libitum voy a cambiar tu larrrrga variable por $stmt
        que es lo que se suele usar para estos casos... 
        quizá nombres tannnn descriptivos no tienen mucho sentido aquí
        y sólo contribuyen a hacer un código más extenso
        pero eso queda a tu gusto
    */
    $stmt = $conn->prepare("SELECT usuario, password
                                         FROM usuarios 
                                         WHERE usuario = :usuario");
    /*
        Aquí podría verificarse el resultado de prepare
        y más adelante el de execute o usar un bloque try ... catch
        para escribir un código robusto pero dado que esto se alejaría
        del problema original, lo dejamos tal y como lo tienes. 
        Pero no te recomiendo programar de una forma tan "optimista"
        deberías pensar en todo lo que puede salir mal para afrontarlo desde el código,
        es lo que yo llamo programación "pesimista"
    */  
    /*
        Hay un comentario de quevedo invitando a usar execute para pasar los parámetros,
        Esto es válido y simplifica el código, pero no siempre es lo mejor, 
        porque cuando haces eso, todos los parámetros son reconocidos como String
        obligando a reconversiones de aquellos parámetros que sean int, boolean, etc.
        Lo más claro es usar bindParam o bindValue e incluso especificar de forma explícita
        de qué tipo es cada dato, así evitamos sorpresas desagradables y escribimos código específico
        Al final te dejaré algún enlace con argumentos sólidos al respecto
    */ 
    $stmt->bindParam(":usuario", $user,PDO::PARAM_STR);
    $stmt->execute();
    /*
        Uno de los graves errores iniciales era no guardar una referencia del fetch
          (originalmente era fetchColumn), pero de cualquier fetch... debes guardar referencia
          de algún modo, pues lo que devuelve PDO no son los datos en sí mismos, sino algo así como
          un puntero hacia los datos el cual debes recorrer /leer con alguno de los métodos fetch
        fetchAll es una opción recomendada cuando se esperan pocos datos
          Sin embargo cuando se esperan muchos datos ("muchos" depende de "muchas cosas,
          como capacidad del servidor, velocidad de red, etc)... cuando se esperan "muchos" datos
          fetchAll no se recomienda, porque podría haber problemas de desbordamiento de memoria
          en ese caso es mejor usar fetch simplemente y leer los resultados dentro de un bucle
          Sobre ese estilo de lecturas encontrarás ejemplos en el Manual de PHP y en varias
          respuestas de este mismo sitio ...
        Dado que aquí es una consulta filtrada, podrías usar fetchAll() porque es poco probable
        que arroje una cantidad ingente de datos
    */
    $arrDatos=$stmt->fetchAll(PDO::FETCH_ASSOC);
    /*
        Aquí podemos verificar a los datos mismos
        para saber si la consulta vino vacía  o no
    */
    if($arrDatos){
        foreach ($arrDatos as $muestra) {
            /*
                Usa print_r para mostrar arrays en fase de depuración, aunque es mejor usar var_dump
                Para mostrar datos finales, lo más simple es usar echo
                Aquí simplificamos, poniendo todo en una sola cadena rodeada de comillas dobles
                En ese caso es lícito poner los nombres de clave del array sin nignuna comilla
                \t es una tabulación y PHP_EOL indica un salto de línea. 
            */
            echo "$muestra[usuario] \t $muestra[password]".PHP_EOL;
        }
        
    } else {
        echo "No hay datos";
    }
} else {
    echo "No se pasaron datos desde el cliente";    
}

Enlaces

A. Cedano
  • 86,578
  • 19
  • 122
  • 221