3

安全.php

class Security {

    public function sanitize($data) {
        return mysql_real_escape_string($data);
    }
}
?>

用户.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';
            }
    }
}

?>

在我的用户存在方法中,我想使用清理方法,但我不确定在 oop 中执行此操作的正确方法。两个类都在不同的文件中。任何帮助表示赞赏。

4

3 回答 3

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);

这是一个完整的工作示例:

安全.php

<?php
class Security {
  public static function sanitize($data) {
    return mysql_real_escape_string($data);
  }
}

用户.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';
}
于 2013-03-20T15:43:40.507 回答
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';
        }
   }
}
于 2013-03-20T15:43:10.083 回答
1

这可能有点冗长,但它会为您最终想要学习的一些主题提供一些启示。

此外,当您使用准备好的语句时,您不需要转义任何内容。但无论如何我都会回答你的问题。

有很多方法可以做到这一点。

依赖注入

您可以像在构造函数中使用 Connection 一样实例化一个 Security 实例。但这是错误的方式,因为它使您的代码依赖于 Security 类,就像您的类现在依赖于 Connection 类

要解决此问题,请使用依赖注入

public function __construct( DBInterface $db ) {
    $this->db = $db;
}

像这样使用它

$connection = new Connection();
$db = $connection->dbConnect();
$user = new User( $db );

现在您的代码只依赖于 DBInterface接口。您现在可以创建任意数量的实现该接口的类并将它们传递给用户类。

您可以将 Security 中的方法设为静态,但这也会增加对 Security 类的依赖。

您也可以在构造函数中传递安全对象,但这很快就会变得丑陋。看看依赖注入容器


将该方法添加到您的连接类

由于您创建了自己的 Connection 类,您可以将转义方法添加到连接类并调用它$this->db->sanitize()

$username = $this->db->sanitize($username);

php 5.4 中的特征

Trait Security {
    public function sanitize($data) {
        return mysql_real_escape_string($data);
    }
}

Class User {
    use Security;
...
}

然后像在 User 类中一样使用 Security trait 的方法。


我故意不提及创建基类并扩展它,因为在这种情况下,使用 User 和 Security 类没有意义。

于 2013-03-20T16:14:27.357 回答