修复升级discuz后,附件下载提示“抱歉,该附件无法读取”的问题

10 12 月

经过检查数据库,发现是数据库forum_attachment中tableid的数值不正确造成的,修复对应关系即可,修复代码如下(请注意修改高亮的行):

<?php
/**
 * @name AlonePHP
 * @version 0.1
 * @author Tom <tom@awaysoft.com>
 * @date 2014-08-20
 * @description AlonePHP是一个单文件框架,适用于制作简单的小工具,支持网页及命令模式
 * @copyright Apache License, Version 2.0
 */
define('ALONE_ROOT', dirname(__FILE__));
define('IS_CLI', php_sapi_name() === 'cli');

$config = [
        'db' => [
                'dsn' => 'mysql:host=localhost;dbname=gtk',
                'user' => 'gtk',
                'pass' => 'gtk',
                'driver_options' => [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';"]
        ],
];

$attachDBs = [];

function findTable($aid) {
        global $attachDBs;
        for ($i = 0; $i <=9; ++$i) {
                $table = $attachDBs[$i];
                foreach ($table as $row) {
                        if ($row['aid']  === $aid) {
                                return $i;
                        }
                }
        }
        return -1;
}

function IndexController() {
        $db = new Db();
        global $attachDBs;
        $table_pre = 'gtk_forum_attachment';
        for ($i = 0; $i <= 9; ++$i) {
                $sql = "select * from {$table_pre}_{$i}";
                $rs = $db->query($sql);
                $result = $rs->fetchAll(PDO::FETCH_ASSOC);
                array_push($attachDBs, $result);
        }
        $sql = "select * from {$table_pre}";
        $rs = $db->query($sql);
        $result = $rs->fetchAll(PDO::FETCH_ASSOC);
        foreach($result as $row) {
                $aid = $row['aid'];
                $tid = findTable($aid);
                if ($tid !== -1) {
                        $sql = "update {$table_pre} set tableid={$tid} where aid={$aid}";
                        echo $aid . ':' . findTable($aid) . "\n";
                        $db->exec($sql);
                }
        }
}

/**
 * 默认控制器
 * Default Controller
 */
if (!function_exists('IndexController')) {
        function IndexController() {
                template('Index');
        }
}

/**
 * 默认控制器模板
 * Default Controller Template
 */
if (!function_exists('IndexTemplate')) {
        function IndexTemplate($args) {
                echo IS_CLI ? "欢迎使用AlonePHP框架\n" : '<meta charset="utf-8">欢迎使用AlonePHP框架';
        }
}

/**
 * 初始化函数,可以做权限验证,数据初始化等等
 * Initiazation Function, you can use it to check author or others
 */
if (!function_exists('init')) {
        function init() {

        }
}

/**
 * 框架运行函数
 * Framework run function
 */
function run() {

        /* 初始化 */
        init();
        /* 获取控制器 */
        if (IS_CLI) {
                /* 获取命令模式控制器 */
                $controller = param_get(1);
        } else {
                /* 获取网页模式 */
                $controller = get('c');
        }
        if (!$controller) {
                $controller = 'Index';
        }

        /* 移交控制权到相应的控制器 */
        controller($controller);
}

/**
 * @description 模板输出接口函数(Template function)
 * @param string $name 模板名称/Template Name
 * @param mixed  $args 传递到模板的参数,建议用关联数组/Template Args, better using relate array.
 */
function template($name, $args = '') {
        $templateName = $name . 'Template';
        if (function_exists($templateName)) {
                $templateName($args);
        } else {
                template('Error', "模板函数{$templateName}未找到!");
        }
}

/**
 * @description 控制器接口函数
 * @param string $name 控制器名称/Controller Name
 */
function controller($name) {
        $controllerName = $name . 'Controller';
        if (function_exists($controllerName)) {
                $controllerName();
        } else {
                template('Error', "控制器函数{$controllerName}未找到!");
        }
}

/**
 * @description 程序打开参数个数
 * @return integer 返回程序的参数个数 The Number of Params
 */
function param_count() {
        if (IS_CLI) {
                global $argc;
                return $argc - 1;
        } else {
                return 0;
        }
}

/**
 * @description 获取程序参数
 * @param integer $index, 参数的位置(The position of params)
 * @return string|boolean 返回第index个参数的值,The value of Params[$index];
 */
function param_get($index) {
        if (IS_CLI) {
                global $argc, $argv;
                if ($index >= $argc) {
                        return false;
                } else {
                        return $argv[$index];
                }
        } else {
                return false;
        }
}

/**  GET方法
 * @param string $name GET参数/The key of GET
 * @param string $filter 过滤函数/Filter function
 * @param string $default 默认值/Default Value
 * @return string
 */
function get($name, $filter = 'htmlspecialchars', $default = '') {
        if (!isset($_GET[$name])) {
                $result = $default;
        } else {
                $result = $_GET[$name];
        }
        return $filter($result);
}

/**  POST方法
 * @param string $name POST参数/The key of POST
 * @param string $filter 过滤函数/Filter function
 * @param string $default 默认值/Default Value
 * @return string
 */
function post($name, $filter = 'htmlspecialchars', $default = '') {
        if (!isset($_POST[$name])) {
                $result = $default;
        } else {
                $result = $_POST[$name];
        }
        return $filter($result);
}

/* 默认输出错误信息函数
Default Error Template
 */
function ErrorTemplate($args) {
        echo $args;
}

/* 数据库类,继承自PDO */
class Db extends PDO{
    private $config = [
        'dsn' => '',
        'user' => '',
        'pass' => '',
        'driver_options' => []
    ];

    public function __construct($configNew = null) {
        if (!$configNew) {
                global $config;
            $configNew = $config['db'];
        }
        $this->config = array_merge($this->config, $configNew);
        try {
            parent::__construct($this->config['dsn'], $this->config['user'], $this->config['pass'], $this->config['driver_options']);
        } catch (Exception $e) {
            trigger_error('数据库连接失败:' . $e->getMessage(), E_USER_ERROR);
        }
    }
}

/* 运行框架
Run Framework
 */
run();

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注