php - 使用 PHP 准备好的语句从 SQL 数据库显示 HTML 图像

标签 php html mysql

我正在构建一个用于客户关系管理的内部应用程序。

这个应用程序相当简单。它收集客户信息并存储以供以后使用。

收集的信息的一部分是客户带照片的身份证明图像。我将此图像存储在 mySQL 数据库中其自己的表中。

我一直在寻找一种在小预览窗口中与客户信息(姓名、地址等)一起显示图像的方法。我找到的可能解决方案非常陈旧并且目前已经过时,或者指的是显示图像,其中仅文件的 URL 存储在数据库中,而图像本身保存在服务器上的文件夹中。

我当前的代码除了空白之外不显示 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');?>

编辑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," />

编辑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' />

最佳答案

以下内容应该可以帮助您解决此问题 - 数据库将 base64 编码数据存储为 blob,并使用 php 和 imagecreatefromstring 动态创建图像。下面的代码在测试中对我有用,因此您应该能够小心地修改它以在您的环境中工作。一个区别是在数据库中使用整数 mimetype 而不是字符串。

上面的 $mime 是一个整数,但在返回值上使用 image_type_to_mime_type 将产生 mime 类型字符串。这只是意味着您必须修改该位才能使用字符串而不是整数。

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                |                |
+-----------+---------------------+------+-----+---------------------+----------------+

enter image description here

<小时/>
<?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>

关于php - 使用 PHP 准备好的语句从 SQL 数据库显示 HTML 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48324779/

相关文章:

php - beforeFilter() 没有被调用?

php - Symfony 2文件上传设置默认文件

javascript - 我需要根据内容隐藏表行

MYSQL LIKE IN/匹配子字符串

php - 当列数等于一或二时,如何找到两个表的唯一结果?

PHP + MySQL 循环队列

php - PHP foreach 循环在重叠日期时间上出现问题

php - 如何在第一次按键时从数据库获取数据

javascript - 如果值为 0,我可以隐藏文本框值吗?

javascript - 如何使用 JavaScript 操作 HTML 元素