我在显示保存在数据库中的网址的图片时遇到问题。
这是我的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";
?>
答案 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,则可以使用fileinfo
或mime_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