最初我使用for循环创建的连接查询将大量的玩家/用户添加到mysql DB中。今天,我想尝试课程,因为我并不真正了解他们的用例。
在下面的班级中,新用户(+数据)被添加到数据库并返回最后一个插入行的唯一ID号。
我会假设将这个插入作为一个查询是最快的方式,而不是每次我实例化一个新的播放器,但说实话我还处于初学者阶段,所以欢迎一些建议,或建议如何最好地优化这一点。
理想情况下,作为一个查询,除非我错误地认为这更快?
是否可以将多个玩家的唯一ID作为数组返回?
ArrayList<ArrayList<Integer>> A = new ArrayList<>();
答案 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。