无法从数据库中显示我的图像php

时间:2014-08-15 08:01:48

标签: php image

问题是当它确实返回二进制文件时,请帮助我

<!DOCTYPE html>
<html>
<head>
    <title>Tienda Online</title>

    <FORM action="upload_imagen.php" enctype="multipart/form-data" method="POST">
    <input type="file" name="imagen"> Buscar imagen
    <input type="submit" value="Buscar">
    </FORM>

    <div id="visualizar">

    </div>

    <form action="mostrar_imagen.php" method="POST">
    <input type="text" name="valor" >
    <input type="submit" value="mostrar">
    </form>

</html>

upload_imagen.php此文件上传图像并在数据库中存储

<?php

// Conexion a la base de datos
require "db_model.php";
class upload extends db_model {

   function whatever() {
       // Comprobamos si ha ocurrido un error.
       if (!isset($_FILES["imagen"]) || $_FILES["imagen"]["error"] > 0) {
            echo "Ha ocurrido un error.";
       } else {
            var_dump($_FILES["imagen"]);

            // Verificamos si el tipo de archivo es un tipo de imagen permitido.
            // y que el tamaño del archivo no exceda los 16MB
            $permitidos = array("image/jpg", "image/jpeg", "image/gif", "image/png");
            $limite_kb = 16384;

            if (in_array($_FILES['imagen']['type'], $permitidos) && $_FILES['imagen']['size'] <= $limite_kb * 1024) {
                // Archivo temporal
                $imagen_temporal = $_FILES['imagen']['tmp_name'];

                // Tipo de archivo
                $tipo = $_FILES['imagen']['type'];

                // Leemos el contenido del archivo temporal en binario.
                $fp = fopen($imagen_temporal, 'r+b');
                $data = fread($fp, filesize($imagen_temporal));
                fclose($fp);

                //Podríamos utilizar también la siguiente instrucción en lugar de las 3 anteriores.
                // $data=file_get_contents($imagen_temporal);
                // Escapamos los caracteres para que se puedan almacenar en la base de datos correctamente.
                $data = mysql_real_escape_string($data);

                // Insertamos en la base de datos.
                $this->query ="INSERT INTO imagenes (imagen, tipo_imagen) VALUES ('$data', '$tipo')";
                $resultado = $this->execute_query();
                if ($resultado) {
                    echo "El archivo ha sido copiado exitosamente.";
                } else {
                    echo "Ocurrió algun error al copiar el archivo.";
                }
            } else {
                echo "Formato de archivo no permitido o excede el tamaño límite de $limite_kb Kbytes.";
            }
        }
    }
}
$obj = new upload();
$obj->whatever();
?>

mostrar_imagen.php此部分以二进制格式检索图像,然后我想显示它,所以我读到我需要一个标题并发送它的图像类型,例如.jpg,.gif但我不知道如果ai有错误

<?php
require 'db_model.php';
class mostrar extends db_model {

    function __construct()
    {
        $id = $_POST['valor'];
        $this->query = "SELECT imagen, tipo_imagen 
                        FROM imagenes
                        WHERE imagen_id=$id";
        $datos = $this->execute_query_as();

        $imagen = $datos['imagen']; // Datos binarios de la imagen.

        $tipo = $datos['tipo_imagen'];  // Mime Type de la imagen.

        // Mandamos las cabeceras al navegador indicando el tipo de datos que vamos a enviar.
---- > my problem is here, i guess

        header("Content-type: image/jpg");
        echo $imagen;
        // A continuación enviamos el contenido binario de la imagen.
    }
}

$obj = new mostrar();
?>

db_model.php

<?php
/**
* clase de la base de datos
*/
include_once('config.php');
class db_model 
{
    private $db_host = "localhost";
    private $db_user = "root";
    private $db_pass = "";
    protected $db_name = "tienda_cartas";
    protected $query;
    protected $rows = array();
    private $conection; 
    private function open_conection()
    {
        $this->conection = new mysqli($this->db_host,$this->db_user,$this->db_pass,$this->db_name);
        if ($this->conection->connect_errno) {
            echo "error al conectar";
            die();
        } else {
            echo "conectado";
        }
    }

    private function close_conection() {
        $this->conection->close();
    }

    protected function execute_query() {
        $this->open_conection();
        $result = $this->conection->query($this->query);
        if(!$result){
            echo "no se pudo ejecutar el sql";
        }
        $this->close_conection();
        return $result;
        header("location:index.php");
    }

    protected function execute_query_as() {
        $this->open_conection();
        $result = $this->conection->query($this->query);
        if(!$result){
            echo "no se pudo ejecutar el sql";
        }
        $array_as = $result->fetch_assoc();
        if(!$array_as){
            echo "no hay incidencias";
            die();
        }

        $this->close_conection();
        return $array_as;
    }
}
?>

1 个答案:

答案 0 :(得分:0)

这可能是你的问题:

$data = mysql_real_escape_string($data);

在您的课程中,您使用mysqli_*个函数,但这个函数属于不推荐使用的mysql_*函数。当您调用它时,它将自动尝试打开与mysql_connect()的新数据库连接,这将失败,因为它没有关于您的主机的任何信息。然后mysql_real_escape_string()将返回false

Warning: mysql_real_escape_string(): A link to the server could not be established in test.php on line 2
bool(false)

只需删除该行,无论如何,转义二进制数据很可能会毁掉它。相反,您应该使用预准备语句来阻止SQL注入。