security.php
class Security {
public function sanitize($data) {
return mysql_real_escape_string($data);
}
}
?>
users.php
<?php
class User {
private $db;
public function __construct() {
$this->db = new Connection();
$this->db = $this->db->dbConnect();
}
public function userExists($username) {
$username = sanitize($username);
$st = $this->db->prepare("SELECT * FROM `users` WHERE `username`=? ");
$st->bindParam(1, $username);
$st->execute();
if ($st->rowCount() == 1) {
echo "User exists";
} else {
echo 'Incorrect username or password lad';
}
}
}
?>
在我的用户存在方法我想使用sanitize方法,但我不确定在oop中执行此操作的正确方法。 这两个类都在不同的文件上。任何帮助表示感谢。
答案 0 :(得分:3)
我最好的建议是将Security中的sanitize方法设为静态函数。这样您就可以在不必实例化对象的情况下访问该方法。
示例:
<?php
class Security {
public static function sanitize($data) {
return mysql_real_escape_string($data);
}
}
在您的用户班中:
public function userExists($username) {
$username = Security::sanitize($username);
以下是一个完整的工作示例:
security.php
<?php
class Security {
public static function sanitize($data) {
return mysql_real_escape_string($data);
}
}
users.php
<?php
class User {
private $db;
public function __construct() {
$this->db = new Connection();
$this->db = $this->db->dbConnect();
}
public function userExists($username) {
$username = Security::sanitize($username);
$st = $this->db->prepare("SELECT * FROM `users` WHERE `username`=? ");
$st->bindParam(1, $username);
$st->execute();
if($st->rowCount() == 1) {
return True;
} else {
return False;
}
}
}
test.php (见行动!)
<?php
require_once 'security.php';
require_once 'user.php';
$user = new User();
$exists = $user->userExists('my-username');
if($exists) {
print 'User exists';
} else {
print 'Incorrect username or password lad';
}
答案 1 :(得分:1)
好吧,包含文件,正确实例化对象并调用其方法。
<?php
require_once 'security.php';
class User {
private $db;
public function __construct() {
$this->db = new Connection();
$this->db = $this->db->dbConnect();
}
public function userExists($username) {
$sec = new Security();
$username = $sec->sanitize($username);
$st = $this->db->prepare("SELECT * FROM `users` WHERE `username`=? ");
$st->bindParam(1, $username);
$st->execute();
if ($st->rowCount() == 1) {
echo "User exists";
} else {
echo 'Incorrect username or password lad';
}
}
}
答案 2 :(得分:1)
这可能有点长篇大论,但它会对你最终想要学习的一些主题有所了解。
当您使用预准备语句时,您也不需要逃避任何事情。但是无论如何我都会回答你的问题。
有很多方法可以做到这一点。
您可以使用Connection在构造函数中实例化一个Security实例。但这是错误的方式,因为它使你的代码依赖于Security类,就像你的类现在依赖于Connection类
要解决此问题,请使用dependency injection
public function __construct( DBInterface $db ) {
$this->db = $db;
}
像这样使用
$connection = new Connection();
$db = $connection->dbConnect();
$user = new User( $db );
现在您的代码仅依赖于DBInterface interface。您现在可以创建任意数量的实现该接口的类,并将它们传递给用户类。
您可以在Security中创建该方法,但这也会增加对Security类的依赖性。
您也可以在构造函数中传递安全对象,但这很快就会变得难看。看看dependency injection containers
由于您创建了自己的Connection类,因此可以将escape方法添加到连接类并使用$this->db->sanitize()
$username = $this->db->sanitize($username);
Trait Security {
public function sanitize($data) {
return mysql_real_escape_string($data);
}
}
Class User {
use Security;
...
}
然后使用安全特征的方法,就像它们在User类中一样。
我故意不提及创建基类并扩展它,因为在这种情况下使用User和Security类它没有意义。