Создание подготовленных операторов mySQLi для пользовательского класса PHP - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть пользовательский класс, который я создал, который выглядит примерно так:

class User {
    private $user;
    private $con;

    public function __construct($con, $user){
        $this->con = $con;
        $user_details_query = mysqli_query($con, "SELECT * FROM users WHERE username='$user'");
        $this->user = mysqli_fetch_array($user_details_query);
    }

    public function getUsername() {
        return $this->user['username'];
    }

    public function getNumberOfFriendRequests() {
        $username = $this->user['username'];
        $query = mysqli_query($this->con, "SELECT * FROM friend_requests WHERE user_to='$username'");
        return mysqli_num_rows($query);
    }

    public function getNumPosts() {
        $username = $this->user['username'];
        $query = mysqli_query($this->con, "SELECT num_posts FROM users WHERE username='$username'");
        $row = mysqli_fetch_array($query);
        return $row['num_posts'];
    }

Это намного больше, но я пытаюсь понять, как создать его заново, используя подготовленныйзаявления, не портя остальные страницы.У меня есть вызовы на нескольких страницах, которые основаны на данном классе класса User.Я новичок в приготовлении блюд, но успел справиться довольно хорошо, но у меня возникли проблемы, когда дело доходит до уроков.Я пытаюсь воссоздать, например, public function getNumberOfFriendRequests(), чтобы у него был тот же вывод, что и раньше, чтобы существующие страницы не выдавали ошибок.Вот что у меня есть:

public function getNumberOfFriendRequests() {
$username $this->user['username'];
$query = mysqli_prepare($this->$con, "SELECT COUNT(*) FROM friend_requests WHERE user_to=?");
$query->bind_param('s', $username);
$query->execute();
$query_>bind_result(NOT SURE);
$query->fetch();
}

Я также запутался в public function __construct($con, $user), потому что это то, что вызывается всякий раз, когда я хочу получить доступ к данным пользователя.Кто-нибудь знает, как я бы начал переписывать данный класс User, чтобы результаты были одинаковыми и не мешали вызовам php на зависимых страницах?

1 Ответ

0 голосов
/ 29 сентября 2018

Это должен быть ваш класс, переписанный для использования подготовленных операторов.Ваша конструкция имеет смысл, когда вы говорите «Этот пользователь», а также передаете свой объект БД.Вы не будете использовать bind_result, так как вы используете SELECT *, а bind_result предназначен для таргетинга на определенные поля.

class User {
private $user;
private $con;

public function __construct($con, $user){
    $this->con = $con;

    /* prepare the query */
    $stmt =  $this->con->stmt_init();
    $stmt->prepare('SELECT * FROM users WHERE username = ?');

    /* Bind to string $user */
    $stmt->bind_param('s', $user);
    $stmt->execute();

    /* Get a result obj */
    $result = $stmt->get_result();
    $this->user = $result->fetch_assoc();

    /* free results */
    $stmt->free_result();

    /* close statement */
    $stmt->close();
}

public function getUsername() {
    return $this->user['username'];
}

public function getNumberOfFriendRequests() {
    $username = $this->user['username'];
    $stmt =  $this->con->stmt_init();
    $stmt->prepare('SELECT * FROM friend_requests WHERE user_to = ?');
    $stmt->bind_param('s', $user);
    $stmt->execute();

    /* Get a result obj */
    $result = $stmt->get_result();
    $qty = $result->num_rows;

    /* free results */
    $stmt->free_result();

    /* close statement */
    $stmt->close();

    return $qty;
}

public function getNumPosts() {
    $username = $this->user['username'];
    $stmt =  $this->con->stmt_init();
    $stmt->prepare('SELECT num_posts FROM users WHERE username=?');

    /* Bind to string $user */
    $stmt->bind_param('s', $user);
    $stmt->execute();

    /* Get a result obj */
    $result = $stmt->get_result();
    $data = $result->fetch_assoc();

    /* free results */
    $stmt->free_result();

    /* close statement */
    $stmt->close();

    return $data['num_posts'];
}

PS Не использовать SELECT *;см .: Выбор * Зло

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...