我正在尝试构建一个数据库驱动的站点,通过这样的PHP脚本加载图像;
<img src="get_image.php?holderID=2">
当数据库可访问时,我可以从根目录外的文件夹加载图像,但是如果发生数据库连接失败,我还希望能够加载默认图像。数据库连接从单独的php连接文件mysqli_template_connect.php;
启动DEFINE('DB_USER', 'someusername');
DEFINE('DB_PASSWORD', 'amnesia');
DEFINE('DB_HOST', 'localhost');
DEFINE('DB_NAME', 'template');
$dbc = @mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
然后config.inc.php设置一些常量,其中一个用于所有数据库连接;
define('MYSQL', '../../../dbconnect/mysqli_template_connect.php');
然后get_image.php文件具有条件的数据库连接;
require('includes/config.inc.php');
REQUIRE(MYSQL);
$holderID = $_GET['holderID'];
if(!$dbc){
$image_name = 'img/unavailable.png';
$info = getimagesize($image_name);
header("Content-Type: {$info['mime']}\n");
readfile($image_name);
}
else {
$query = "SELECT imageID FROM image_holder WHERE image_holderID = $holderID ";
$result = @mysqli_query($dbc, $query);
$number_rows = mysqli_num_rows($result);
if ($number_rows == 1) {
$row = mysqli_fetch_array($result, MYSQLI_NUM);
$imageID = $row[0];
}
else {
$imageID = FALSE;
}
if ($imageID) {
$query = "SELECT file_name FROM image WHERE imageID = $imageID";
$result = mysqli_query($dbc, $query);
$number_rows = mysqli_num_rows($result);
if ($number_rows == 1) {
$row = mysqli_fetch_array($result, MYSQLI_NUM);
$image_name = '../../../uploads/' . $row[0];
}
else {
$image_name = 'img/unavailable.png';
}
}
else {
$image_name = 'img/unavailable.png';
}
$info = getimagesize($image_name);
header("Content-Type: {$info['mime']}\n");
readfile($image_name);
mysqli_close($dbc);
}
如果我在XAMP中禁用MYSQL数据库,即使代码的头部和readfile部分在有效的代码部分中几乎相同,也不会加载默认的映像unavailable.png。我对这一切都是一个新手,所以任何关于加载默认图像的想法都会受到赞赏。
答案 0 :(得分:1)
根据您使用的数据库对象(MySQLi / PDO / etc),您可以检查它们是否已连接。 PDO返回一个可以运行的布尔值。
由于PDO是最受欢迎的,我将提供一个例子。如果您使用其他内容,请随时发表评论,我可以澄清。
$connected = true;
if (!extension_loaded('PDO'))
{
$connected = false;
}
if (!extension_loaded('pdo_mysql'))
{
$connected = false;
}
try
{
$pdo = new PDO("mysql:host={$host};dbname={$db}", $user, $pass);
}
catch(PDOException $e)
{
$connected = false;
}
if(!$connected){ /* Load default image */ }
注意:只需确保使用正确的图片标题。
答案 1 :(得分:0)
而不是
$dbc = @mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
使用
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
希望它应该有用..
答案 2 :(得分:0)
我有类似的代码,几乎完全相同。
我怀疑它是标题,因为我在标题中添加了更多信息。尝试不会对你造成伤害。
header('Content-Description: File Transfer');
header('Content-Type: '. $file_content_type);
header('Content-Length: ' . filesize($file_full_path));
header('Content-Disposition: inline; filename=' . $file_name);
readfile($file_full_path);