通过php中的函数使用sql访问数据库的最智能方式

时间:2016-01-15 17:38:23

标签: php mysql class content-management-system

我正在制作一个小型CMS,以获得一些乐趣和练习。我遇到过这个问题,我必须在不同的功能中多次访问数据库。我现在这样做的方法是用代码创建一个新的预处理语句,并且所有在函数中访问数据库并不是很方便,因为代码非常重复,而且我使用的代码大部分是相同的对于每个功能。那么我将如何创建一个类或一些函数来减少从该数据库收集信息的函数中使用的代码量?我目前在SQL

中使用以下查询
  • 选择
  • 更新
  • INSERT
  • DELETE

所以主要是基本的。我使用的代码是基本的PHP代码,我使用预准备语句来访问我的数据库,如下所示:

// Create database connection
$con = db_connect();

// Initialize $error variable for errors
$error = "";

if ($stmt = $con->prepare("SELECT * FROM profiles WHERE username = ?")) {
    // Bind the $username variable to the parameter in the query
    $stmt->bind_param('s', $username);

    // Execute the prepared query
    $stmt->execute();
    $stmt->store_result();

    // Assign the data recieved from the database (if any)
    $stmt->bind_result($data);
    $stmt->fetch();
    if ($stmt->num_rows == 1) {
        if (!empty($stmt->error)) {
            printf("Error: %s.\n", $stmt->error);
            return false;
        }
        // Query successful

    } else {
        $error .= "User doesn't exist";
        return false;
    }
} else {
    $error .= 'Could not connect to database';
    return false;
}

对我而言,这似乎很容易使用代码,但是当你必须在不同的函数中反复粘贴它时,它会有点令人沮丧。

1 个答案:

答案 0 :(得分:0)

您应该使用依赖注入。

通过将数据库连接注入到Profile的类中,您可以更自如地操作。

  • 您可以将该数据库更改为您想要的任何内容(MongoDB,Cassandra,MySQL)。
  • 您只是宣布连接一次;
  • 表现越来越好
  • 使测试和开发更容易(echo& print_r& unit testing)
  • Handel例外1个地方
  • 数据库与其余代码松散耦合。

例如:

class Profile {

    private $db = null;

    public function __construct($db Database) {
        $this->db = $db;
    }

    public function getProfile() {
         //ish....
         $this->db->query("SELECT * FROM profiles WHERE username = ?");

    }

    public function insert() {
        ...
    }

    public function update() {
        ...
    }

    public function delete() {
        ...
    }

}

要访问数据库,我会做这样的事情并实现你所拥有的(准备好的语句很棒!):

class Database {

    private $conn = null;

    public function __construct($db Database) {

        $this->conn = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);

        $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        return $this->conn;

    }

    public function query($sql) {

        try {

            return $conn->query($sql);

        } catch (Exception $e) {

            echo $e->getMessage();

        }

    }

}

可以在此处找到非常好的解释和教程:http://code.tutsplus.com/tutorials/dependency-injection-huh--net-26903