使用PHP从数据库显示图像

时间:2017-06-03 16:36:15

标签: php html database image

我在显示保存在数据库中的网址的图片时遇到问题。

这是我的HTML源代码:

<div id="posts">
<img id="images" src="php/getImage.php?id=1">
<footer>            
<a href="php/getImage.php?id=1" download><p>Download</p></a>
</footer>
</div>

我的getImage.php文件:

<?php
$id = $_GET['id'];
$db = mysqli_connect("host", "username", "password", "DB name");
$sql = "SELECT image FROM images WHERE imageID=$id";
$result=mysql_query($sql);
mysql_fetch_array($result);
echo "images/$result";  
?>

2 个答案:

答案 0 :(得分:1)

这里有多个问题:

1)停止使用Mysql_个功能并使用仅限 mysqli_个功能(或PDO)。 Mysql_ PHP函数已弃用且不再受支持(并且已有5年以上!)。这是不安全的,只会变得更糟。

2)您的PHP文件只是echo字符串images/someimagename.jpg;这不是图像文件,您需要输出此文件名字符串的内容

3)您当前的SQL很容易注入SQL,目前非常不安全。您的数据库很容易被恶意网页访问者破坏/滥用。

4)您的mysqli_fetch_array需要分配给变量,以便使用数组中的值。

5)使用单引号而不是双引号进行数据库身份验证,以便特殊字符(例如$) - 尤其是密码 - 不会被PHP误解。

解决上述问题:

<?php
// id is assumed to be an integer value.
// This prevents SQL injection and database compromise by forced
// typecasting of the data to integer.
$id = (int)$_GET['id'];

$db = mysqli_connect('host', 'username', 'password', 'DB name');
$sql = "SELECT image FROM images WHERE imageID=".$id." LIMIT 1"; 

// only use mysqli_ functions.
$result=mysqli_query($db, $sql);

// assign to a $variable
$output = mysqli_fetch_array($result);

//The [ relative :( ] URL of the resoure requested:
$file = "images/".$output['image'];

// Before the data is output we need to set the correct header so the 
// browser knows what sort of file to expect.
$image_mime = image_type_to_mime_type(exif_imagetype($file));    
header("Content-type: " . $image_mime);

// Grab and output the raw data in the filepath stored in the URL.
print readfile($file);

// If this is the end of thefile you should not use a closing PHP tag.   
// ?> 

如果您没有启用PHP Exif Extension,则可以使用fileinfomime_content_type以各种其他(可能更详细)的方式输出图像类型。

  

请注意:
  您的图片网址为 relative ,因此,由于文件getImage.php位于php文件夹中,所请求的图片将位于php/images/<filename>路径中。如果这不是存储图像的位置,则需要调整图像路径网址并使其正确,或使用强烈推荐的absolute HTML pathing

答案 1 :(得分:0)

随问题发布的代码使用了mysql_query / mysql_fetch_array,不再使用它在PHP中使用。即使已弃用mysql_*版本,此部分

也是如此
mysql_fetch_array($result);
echo "images/$result"; 
发布的代码

$row = mysql_fetch_array($result, MYSQL_ASSOC); 
echo "images/".$row["image"];

(我没有测试过这段代码,因为我的机器中的PHP版本高于5.5,不支持mysql_ *扩展)。

每行都需要从SQL查询的结果($result)中获取。从获取的行($row)中,可以使用列标题(image)访问每个单元格。

在getimage.php中尝试以下代码,

<?php
    $id = $_GET['id'];

    $db = new mysqli("host", "username", "password", "DB name");
    $sql = "SELECT image FROM images WHERE imageID=$id";

    $result=$db->query($sql);

    $row = $result->fetch_assoc();

    echo 'images/'.$row['image'];
?>

仅供参考,mysqli支持程序和面向对象的编程范例。 http://php.net/manual/en/mysqli.quickstart.dual-interface.php