【问题标题】:load default image if database connection fails如果数据库连接失败,则加载默认图像
【发布时间】:2015-07-07 01:49:44
【问题描述】:

我正在尝试构建一个数据库驱动的站点,通过这样的 php 脚本加载图像;

<img src="get_image.php?holderID=2">

当数据库可访问时,我可以从根目录之外的文件夹加载图像,但如果建立数据库连接失败,我也希望能够加载默认图像。 DB连接是从一个单独的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 设置一些常量,其中一个用于所有 DB 连接;

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 数据库,则默认图像不可用.png 将不会加载,即使代码的标头和 readfile 部分在有效的代码部分中几乎相同。我是这一切的新手,所以任何关于加载默认图像的想法都将不胜感激。

【问题讨论】:

  • 需要(MYSQL)?另外,文件是否存在 (file_exists($image_name))?
  • @Mindastic REQUIRE(MYSQL) 建立数据库连接。这适用于我上传图像,将文件名写入数据库,然后使用数据库中的文件名成功加载图像。文件默认图像加载在有效的代码部分中是相同的,因此它确实存在。
  • 为什么不复制数据库连接时完全相同的代码,而只需将查询等替换为静态默认值?
  • @TurdPile 我已经编辑了原始问题以包含使用相同的默认图像文件和标题/读取文件组合工作的数据库查询和图像传输代码。据我所知,对于数据库连接测试的任一结果,它们基本上是相同的,因此我很困惑。
  • 您是否检查过您的图像实际上是一个带有if(is_file($image_name )) { ...etc 之类的文件?

标签: php mysql image


【解决方案1】:

根据您使用的数据库对象(MySQLi/PDO/等),您可以检查它们是否连接。 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 */ }

注意:请确保使用正确的图像标题。

【讨论】:

  • 我是个新手,只研究小东西,所以我没有冒险进入 PDO。我根据 php 连接文件中的 get_image.php 文件使用了类似的连接条件,它似乎可以工作。事实上,我认为问题不是连接测试,因为当连接建立后,我的所有其他代码都可以工作,事实上,如果有其他数据库错误,我什至从同一位置加载相同的图像作为丢失的文件等。
  • 抱歉,我完全错过了第一个显示你使用 mysqli 的块。
【解决方案2】:

代替

$dbc = @mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

使用

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

希望它应该工作..

【讨论】:

  • 谢谢,@ 符号只会禁止显示任何连接错误。无论如何我都试过了,但没有运气。
  • 打印您在 $dbc 中得到的内容,以检查您是否处于“if”状态。
  • php 连接文件中的条件有效,即` if(!$dbc) { trigger_error('Could not connect to MySQL: ' . mysqli_connect_error() ); } else { mysqli_set_charset($dbc, 'utf8'); }`。如果我禁用 MYSQL,则会收到错误消息。在设置 $dbc 的任何地方都不应该进行相同的测试吗? $dbc 是 mysqli 连接变量,所以我不确定你打印它是什么意思。
【解决方案3】:

我有类似的代码可以做几乎相同的事情。

我怀疑它是标题,因为我在标题中添加了更多信息。你试试看没有坏处。

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);

【讨论】:

  • 我尝试了额外的标题,但它仍然不起作用。我还尝试在标题中使用特定的文件属性,因为只有一个默认图像,例如; header("Content-Type: image/png");
猜你喜欢
  • 2020-08-16
  • 1970-01-01
  • 2019-10-23
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多