0

estoy tratando de obtener un id desde una base de datos pero me ha surgido el siguiente error: Array to string conversion

Mi código es el siguiente:

<?php
require 'funciones.php';
$pwd=md5('pwd');
$respuesta = funciones::login('user', $pwd);
if ($respuesta) 
{
echo "$respuesta[0];";
}
else
{
echo "Ninguna coincidencia con la busqueda...";
}
?>

Y el codigo de la función 'login' es:

    public static function login($user, $pwd)
    {
        $consultar = "SELECT * FROM login WHERE user = '$user' AND pwd = '$pwd'";
        $resultado = Database::getInstance()->getDb()->prepare($consultar);
        $resultado->execute();
        $tabla = $resultado->fetchAll(PDO::FETCH_ASSOC);
        return $tabla;
    }

NOTA: La configuración de la base de datos si esta bien, por que si obtiene un resultado, el error esta en la linea: echo "$respuesta[0];";

jose marquez
  • 193
  • 1
  • 2
  • 17

2 Answers2

2

Creo que un problema puede ser que estas concatenando mal sería algo como esto

$consultar = "SELECT * FROM login WHERE user = '".$user."' AND pwd = '".$pwd."'";

Es decir antes y despues de las variables va por ejemplo: '".$user."'

1

Dado que la respuesta dada no ha indicado una grave vulnerabilidad en el código, me permito aportar una respuesta que resolvería no solamente el actual error, sino que blindaría el código contra inyección de código malicioso.

Se trataría de usar consultas preparadas del siguiente modo:

   public static function login($user, $pwd)
    {
        $consultar = "SELECT * FROM login WHERE user = ? AND pwd = ?";
        $resultado = Database::getInstance()->getDb()->prepare($consultar);
        $arrParams=array($user,$pwd);
        $resultado->execute($arrParams);
        $tabla = $resultado->fetchAll(PDO::FETCH_ASSOC);
        return $tabla;
    }

Como se puede ver, blindar el código contra la Inyección SQL es muy fácil en PDO:

  1. Escribes la instrucción SQL cambiando las variables por marcadores de posición (?). También se podrían usar marcadores de nombre. Este es el núcleo de la Inyección, ya que un usuario mal intencionado podría modificar esos valores cambiándolos por código malicioso inyectable. Al pasarlos en la consulta y ejecutarla, podrías estar ejecutando código manipulado que podría ser muy muy dañino. Por eso no deberías nunca mandar a ejecutar consultas de este tipo: SELECT * FROM login WHERE user = '$user' AND pwd = '$pwd'
  2. Creas un array ($arrParams) con los valores que provienen desde fuentes externas.
  3. Pasas ese array con los valores a través del método execute.

Con esos tres sencillos pasos, estás blindando tu código contra el ataque de intrusos.

Para más detalles puedes consultar estas preguntas y sus respuestas:

Espero sea de utilidad.

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