我一直在尝试在PHP中显示最近3个小时的图像。我关注了如何实现这一点的几个线程,并在stackoverflow和其他论坛上传递了2个小时来尝试解决问题。
以下代码是我使用的代码的减少。 (我有更多的代码来处理jpeg,png和不同的SQL表)
MySQL设置
我有一个名为 teams 的表,其中我有以下3个值: id , image 和 mime
当前的PHP代码
我有一个名为show_image.php的文件,我为其传递了一个id以获得正确的图像。
if(isset ($_get['id'])) {
$id = $mysqli->real_escape_string($_GET['id']);
$query = 'SELECT `image` FROM `teams` WHERE `id` = ?';
if ($stmt = $mysqli->prepare($query)) {
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows == 1) {
$stmt->bind_result($image);
$stmt->fetch();
header('Content-Type: image/jpeg'); // I can use the DB query to change the type is needed
echo $image;
}
}
}
就像每个人在互联网上说的那样,我只是在我的html文件中访问图像
<img src="show_image.php?id=1" />
结果
当我调用php代码(或直接转到路径/show_image.php?id=1)时,我收到一条消息“无法显示图像[URL],因为它包含错误”。 (我多次对谷歌和DuckDuckGo这个错误。)
我最接近它的工作是当我评论标题的行('Content-Type:image / jpeg'); 我可以看到二进制代码(转换为字符)对于图像。虽然当我检查页面的属性时,它从image / jpeg更改为text / html(如预期的那样)
我还尝试用
替换 echo $ image;$img = imagecreatefromjpeg($image);
$imagejpeg($img);
$imagedestroy($img);
但它也不起作用。
编辑 - 在数据库中插入图像
if (isset ($_FILES) && is_array($_FILES)) {
$filename = $_FILES['team-logo']['name'][0];
$filesize = $_FILES['team-logo']['size'][0];
$filetype = $_FILES['team-logo']['type'][0];
if (substr($filetype,0,5) == "image") {
$imagedata = $mysqli->real_escape_string(file_get_contents($_FILES['team-logo']['tmp_name'][0]));
} else {
$error_msg .= '<p class="error">You need to select and image</p>';
}
}
if (empty($error_msg)) {
if ($insert_stmt = $mysqli("INSERT INTO `teams` (`id`, `image`, `mime`) VALUES ('', ?, ?)")) {
$insert_stmt->bind_param('ss', $imagedata, $filetype);
if (! $insert_stmt->execute()) {
//Display error
}
//Else image was inserted successfully
}
}
有人知道如何解决这个问题吗?
答案 0 :(得分:3)
问题很可能是因为您使用real_escape_string
转义二进制数据,然后通过绑定参数存储它。
将插入代码更改为以下内容...
$imagedata = file_get_contents($_FILES['team-logo']['tmp_name'][0]);
// snip
if ($insert_stmt = $mysqli("INSERT INTO `teams` (`image`, `mime`) VALUES (?, ?)")) {
$insert_stmt->bind_param('ss', $imagedata, $filetype);
if (! $insert_stmt->execute()) {
//Display error
}
//Else image was inserted successfully
}
为了说明问题,请说明您的二进制数据包含以下内容......
1234'5678
通过real_escape_string
运行此操作会产生类似这样的内容
1234\'5678
或
1234''5678
取决于MySQL当时如何逃避字符串。
将此绑定到 insert 语句时,这些转义字符将字面存储,从而破坏二进制数据。
绑定参数是将值注入查询的最安全方法。您不需要清理这些值字符串,以便在查询中安全使用。