Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和MySQL-常量、函数、最佳实践?_Php_Mysql - Fatal编程技术网

PHP和MySQL-常量、函数、最佳实践?

PHP和MySQL-常量、函数、最佳实践?,php,mysql,Php,Mysql,我已经使用PHP和MySQL很多年了,但从未在正式环境中使用过。我用它来简化我的工作,并编写了许多我自己的商业网站,但我没有被聘为程序员,也从来没有被雇佣过。我希望开始做一些自由职业者的工作,我想知道一些最佳实践是什么 我总是使用getter类从mysql检索数据,setter类将数据输入mysql,我将连接类传递给mysql。每个mySQL表和字段名都在常量包含文件中定义了自己的常量。不过,我通常要做的是将常量直接输入setter或getter类,而不是将它们作为变量传递。这样做会使生活变得更

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

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

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

常数公司

define('TABLE_NAME','table_name');
dbase_getters.class.php

public function get_data($connection){
    $query = "SELECT * FROM " . TABLE_NAME;
    $result = $connection etc...
}
public function get_data($connection, $table_name){
    $query = "SELECT * FROM " . $table_name;
    result = $connection etc...
}
还是我应该这样做

dbase_getters.class.php

public function get_data($connection){
    $query = "SELECT * FROM " . TABLE_NAME;
    $result = $connection etc...
}
public function get_data($connection, $table_name){
    $query = "SELECT * FROM " . $table_name;
    result = $connection etc...
}
通过传递变量似乎要麻烦得多,特别是如果我想通过添加新字段来搜索来更改函数的参数,我必须找到函数调用的每个实例并更改它们,而如果我使用常量,我只需要将它们添加到函数中

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


谢谢

当然,你可以两种方法都做,我认为这两种方法都是不可取的。动态创建SQL字符串既难以确保安全,也容易出错

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

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

还有其他方法,我曾经使用过PEARDB(现在是MDB2),它的级别没有ORM高。这也将帮助您解决设计问题


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

当然,您可以用两种方法来处理,我认为这两种方法都不可取。动态创建SQL字符串既难以确保安全,也容易出错

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

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

还有其他方法,我曾经使用过PEARDB(现在是MDB2),它的级别没有ORM高。这也将帮助您解决设计问题

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

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

function getUserByUsername($username) {
    $query = 'SELECT ... FROM users WHERE name = :username';
    ...
    return $user;
}
通过用户名从数据库中检索用户是应用程序可以执行的一个特定、唯一的操作。为它做一个函数。它使你的应用程序更加结构化。不要做一个通用的SQL包装器,并向它传递大量不同的变量,这只会不必要地将数据库逻辑扩散到整个应用程序中。

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

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

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

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

  • CAKEPHP
  • 共点火器
  • 泽德
  • 对于
    cakephp
    ,以下是工作原理:


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

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

  • CAKEPHP
  • 共点火器
  • 泽德
  • 对于
    cakephp
    ,以下是工作原理:


    如果您习惯于使用一个
    mvc
    ,那么其他的就不适合您了。

    我喜欢的最佳实践是创建一个数据库类,其中包含执行数据库查询的方法。。这些是我使用的一系列函数,它们是实现基本插入选择和更新的简单方法。这是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();
    }
    

    或者您可以始终使用

    我喜欢的最佳实践是创建一个数据库类,其中包含执行数据库查询的方法。。这些是我使用的一系列函数,它们是实现基本插入选择和更新的简单方法。这是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();
    }
    

    或者您可以始终使用

    来定义常量,我使用与OP相同的方法

    我建议您为持久层研究以下模式:

    <