Отображение изображения в формате HTML из базы данных SQL с использованием подготовленного оператора PHP

0

Я создаю собственное приложение для управления отношениями с клиентами.

Это приложение довольно прямолинейно. Он собирает информацию о клиенте и сохраняет его для последующего использования.

Одна часть собранной информации - это изображение идентификации фотографий клиентов. Я сохраняю это изображение в своей таблице в базе данных mySQL.

Я искал способ отображения изображения в небольшом окне предварительного просмотра рядом с информацией о клиентах (имя, адрес и т.д.). То, что я нахожу для возможных решений, очень старые и обесценившиеся на данный момент, или ссылаются на отображение изображения, где только адрес файла хранится в базе данных, а сам образ сохраняется в папке на сервере.

Код, который я сейчас имею, не отображает ничего в HTML, но пустое пространство. У меня была одна версия до этого, которая отображала необработанные данные из BLOB, но все это разбивало все, поэтому я не заставил ее показать вас здесь.

Мой вопрос в том, есть ли какой-то ресурс, который кто-то может указать мне на это конкретно о том, как этот тип информации используется веб-браузером и как организовать его для отображения? ИЛИ, если по какой-то причине все это неправильно, может ли кто-нибудь указать мне на документацию, которая является лучшим способом сделать это? Я не испытываю никого из этого, и иногда мне трудно найти ответы из-за отсутствия правильной терминологии.

Таблица выглядит так:

TABLE NAME = "photoid"
 row 1 = "id" (auto increment)
 row 2 = "name" (varchar)
 row 3 = "mime" (varchar)
 row 4 = "size" (bigint)
 row 5 = "data" (medium blob)
 row 6 = "created" (datetime)
 row 7 = "client_id" (varchar)

HTML:

<img width="400" height="200" src="<?php include ('client_display_photoid.php');?>" />

PHP:

<?php include ('connect.php');?>

<?php
$client_id = htmlspecialchars($_POST['client_id']);

// prepare stmt, bind param, execute
$stmt = $conn->prepare("SELECT mime, name, size, data FROM photoid WHERE client_id = ?");
$stmt->bind_param("s", $client_id);
$stmt->execute();

// bind results
$stmt->bind_result($mime, $name, $size, $data);


// Print headers
header("Content-Type: $mime");
header("Content-Length: $size");
header("Content-Disposition: attachment; filename = $name");

// Print data
echo $data;
?>

<?php include ('disconnect.php');?>

EDIT 1: после просмотра комментариев я смог избавиться от "пустого пространства", которое отображалось, удалив открытые теги PHP. Я также просмотрел предоставленную ссылку и изменил свой код следующим образом.

HTML:

<img width="300px" height="150px" src="data:image/jpeg;base64,<?php echo base64_encode( $data ); ?>" />

PHP:

<?php 
include ('connect.php');

$stmt = $conn->prepare("SELECT data FROM photoid WHERE client_id = ?");
$stmt->bind_param("s", $client_id);
$stmt->execute();

$stmt->bind_result($data);

include ('disconnect.php');
?>

Ниже показано, что отображается, когда я пытаюсь отобразить изображение:

<img width="300px" height="150px" src="data:image/jpeg;base64," />

EDIT 2:

Я пробовал следующий код... HTML:

<img src='client_display_photoid.php?client_id=182' />

PHP:

<?php 
include ('connect.php');

$sql='select 'mime','data' from 'photoid' where 'client_id' = ?';
$stmt=$conn->prepare( $sql );
if( $stmt ){

    $stmt->bind_param('s', $client_id );
    $result=$stmt->execute();
    $stmt->store_result();

    if( $result && $stmt->num_rows==1 ){

        $stmt->bind_result( $mime, $data );
        $stmt->fetch();
        $stmt->close();


        $data=base64_decode( $data );
        #$mime=image_type_to_mime_type( $mime );
        $oImg = imagecreatefromstring( $data );

        switch( $mime ){
            case IMAGETYPE_JPEG:
                header( 'Content-Type: image/jpeg' );
                imagejpeg( $oImg );
            break;
            case IMAGETYPE_PNG:
                header( 'Content-Type: image/png' );
                imagepng( $oImg );
            break;
            case IMAGETYPE_GIF:
                header( 'Content-Type: image/gif' );
                imagegif( $oImg );
            break;
        }
        imagedestroy( $oImg );
    }
}

include ('disconnect.php');
?>

Все, что я верну в браузере:

<img src='client_display_photoid.php?client_id=182' />
  • 0
    Я думаю, что это должно помочь вам: stackoverflow.com/q/7793009/2191572
  • 0
    Я бы предположил, что <img width="400" height="200" src="<?php include ('client_display_photoid.php');?>" /> Неверно и вряд ли произведет то, на что вы надеетесь ~, хотя и без видя его содержание, трудно понять. Хранение BLOB-объектов в БД означает, что БД потенциально вырастет до непропорционально большого размера по сравнению с количеством записей. Почему плохо хранить путь к изображению?
Показать ещё 10 комментариев
Теги:

2 ответа

0
Лучший ответ

Сегодня я столкнулся с этой связкой и обнаружил, что изменение моего PHP на следующее позволило мне просто использовать простой PHP INCLUDE в HTML для отображения изображения по своему желанию.

Похоже, что утверждение WHILE было трюком. Я также использовал некоторые из предложенных предложений и использовал ECHO-ing HTML в PHP-коде.

Большое спасибо всем, кто прокомментировал и помог.

PHP:

<?php
if (!empty($_POST['client_id'])) {
    // connect to database
    include ('connect.php');

    // prepare stmt, bind param, execute
    $stmt = $conn->prepare("SELECT data FROM photoid WHERE client_id = ?");
    $stmt->bind_param("s", $client_id);
    $stmt->execute();

    // bind results
    $stmt->bind_result($data);

    while ($stmt->fetch()) {
    }

    echo '<img width="300" src="data:image/jpeg;base64,'.base64_encode( $data ).'"/>';

    // close statement
    $stmt->close();

    // disconnect from databse
    include ('disconnect.php');
}
?>
0

Следующее должно помочь получить эту сортировку для вас - db хранит кодированные данные base64 как blob и создает изображение на лету, используя php и imagecreatefromstring. Следующий код работал для меня в тесте, поэтому с осторожностью вы должны иметь возможность изменить это, чтобы работать в вашей среде. Одно из отличий заключается в использовании целочисленного mimetype в db, а не в строке.

Вышеуказанный $ mime является целым числом, но с использованием image_type_to_mime_type на этом возвращенном значении будет image_type_to_mime_type строка типа mime. Это просто означает, что вам нужно изменить этот бит для работы со строками, а не с int.

mysql> describe photoid;
+-----------+---------------------+------+-----+---------------------+----------------+
| Field     | Type                | Null | Key | Default             | Extra          |
+-----------+---------------------+------+-----+---------------------+----------------+
| id        | int(10) unsigned    | NO   | PRI | NULL                | auto_increment |
| name      | varchar(50)         | NO   |     | NULL                |                |
| mime      | tinyint(3) unsigned | NO   |     | NULL                |                |
| size      | int(11)             | NO   |     | NULL                |                |
| data      | mediumblob          | YES  |     | NULL                |                |
| created   | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| client_id | varchar(50)         | NO   | MUL | NULL                |                |
+-----------+---------------------+------+-----+---------------------+----------------+

Изображение 174551


<?php

    /* display profile picture: photoid.php  */

    $client_id=!empty( $_GET['client_id'] ) ? filter_input( INPUT_GET, 'client_id', FILTER_SANITIZE_STRING ) : false;


    if( $client_id ){

        $dbhost =   'localhost';
        $dbuser =   'root';
        $dbpwd  =   'xxx';
        $dbname =   'xxx';
        $db     =   new mysqli( $dbhost, $dbuser, $dbpwd, $dbname );


        $sql='select 'mime','data' from 'photoid' where 'client_id' = ?';
        $stmt=$db->prepare( $sql );
        if( $stmt ){

            $stmt->bind_param('s', $client_id );
            $result=$stmt->execute();
            $stmt->store_result();

            if( $result && $stmt->num_rows==1 ){

                $stmt->bind_result( $mime, $data );
                $stmt->fetch();
                $stmt->close();


                $data=base64_decode( $data );
                #$mime=image_type_to_mime_type( $mime );
                $oImg = imagecreatefromstring( $data );

                switch( $mime ){
                    case IMAGETYPE_JPEG:
                        header( 'Content-Type: image/jpeg' );
                        imagejpeg( $oImg );
                    break;
                    case IMAGETYPE_PNG:
                        header( 'Content-Type: image/png' );
                        imagepng( $oImg );
                    break;
                    case IMAGETYPE_GIF:
                        header( 'Content-Type: image/gif' );
                        imagegif( $oImg );
                    break;
                }
                imagedestroy( $oImg );
            }
        }
    }

?>

Внутри html вы можете назвать это следующим образом:

<img src='photoid.php?client_id=5a60cc8780ee6' />

то есть:

<?php
    #include __DIR__ . '/db.php';
?>
<!doctype html>
<html>
    <head>
        <meta charset='utf-8' />
        <title>Display the PHP generated image</title>
    </head>
    <body>
        <!--

            The main content on the page will be, I guess, generated using PHP
            so a db lookup to get the records and render appropriate content

            $res=$db->query('select * from blah');
            while( $rs=$res->fetch_object() ){
                echo "content
                <img src='photoid.php?client_id={$rs->id}' />";
            }
        -->

        <img src='photoid.php?client_id=5a60e11e02d18' />
    </body>
</html>
  • 0
    Когда я пытаюсь использовать этот код в своем приложении, я просто получаю <img src = 'photoid.php? Client_id = 5a60cc8780ee6' />
  • 0
    хм ... client_id в примере / демо, которое я дал, относится к моей базе данных и этим результатам. Как вы использовали выше?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню