我多年来一直在使用PHP和MySQL,但从未在正式场合使用过。我用它来简化我的工作,并编写了很多我自己的商业网站,但我不是一名程序员,而且从来没有。我想开始做一些自由职业的工作,我想知道一些最佳实践是什么。
我总是使用getter类从mysql中检索数据,并使用setter类将数据输入mysql,我将连接类传递给它。每个mySQL表和字段名都在常量include文件中定义了自己的常量。我通常做的是将常量直接输入到setter或getter类中,而不是将它们作为变量传递。它通过这种方式使生活更轻松,更快捷,但它确实无法理解类中的函数应该是独立的。
为了清楚起见,这是我通常做的一个例子:
constants.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...
}
通过传递变量来实现它似乎更麻烦,特别是因为如果我想通过添加新字段来搜索来更改函数的参数,我必须找到函数调用的每个实例,改变它们,而如果我使用常量,我只需要将它们添加到函数中。
此外,当谈到声明常量之类的事情时,我总是使用单引号。但是当我创建字符串时,我总是使用双引号。这是不一致的,我应该一直使用一种报价吗?
谢谢!
答案 0 :(得分:2)
当然,你可以两种方式做到这一点,我认为两者同样不受欢迎。动态创建SQL字符串既难以保护,也容易出错。
我建议您尝试其中许多现成的库中的一个,例如:
http://www.doctrine-project.org/
那些被称为“ORM” - 对象关系映射器。这些将帮助您实现您 - 我相信 - 正在努力实现的目标。
还有其他方法,我曾经使用Pear DB(现在是MDB2,http://pear.php.net/package/MDB2),它不像ORM那样高。这也将帮助您解决设计问题。
数据库访问是一个常见的问题需要解决,很多人以前都是这样做的,使用他们已经发现的东西,不要重新发明轮子!尝试使用ORM。它非常令人满意,并且比处理SQL,行,结果集和连接对象更自然。
答案 1 :(得分:1)
要使用MVC术语......包含所有业务逻辑的模型应该在某处有一个明确定义的函数,它从中获取某些特定类型的数据数据库。说,像这样:
function getUserByUsername($username) {
$query = 'SELECT ... FROM users WHERE name = :username';
...
return $user;
}
从数据库中按用户名检索用户您的应用可以执行的一项特定的,独特的操作。为它做一个功能。它使您的应用程序更加结构化。不要制作一般的SQL包装器并将大量不同的变量传递给它,这样就不必在整个应用程序中扩散数据库逻辑。
答案 2 :(得分:1)
为了定义常量,我使用与OP相同的方法。
我建议您研究持久层的这些模式:
DAO (Data Access Object) pattern
接下来还有使用ORM框架的可能性
据我所知,你做得对。 (请记住,有像php查询的预处理语句这样的东西)
答案 3 :(得分:0)
使用自己的框架工作仅限于自己的知识线,
我建议使用 mvc frameworks
大多数主机和要求的框架是:
cakephp
这里有效:
如果您习惯使用 mvc
,那么其他人不适合您。
答案 4 :(得分: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();
}
或者您可以随时使用Active record library