【问题标题】:Using PHP classes when adding users to database将用户添加到数据库时使用 PHP 类
【发布时间】:2017-02-28 22:41:33
【问题描述】:

最初我使用 for 循环创建的连接查询将大量玩家/用户添加到 mysql 数据库。今天,我想尝试类,因为我并不真正了解它们的用例。

在下面的类中,新用户(+数据)被添加到数据库中,并返回最后插入行的唯一 ID 号。

我本以为将这种插入作为一个查询进行是最快的方法,而不是每次实例化一个新播放器时,但老实说,我仍处于初学者阶段,因此欢迎一些建议,或关于如何最好地优化它的建议。

理想情况下作为一个查询,除非我错误地假设这更快?

是否可以将多个玩家的唯一 ID 作为数组返回?

class player {
    var $player;
    var $PlayerID;
    var $email;
    function create_player($new_player, $email, $password, $db) {
        $this->player = $new_player;
        $this->email = $email;

        $salt = "xxx"; //simplified for this example            
        $passwordhash = $password; //simplified for this example
        $query = "INSERT INTO userstest (name, email, hash, salt ) values(:name, :email, :hash, :salt)";
        $params = array (':name' => $new_player, ':email' => $email, ':hash' => $passwordhash, ':salt' => $salt);

        $stmt = $db->prepare($query); 
        $stmt->execute($params); 
        $id = $db->lastInsertId();
        $this->PlayerID = $id;
    }
}

【问题讨论】:

  • 如果您不只是投反对票,而是花时间告诉我为什么您认为这是一个糟糕的问题,那就太棒了。虽然这对你来说很明显,但对我来说还不清楚。因此问题。至少有理由我有一些方向可以进一步研究和理解。
  • 当插入多行时,可能值得使用带有事务的批量插入。即继续使用不同的参数调用`$stmt->execute($params);`。查看有关它的详细信息::PDO - Insert large array to MySQL database。它的效率惊人,而且编码简单。

标签: php mysql class


【解决方案1】:

我使用PDO 作为处理来自PHPDatabase 的首选解决方案,你可以试试这个结构:

Class Player {
    public $playerName;
    public $playerID;
    public $email;
    public $pass;
    public $salt;
}

Class PlayerDAO {
    public function add(Player $player) {
        $sql = "INSERT INTO userstest (name, email, hash, salt) values(?, ?, ?, ?)";
        $params = [$player->playerName, $player->email, $player->pass, $player->salt];

        $this->db_add($sql, $params, false);
    }

    public function add_multi($players) {
        $sql = "INSERT INTO userstest (name, email, hash, salt) values(?, ?, ?, ?)";
        $params_arr = [];
        foreach($players as $player) {
            $params = [$player->playerName, $player->email, $player->pass, $player->salt];
            $params_arr[] = $params;
        }

        $this->db_add($sql, $params, true);
    }


    private function db_add($sql, $params, $is_multi) {
        $stmt = $this->link->prepare($sql);

        $res = [];
        if ($is_multi) {
            foreach ($params as $params_1) {
                $res[] = $stmt->execute($params_1);
            }
        } else {
            $res[] = $stmt->execute($params);
        }
        if (!$res) {
            print_r($stmt->errorInfo());
            //$this->errorCode = $stmt->errorCode();
        }
        //$this->rowsAffected = $stmt->rowCount();
        //$this->lastInsertedId = $this->link->lastInsertId();

        return $res;
}

确保准备$link var 作为数据库连接器

另外,如果你有多个类,你可以为它们创建一个父类,

【讨论】:

    【解决方案2】:

    将它作为单个查询运行不一定更好。这取决于您的用例和目标。我通常会进行个别查询,因为我的用例通常是从 Web 表单向数据库添加内容。我的课程通常看起来像:

    Class Player{
      protected $id;
      protected $uname;
      protected $email;
    
      public function __construct($id){
        $this->id = $id;
      }
      public function initialize(inputArray){
        if(isset(inputArray['id'])){$this->id = inputArray['id'];}
        if(isset(inputArray['uname'])){$this->uname = inputArray['uname'];}
        if(isset(inputArray['email'])){$this->email = inputArray['email'];}
      }
      public function mysql_insert($con){
        $sql = "INSERT INTO TABLE (Uname,email) Values(".$this->uname.",".$this->email.")";
        mysqli_query($con,$sql);
        $this->id = mysqli_insert_id($con);
        return $this->id;
      }
    }
    

    通过这种方式,您可以获取对象数据,无论它们来自何处,然后一般将其添加到数据库中。您的类是功能性的,但是通过在您的类中创建数据库连接,您正在努力工作,只需传递打开的连接对象。这也将允许您遍历您的对象,对同一数据库连接进行单独的查询:

    $con = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
    $data = array_of_player_arrays[];
    $ids = array();
    
    for($i = 0; $i < count($data); i++){
      $p = new Player();
      $p->initialize($data[$i]);
      $ids[] = $p->mysql_insert($con);
    }
    

    通过使 mysql_insert() 返回 id 值,您可以捕获在该运行中添加的 ID。目标应该是继续向类中添加函数,以便轻松重复处理玩家数据。 尝试添加 mysql_select() 和 mysql_update() 函数或 toArray() 函数来帮助完成处理数据所需的行为循环,而无需编写超出使用这些类的交互脚本。 如果您真的想将它作为一个查询运行,您可以在循环中返回插入 sql 而不是 ID 以与您一样连接,但如果我没记错的话,这与单独运行它们几乎相同。希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您有几个选择:
      您可以创建另一个类,该类将与新玩家创建循环。但是您会有多个查询。
      另一种方法是创建一个多重查询:一个包含多个插入的查询。
      一个播放器类将创建自己的查询字符串并将其返回给 PDO。
      多查询返回后,您将获得行的所有 id。
      你可以查看docs的语法。

      【讨论】:

        猜你喜欢
        • 2011-09-14
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        相关资源
        最近更新 更多