所以我学到了很多关于PHP的知识,我开始讲基础知识,即使其中一些已被弃用。现在我已经掌握了这些知识,我正在重写我用过PDO和课程所做的一切。现在我从来没有使用过,但我慢慢地(缓慢地,慢慢地)理解并且让我的头围绕它。我想问的是,如果我做得对,如果不是我哪里出错了?
我基本上有这个功能:
function user_exists($username) {
$username = sanitize($username);
$query = mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'");
return (mysql_result($query, 0) == 1) ? true : false;
}
我想把它变成一个类:
class user {
function exists($username) {
$username = $username;
$query = $db->query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'");
$results = $query->fetchAll(PDO::FETCH_ASSOC);
}
}
我是否在正确的轨道上,我应该将该函数(方法)中的变量设为私有的“exists”方法吗?
我打算用“存在”,“禁止”,“管理”等方法创建“用户”类。我想这就是我应该做的事情?
谢谢,如果有人回答这个问题。
答案 0 :(得分:1)
class User {
public $name;
private $db;
function __construct($name) {
$this->name = $name;
$this->db = get_me_a_db_connection();
}
public function exists() {
$query = $this->db->query('SELECT COUNT(user_id) FROM users WHERE username = "' . $this->name . '"');
$results = $query->fetchAll(PDO::FETCH_ASSOC);
return some_code_that_extracts_the_count_from_$results;
}
}
但:
1)$db
不应该是类属性。它至少应该在工厂里。所以你extract it in a factory:
class Factory {
public static function db() {
return get_me_a_db_connection();
}
}
public function exists() {
$query = Factory::db()->query(...);
...
}
这样,您就不会使用基础设施代码污染domain models 。
2)上面的那些我的意思是你可以实现基础设施代码(数据库连接,查询)和域模型之间的完全解耦。那里有tons of libraries就是这么做的。我从Laravel's Eloquent开始。
3)如果您使用prepared statements,PDO查询是安全的。像我上面链接的所有库都使用预处理语句。作为一个菜鸟,我建议你开始学习其中一个。
答案 1 :(得分:0)
也许你没有太多偏离赛道,这是一个好的开始。但是你需要学习如何进入面向对象编程的内容。我将从一个简单的类开始,例如 User ,其中包含真实用户的信息,无论该用户需要为您尝试创建的所有方法提供哪些信息。
您将需要的私有变量始终是各种方法所需的信息。与用户名和您需要查找的任何其他信息一样。
也许 $ results 可能是一个带有最后一个返回信息的变量,或者只是像第一个例子那样返回它。
在写下你的课程之前,你需要首先考虑你真正需要的东西。