【发布时间】:2023-04-06 12:16:01
【问题描述】:
PHP 的 OOP 新手,有点迷茫,在此先感谢。
我遇到的问题是,当我创建新用户时,它会为同一用户插入 5 条记录(每个用户都有新的唯一主 ID)。发现很多人试图学习插入多条记录的问题,但认为这是在此处发布的第一个关于仅尝试插入一条记录时将多条记录插入 MySQL 数据库的问题!
如果您需要查看任何其他代码,请告诉我——谢谢!
用户类
class User{
protected static $table_name="users";
public $id;
public $username;
public $password;
public $first_name;
public $last_name;
public $email;
public static function find_all(){
return self::find_by_sql("SELECT * FROM users");
}
public static function find_by_id($id=0){
global $database;
$result_array = self::find_by_sql("SELECT * FROM users WHERE id={$id} LIMIT 1");
return !empty($result_array) ? array_shift($result_array) : false;
}
public static function find_by_sql($sql=""){
global $database;
$result_set = $database->query($sql);
$object_array = array();
while ($row = $database->fetch_array($result_set)){
$object_array[] = self::instantiate($row);
}
return $object_array;
}
public static function authenticate($username="", $password=""){
global $database;
$username = $database->escape_value($username);
$password = $database->escape_value($password);
$sql = "SELECT * FROM users ";
$sql .= "WHERE username = '{$username}' ";
$sql .= "AND password = '{$password}' ";
$sql .= "LIMIT 1";
$result_array = self::find_by_sql($sql);
return !empty($result_array) ? array_shift($result_array) : false;
}
public function full_name(){
if(isset($this->first_name) && isset($this->last_name)){
return $this->first_name . " " . $this->last_name;
} else {
return "";
}
}
private static function instantiate($record){
$object = new self;
foreach($record as $attribute=>$value){
if($object->has_attribute($attribute)){
$object->$attribute = $value;
}
}
return $object;
}
private function has_attribute($attribute){
$object_vars = get_object_vars($this);
return array_key_exists($attribute, $object_vars);
}
public function create(){
global $database;
$sql = "INSERT INTO users (";
$sql .= "username, password, first_name, last_name, email";
$sql .= ") VALUES ('";
$sql .= $database->escape_value($this->username) ."', '";
$sql .= $database->escape_value($this->password) ."', '";
$sql .= $database->escape_value($this->first_name) ."', '";
$sql .= $database->escape_value($this->last_name) ."', '";
$sql .= $database->escape_value($this->email) ."')";
if($database->query($sql)){
$this->id = $database->insert_id();
return true;
} else {
return false;
}
}
}
数据库类
class MySQLDatabase{
private $connection;
function __construct(){
$this->open_connection();
}
public function open_connection(){
$this->connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
if(mysqli_connect_errno()){
die("Database Connection Failed: " .
mysqli_connect_error() .
" (" . mysqli_connect_errno() . ")"
);
}
}
public function close_connection(){
if(isset($this->connection)){
mysqli_close($this->connection);
unset($this->connection);
}
}
public function query($sql){
$result = mysqli_query($this->connection, $sql);
$this->confirm_query($result);
return $result;
}
private function confirm_query($result){
if(!$result) {
die("Database query failed.");
}
}
public function escape_value($string){
$escaped_string = mysqli_real_escape_string($this->connection, $string);
return $escaped_string;
}
public function fetch_array($result_set){
return mysqli_fetch_array($result_set);
}
public function num_rows($result_set){
return mysqli_num_rows($result_set);
}
public function insert_id(){
return mysqli_insert_id($this->connection);
}
public function affected_rows(){
return mysqli_affected_rows($this->connection);
}
}
实例化
$user = new User();
$user->username = "test";
$user->password = "testing";
$user->first_name = "Bob";
$user->last_name = "Smith";
$user->email = "bsmith@gmail.com";
$user->create();
【问题讨论】:
-
如果你想做 OOP 数据库交互,我强烈建议你看看 PDO 和参数化查询
-
注意,但超出了问题的范围。
-
是的,但我在发布的代码中看不到任何会插入五条记录的内容。
-
同意。我在您发布的代码中看不到任何看起来会导致此类错误的代码。你能发布更多关于创建新用户的代码吗?
-
你不告诉我们什么?您提供的代码中没有任何内容会创建 5 行。您创建用户的实际代码可能是罪魁祸首。