0

我多年来一直在使用 PHP 和 MySQL,但从未在正式环境中使用过。我用它来简化我的工作,并编写了很多我自己的商业网站,但我没有被聘为程序员,而且从来没有。不过,我希望开始做一些自由职业,我想知道一些最佳实践是什么。

我总是使用 getter 类从 mysql 检索数据,并使用 setter 类将数据输入 mysql,我将连接类传递给它。每个 mySQL 表和字段名称都有自己的常量定义在常量包含文件中。我通常做的是将常量直接输入到 setter 或 getter 类中,而不是将它们作为变量传递。这样做让生活更轻松、更快捷,但它确实违背了我对类中的函数应该是独立的东西的理解。

为了清楚起见,这是我通常做的一个例子:

常量.inc.php

define('TABLE_NAME','table_name');

dbase_getters.class.php

public function get_data($connection){
    $query = "SELECT * FROM " . TABLE_NAME;
    $result = $connection etc...
}

还是我应该这样做?

dbase_getters.class.php

public function get_data($connection, $table_name){
    $query = "SELECT * FROM " . $table_name;
    result = $connection etc...
}

通过传递变量似乎更麻烦,特别是因为如果我想通过添加一个新字段来更改函数的参数进行搜索,我必须找到函数调用的每个实例并更改它们,而如果我使用常量,我只需要将它们添加到函数中。

此外,当涉及到诸如声明常量​​之类的事情时,我总是使用单引号。但是当我创建字符串时,我总是使用双引号。这是否不一致,我是否应该一直使用一种类型的报价?

谢谢!

4

5 回答 5

2

当然,您可以两种方式都这样做,我认为两者都同样不可取。动态创建 SQL 字符串既难以保护又容易出错。

我建议您尝试许多现成的库之一,例如:

http://www.doctrine-project.org/

http://propelorm.org/

这些就是所谓的“ORM”——对象关系映射器。这些将帮助你实现你 - 所以我相信 - 正在努力做的事情。

还有其他方法可以解决这个问题,我曾经使用过 Pear DB(现在是 MDB2,http ://pear.php.net/package/MDB2 ),它不像 ORM 那样高级。这也将帮助您解决设计问题。

数据库访问是一个需要解决的常见问题,很多人以前都做过,使用他们已经发现的东西,不要重新发明轮子!尝试使用 ORM。它非常令人满意,并且比处理 SQL、行、结果集和连接对象更自然。

于 2013-04-18T06:08:43.943 回答
1

要使用 MVC 术语...包含所有业务逻辑的模型应该在某处有一个明确定义的函数,该函数从数据库中获取某种特定类型的数据。说,像这样:

function getUserByUsername($username) {
    $query = 'SELECT ... FROM users WHERE name = :username';
    ...
    return $user;
}

通过用户名从数据库中检索用户是您的应用程序可以执行的一项特定的、独特的操作。为它做一个函数。它使您的应用程序更加结构化。不要制作一个通用的 SQL 包装器并向其传递大量不同的变量,这只会在您的应用程序中不必要地扩散您的数据库逻辑。

于 2013-04-18T06:09:08.470 回答
1

对于定义常量,我使用与 OP 相同的方法。

我建议你为你的持久层研究这些模式:

DAO(数据访问对象)模式

工厂模式

除此之外,还有可能使用 ORM 框架

在我看来,你做对了。(请记住,有诸如为 php 查询准备好的语句之类的东西)

于 2013-04-18T07:11:48.703 回答
0

使用自己的框架仅限于自己的知识线,我建议使用mvc frameworks 大多数主机和所需的框架:

  1. CAKEPHP
  2. 代码点火器
  3. 禅德

因为cakephp这里是如何工作的:

核心定义常量

全局函数

如果您习惯使用一个mvc,那么其他人不适合您。

于 2013-04-18T06:10:08.027 回答
0

我更喜欢的最佳实践是创建一个具有执行数据库查询的方法的数据库类。这些是我使用的一堆函数,它们是实现基本插入选择和更新的简单方法。这是 PDO 的示例。

    public function select($table, $fields, $where = ""){
    try{
        $fields = implode(",", $fields);
        $stmt = $this->connection->prepare("SELECT {$fields} from {$table} {$where}");
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }catch(PDOException $p){
        Error::PDOError($p->getCode(), $p->getMessage());
    }
}
public function insert($table, $data) {
    $fields = implode(",", array_keys($data));
    $values = implode(",", array_values($data));
    $stmt = $this->prepare("INSERT INTO " . $table . "({$fields}) VALUES ({$values})");
    return $stmt->execute();
}

public function update($table, $data, $where) {
    $fieldValues = NULL;
    foreach ($data as $key => $value) {
        $fieldValues .= "$key = :$key,";
    }
    $fieldValues = rtrim($fieldValues, ",");
    $stmt = $this->prepare("UPDATE {$table} SET {$fieldValues} WHERE {$where}");
    foreach ($data as $key => $value) {
        $stmt->bindValue(":$key", $value);
    }
    return $stmt->execute();
}

或者您可以随时使用活动记录库

于 2013-04-18T06:23:35.987 回答