gpt4 book ai didi

php - 使用 PHP 类时的 SQL 查询效率

转载 作者:行者123 更新时间:2023-11-29 04:01:08 26 4
gpt4 key购买 nike

我已经使用 PHP 进行编程多年,但直到最近才开始使用类进行编程。我有以下 - 基本 - 用户类如下:

<?php
/* The class for constructing any user's information
*/

class User {

protected $userId, $email, $userGroup;

protected function getEmail() {
return $this->email;
}

protected function getUserId() {
return $this->userId;
}

protected function getUserGroup() {
return $this->userId;
}


public function __construct($userId='') {
if($userId) {
$select = mysql_query("SELECT userId, email, user_group FROM user WHERE userId = '$userId'");
while($user==mysql_fetch_array($select)) {
$this->email = $user[email];
$this->userId = $userId;
$this->userGroup = $user[user_group];
}
}
}

}?>

所以我知道我可以做以下事情

<?php
$user = new User($userId);
echo $user->getEmail();
?>

显示给定用户 ID 的用户电子邮件地址。我想知道的是,最好的方法是什么 - 使用 OOP - 来显示 40 个用户的电子邮件。显然创建 40 个用户对象是愚蠢的,因为那是 40 个 SQL 查询。在执行给定各种参数的 SQL 之后,您是否会简单地创建一个“用户”类用于返回多个用户的数组?

<?php
$getUsers = new Users('Tom');
// create 'Users' object where name is 'Tom'
print_r($users);
// prints the returned array of users?
?>

感谢您的帮助。希望这很清楚。

最佳答案

我会这样做(使用另一个类):

class UserRepository {
public function getByName($name) {
$result = mysql_query("SELECT userId, email, user_group FROM user WHERE name = '$name'");

$users = [];

while ($row = mysql_fetch_assoc($result)) {
$user = new User;
$user->email = $row['email'];
$user->userId = $row['userId'];
$user->userGroup = $row['user_group'];

$users[] = $user;
}

return $users;
}
}

添加:以下示例很好地说明了如何使这些类在将来需要时更易于测试和更容易修改:

用户库接口(interface)

interface UserRepositoryInterface {
public function getByName($name);
public function getByUserId($id);
}

MySqliUserRepository

class MySqliUserRepository implements UserRepositoryInterface {
public function getByName($name) {
// Get by name using mysqli methods here
}

public function getByUserId($id) {
// Get by user id using mysqli methods here
}
}

PDOUserRepository

class PDOUserRepository implements UserRepositoryInterface {
public function getByName($name) {
// Get by name using PDO methods here
}

public function getByUserId($id) {
// Get by user id using PDO methods here
}
}

用法

class Foo {

protected $userRepository;

public function __construct(UserRepositoryInterface $userRepository) {
$this->userRepository = $userRepository;
}

public function bar() {
$user = $this->userRepository->getByUserId(10);
}
}

关于mysql_的使用

它可能不完全是您如何做的,但它会给您一个想法。此外,mysql_ 已贬值,因此最好使用 mysqli_PDO(我的个人建议)。 PDO 也更适合 OOP。

PDO:http://php.net/manual/en/book.pdo.php

mysqli_: http://php.net/manual/en/book.mysqli.php

更新:

您的个人用户类别将只包含与用户相关的信息。用户类不应包含任何检索用户的方法,这是存储库的工作。所以如果你想检索 1 个用户,而不是像你现在那样在 User __construct 中做,添加一个方法到 UserRepository 看起来像这样:

public function getByUserId($id) {
// Select user from db, check only 1 exists, make user object, return.
}

关于php - 使用 PHP 类时的 SQL 查询效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19358576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com