向数据库添加用户时使用PHP类

向数据库添加用户时使用PHP类,php,mysql,class,Php,Mysql,Class,最初,我使用for循环创建的串联查询向mysql数据库添加大量播放器/用户。今天,我想用类进行实验,因为我没有真正理解它们的用例 在下面的类中,新用户(+数据)被添加到数据库中,并返回最后插入行的唯一ID号 我本以为将此插入作为一个查询来执行是最快的方法,而不是每次我实例化一个新的玩家,但老实说,我仍处于初级阶段,因此欢迎您提供一些建议,或者关于如何最好地优化此操作的建议 理想情况下,作为一个查询,除非我错误地认为这会更快 是否可以将多个玩家的唯一ID作为数组返回 class player {

最初,我使用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;
    }
}

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

您可以检查有关语法的信息。

将其作为单个查询运行并不一定更好。这取决于您的用例和目标。我通常进行单独的查询,因为我的用例通常是从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;
  }
}
通过这种方式,您可以将对象数据从何处获取,然后一般地将其添加到数据库中。您的类是功能性的,但是您通过在类中创建数据库连接而付出了一些努力,只需传递openconnection对象即可。这还允许您对对象进行迭代,对同一数据库连接进行单独查询:

$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);
}
$con=mysqli_connect(“127.0.0.1”、“我的用户”、“我的密码”、“我的数据库”);
$data=玩家数组中的数组[];
$ids=array();
对于($i=0;$i初始化($data[$i]);
$ids[]=$p->mysql\u插入($con);
}
通过使mysql_insert()返回id值,您可以捕获在该运行中添加的id。我们的目标应该是继续向类中添加函数,以使处理播放器数据变得易于重复。 尝试添加mysql_select()和mysql_update()函数或toArray()函数,以帮助完成处理数据所需的行为循环,而无需编写这些类之外的交互脚本。
如果你真的想把它作为一个查询运行,你可以在循环中返回insert-sql,而不是ID,以同样的方式连接起来,但是如果我没有弄错的话,这和单独运行它们是一样的。希望这有帮助。

我使用
PDO
作为从
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;
}
确保准备
$link
var作为db连接器


此外,如果你有多个班级,你可以为他们制作一个家长班,

如果你不只是放弃投票,而是花时间告诉我为什么你认为这是一个糟糕的问题,那就太棒了。虽然这对你来说很明显,但对我来说却不清楚。这就是问题所在。至少有理由,我还有一些需要进一步研究和理解的方向。当插入多行时,可能值得使用“带事务的批插入”。i、 继续调用“$stmt->execute($params);”具有不同的参数。有关详细信息,请参见:。它的效率令人惊讶,而且编码简单。