0

该脚本是Net tuts+上的开源教程,但我不知道如何更改脚本以连接数据库而不是文档随附的文本文件。

脚本在这里,我明白发生了什么......但我担心我可能不得不重新编程几乎所有东西或编写很多额外的代码,所以在我开始这样做之前,我想知道是否有更简单的方法来改变它。对于信息,我正在使用 PDO 和一个隐藏config.php文件用于数据库连接,$conn用作 PDO-DB 访问。

类的使用:

$rating = new ratings($_POST['widget_id']);
isset($_POST['fetch']) ? $rating->get_ratings() : $rating->vote();

评分等级:

class ratings
{
    private $data_file = './ratings.data.txt';
    private $widget_id;
    private $data = array();


    function __construct($wid)
    {
        $this->widget_id = $wid;

        $all = file_get_contents($this->data_file);

        if ($all) {
            $this->data = unserialize($all);
        }
    }
    public function get_ratings()
    {
        if ($this->data[$this->widget_id]) {
            echo json_encode($this->data[$this->widget_id]);
        } else {
            $data['widget_id']    = $this->widget_id;
            $data['number_votes'] = 0;
            $data['total_points'] = 0;
            $data['dec_avg']      = 0;
            $data['whole_avg']    = 0;
            echo json_encode($data);
        }
    }
    public function vote()
    {
        # Get the value of the vote
        preg_match('/rate_([1-5]{1})/', $_POST['clicked_on'], $match);
        $vote = $match[1];

        $ID = $this->widget_id;
        # Update the record if it exists
        if ($this->data[$ID]) {
            $this->data[$ID]['number_votes'] += 1;
            $this->data[$ID]['total_points'] += $vote;
        }
        # Create a new one if it doesn't
        else {
            $this->data[$ID]['number_votes'] = 1;
            $this->data[$ID]['total_points'] = $vote;
        }

        $this->data[$ID]['dec_avg']   = round($this->data[$ID]['total_points'] / $this->data[$ID]['number_votes'], 1);
        $this->data[$ID]['whole_avg'] = round($this->data[$ID]['dec_avg']);


        file_put_contents($this->data_file, serialize($this->data));
        $this->get_ratings();
    }

    # ---
    # end class
}
4

2 回答 2

1

似乎有两点可以为类导入/导出数据ratings

1) 在 中导入constructor,您在其中读取文件并将数据反序列化为名为 的类字段data

2)在函数中导出vote(),您将序列化data到所需的文件中。

此外,您有一个记者,这将是get_ratings().

您可以有多种方法,但我建议为类添加一个private $dbObject字段,该字段ratings应该是在构造函数中初始化的 PDO 对象。了解如何初始化和创建 PDO 连接。创建两个私有函数,将数据库导入导出过程封装在里面ratings,并在第1点和第2点调用它们。学习如何使用PDO准备和执行数据库命令。您还应该检查是否PDO::fetch从结果中检索数据。

您也可以将数据库通信封装(委托)到另一个类中,并在 中使用它ratings,这将是一个更好的抽象。

于 2013-01-12T10:29:01.160 回答
1

这只是一个模拟。关于如何做,希望对你有所帮助。

<?
class Vote
{
    private $_db;

    public function __construct() {
        // needs a db class
        $this->_db = DB::getInstance();
        // open connection or use existing
        $this->_db->connected or $this->_db->connect();
    }

    public function sum() {
        // get id securely or set it as NULL (@ makes it NULL silently)
        @ $ID = (int) $_POST['ID'];
        // Expr: if id !== null and id !== 0
        if ($ID) {
            // simply fetch all votes 
            return $this->_db->fetch("
                        SELECT SUM(`vote_point`) AS sums 
                        FROM `votes`
                        WHERE `ID` = $ID
                        ORDER BY sums");
        }
    }

    public function insert() {
        // get id securely or set it as NULL (@ makes it NULL silently)
        @ $ID = (int) $_POST['ID'];
        // Expr: if id !== null and id !== 0
        if ($ID) {
            // get vote point securely or set it as NULL
            $votePoint = !isset($_POST['votePoint']) ? NULL : intval($_POST['votePoint']);
            // vote point is number, so not NULL?
            if (is_int($votePoint)) {
                $this->_db->query("
                    INSERT INTO `votes` (`ID`, `vote_point`) 
                    VALUES ($ID, $votePoint)");
            }
            // yield last inserted row id (ID)
            return $this->_db->insertId();
        }
    }
}
于 2013-01-12T15:24:23.053 回答