【问题标题】:PHP change file communication to database communicationPHP将文件通信改为数据库通信
【发布时间】:2013-01-12 10:13:06
【问题描述】:

此脚本是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
}

【问题讨论】:

  • 你为什么用丑陋的var关键字?这已被弃用,这样$data_file 属性将被定义为公共。
  • 正如我在上面的文字中描述的 - 这是一个来自 Net tuts+ 的开源教程..
  • 看起来源代码没有修改,但是文章本身已经修改了,看看文章中说“我们首先要看的是类的开始,更具体地说,是构造函数。” 顺便说一句,我下载了它,不幸的是它的代码很丑。

标签: php database file pdo


【解决方案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();
        }
    }
}

【讨论】:

  • 顺便说一句.. private $_db; 指的是我隐藏的配置连接,对吧?
  • 它指的是你的 db 对象、PDO 或类似的东西。
  • 是的..这就是我的想法..这个脚本中唯一缺少的是返回数据的 json 编码..
【解决方案2】:

似乎有两个点可以导入/导出类 ratings 的数据。

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

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

另外,您有一个记者,即get_ratings()

您可以有多种方法,但我建议为 ratings 类添加一个 private $dbObject 字段,该字段应该是在构造函数中初始化的 PDO 对象。 Learn how to initialize and create a PDO connection.创建两个私有函数来封装ratings内部的数据库导入和导出过程,并在第1点和第2点调用它们。Learn how to prepare and execute a database command with PDO.您还应该检查PDO::fetch从结果中检索数据。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多