【问题标题】:php code to a class? [closed]php代码到一个类? [关闭]
【发布时间】:2014-01-17 15:54:21
【问题描述】:

如何将这两个代码 sn-ps 放在一个类中,以便数据库处理在一个类中?像一个PDO连接或者把所有与数据库有关的都放在一个类中,你们会怎么做呢?

以下是来自不同文件的两部分代码。我正在尝试开发一个博客应用程序。

<?php
mysql_connect("localhost", "root", "")or die(mysql_error());
mysql_select_db("blogg1")or die(mysql_error()); 
if(isset($_POST["submit"])){
$title = $_POST["title"];
$category = $_POST["category"];
$content = $_POST ["content"];

mysql_query("INSERT INTO blogdata(title , category , content) VALUES('$title', '$category', '$content')");  
}else{
?>



<?php
        mysql_connect("localhost", "root", "")or die(mysql_error());
        mysql_select_db("blogg1")or die(mysql_error());
        $sql = mysql_query("SELECT * FROM blogdata ORDER BY id DESC")or die(mysql_error());;
        while($row = mysql_fetch_array($sql)){
        $title = $row["title"];
        $category = $row["category"];
        $content = $row["content"];


        ?>

        <table border = "1">
        <tr><td><?php echo $title; ?></td><td><?php echo $category; ?></td></tr>
        <tr><td colspan="2"><?php echo $content; ?></td></tr>
    </table>
        <?php
        }
        ?>

【问题讨论】:

  • 没什么奢侈的,你到底想知道什么
  • 您绝对应该使用 PDO 而不是 mysql_* 函数,因为 mysql_* 函数已被弃用
  • 正如帕特里克所说,不要使用那些旧功能。另外,它只会破坏在类中使用当前代码的目的。这有点像尝试在法拉利中使用柴油燃料 ;-)

标签: php database class


【解决方案1】:

首先,您应该将数据库凭据保存在一个单独的 PHP 文件中,该文件位于 Web 无法访问的文件夹中,例如 ~/lib/db.php

<?php
    define('SQL_HOST', 'localhost');
    define('SQL_DATABASE', 'your-db-name');
    define('SQL_USER', 'your-db-user');
    define('SQL_PASS', 'your-db-password');
?>

然后是你的数据库类(也在 ~/lib 中):

<?php
    require_once('~/lib/db.php');
    require_once('~/lib/BlogData.php');
    class Database
    {
        protected $db = null;

        function __construct()
        {
            // db connection options
            $driverOptions = array(
                PDO::MYSQL_ATTR_INIT_COMMAND    => "SET NAMES 'utf8'",
                PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE    => PDO::FETCH_OBJ,
                PDO::ATTR_EMULATE_PREPARES      => false
            );

           // set new connection
           $this->db = PDO(
               "mysql:dbname=".SQL_DATABASE.";host=".SQL_HOST,
               SQL_USER, SQL_PASS, $driverOptions
           );               
        }

        // This function lets you fetch blog data using any sort order you'd like and any WHERE criteria you want
        function getBlogData($where = "1", $orderBy = "id DESC")
        {
            $stmt = $this->db->prepare("
                SELECT * 
                FROM {'blogdata'} WHERE $where
                ORDER BY $orderBy
            ");
            $blogData = Array();
            if ($stmt->execute())
            {
                while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
                    $oneBlogData = new BlogData($this);
                    $oneBlogData->init($row);
                    $blogData[] = $oneBlogData;
                }
            }
            return $blogData;
        }

        function insertBlogData(BlogData $blogData)
        {
            $stmt = $this->db->prepare("
                INSERT INTO {'blogdata'} (title , category , content) VALUES
                (:title, :category, :content);
            ");

            $stmt->bindParam(':title', $blogData->title, PDO::PARAM_STR);
            $stmt->bindParam(':category', $blogData->category, PDO::PARAM_STR);
            $stmt->bindParam(':content', $blogData->content, PDO::PARAM_STR);
            $stmt->execute();  
        }
    }
?>

然后我会为你的博客数据定义另一个类:

<?php
    class BlogData {
        public $title;
        public $category;
        public $content;
        private $db;

        function __construct(Database $db)
        {
            $this->db = $db;
        }
        function init($dbRow)
        {
            $this->title = $dbRow['title'];
            $this->category = $dbRow['category'];
            $this->content = $dbRow['content'];
        }
        function save()
        {
           // TODO: Write sql statement to save the row...
        }
    }
?>

然后您的第一段代码可以创建一个新的 BlogData 条目,如下所示:

<?php
    require_once('~/lib/Database.php');
    $db = new Database();
    if(isset($_POST["submit"]))
    {
        $blogData = new BlogData($db);
        $blogData->title = $_POST["title"];
        $blogData->category = $_POST["category"];
        $blogData->content = $_POST["content"];
        $db->insertBlogData($blogData);
    }
?>

您的第二个代码块可能如下所示:

<?php
    require_once('~/lib/Database.php');
    $db = new Database();
    $blogDataArray = $db->getBlogData("1", "id DESC");
    echo "<table border = '1'>";
    foreach($blogDataArray as $blogData)
    {
        echo "<tr><td>" . $blogData->title . "</td><td>" . $blogData->category . "</td></tr>";
        echo "<tr><td colspan='2'>" . $blogData->content . "</td></tr>";
    }
    echo "</table>";
?>

这也使得修改 BlogData 条目变得非常容易 - 只需使用 getBlogData 函数从数据库中获取博客数据,只需更改对象的值并调用 save 即可修改对象。例如:

<?php
    // ... 
    $newContent = "New Content";
    $blogData = $db->getBlogData("id='1'");
    $blogData->content = $newContent;
    $blogData->save();
?>

我还应该指出,您的博客数据条目需要一些独特的字段。有了一些 id,写 addToDatabase 并保存在一个函数中会更容易。

【讨论】:

  • 尽管你花了很多时间发布这个答案,但遗憾的是它已经过时并且充满了极其糟糕的编码实践,这就是我给你 -1 的原因,因为你的答案可能会鼓励那些当他们不应该时,通过谷歌到达这里使用它。我们在这个时代拥有 PDO,它取代了对过时的 mysql_* 扩展的需求。
  • 之所以使用mysql_*,是因为OP明显不熟悉PDO,对PHP比较陌生。他正在寻找一种将他的代码拆分为类的方法,这就是我使用他熟悉的实践向他展示的方法。这样他就不会因为必须同时计算类和 PDO 而感到不知所措。我什至最后说要使用 PDO,但至少这为 OP 提供了一种分离类的方法,然后只需更改 Database 类即可更新到 PDO。
  • 这是你不应该做的,如果你看到有人走错了路,那么通过展示正确的方式来帮助他们,而不是进一步污染已经污染的话题。如果您愿意将示例更改为 PDO,我很乐意删除我的反对票。
  • 我不是故意对你粗鲁(现在给你赞成票),但是请尝试引导人们纠正方法,而不是为他们修复代码,让他们用糟糕的编码跑掉实践。
  • 没问题。我确实理解,我只是想回答这个家伙的问题,而不会因为太多的变化和最佳实践而让他感到困惑。但你是对的 - 我们不想通过使用过时的代码发布答案来强化不良做法。
【解决方案2】:

代码示例如下:

class SomeClass {

    protected $db = null;
    protected $table = 'blogdata';

    public function __construct()
    {
        // db connection options
        $driverOptions = array(
            PDO::MYSQL_ATTR_INIT_COMMAND    => "SET NAMES 'utf8'",
            PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE    => PDO::FETCH_OBJ,
        );

        // set new connection
        $this->db = PDO(
            "mysql:dbname=blogg1;host=localhost",
            'root', '', $driverOptions
        );
    }

    public function save($data)
    {
        // prepare your data
        $title = $data["title"];
        $category = $data["category"];
        $content = $data ["content"];

        // prepare statement
        $stmt = $this->db->prepare("
            INSERT INTO {$this->table} (title , category , content) VALUES
            (:title, :category, :content);
        ");

        $stmt->bindParam(':title', $title, PDO::PARAM_STR);
        $stmt->bindParam(':category', $category, PDO::PARAM_STR);
        $stmt->bindParam(':content', $content, PDO::PARAM_STR);
        $stmt->execute();       
    }

    public function getRecords()
    {
        $stmt = $this->db->prepare("
            SELECT * 
            FROM {$this->table} 
            ORDER BY id DESC
        ");
        $stmt->execute();
        return $stmt->fetchAll();
    }
}

还有一个用法示例:

<?php

require_once('SomeClass.php');
$ent = new SomeClass();

if (isset($_POST["submit"])) {
    $ent->save($_POST);
} 
else {

    // get and output
    $records = $ent->getRecords();

    if (count($records) > 0) {
?>
<table>
    <?php
        foreach ($records as $record) {
            echo "<tr><td>{$record->title}</td><td>{$record->category}</td></tr>
            <tr><td colspan='2'>{$record->content}</td></tr>";
        }
    ?>
</table>

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 2010-10-30
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多