将用户添加到数据库时使用PHP类

时间:2017-02-28 22:41:34

标签: php mysql class

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

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

我会假设将这个插入作为一个查询是最快的方式,而不是每次我实例化一个新的播放器,但说实话我还处于初学者阶段,所以欢迎一些建议,或建议如何最好地优化这一点。

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

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

ArrayList<ArrayList<Integer>> A = new ArrayList<>();

3 个答案:

答案 0 :(得分:1)

将其作为单个查询运行不一定更好。这取决于您的使用案例和目标。我通常会进行单独的查询,因为我的用例通常是从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。目标应该是继续向类中添加函数,以便轻松地重复处理Player数据。 尝试添加mysql_select()和mysql_update()函数或toArray()函数,以帮助完成处理数据所需的行为循环,而无需编写超出使用这些类的交互脚本。 如果你真的想把它作为一个查询运行,你可以在循环中返回插入sql,而不是以与你一样的方式连接ID,但是如果我没有错,那就像单独运行它们几乎一样。希望这会有所帮助。

答案 1 :(得分:1)

我使用PDO作为处理来自Database的{​​{1}}的首选解决方案,您可以尝试以下结构:

PHP

确保准备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; } var作为数据库连接器

此外,你有多个类可以为他们制作父类,

答案 2 :(得分:0)

您有几个选择:
您可以创建另一个具有创建新玩家的循环的类。但是你会有多个问题 另一种方法是创建一个多参数:一个带有多个插入的查询 一个玩家类将创建自己的查询字符串并将其返回给PDO 在multiquery返回后,您将获得所有行的id 您可以查看有关语法的docs