Вам не нужно использовать fetch_assoc()
большую часть времени. Если вы пишете какой-то класс абстракции вокруг mysqli, вам никогда не придется напрямую использовать какие-либо функции mysqli.
mysqli:query()
возвращает объект типа mysqli_result
, который является итерируемым. Это означает, что вы можете использовать цикл foreach
для его повторения.
Я должен указать, что вы все еще следуете некоторым плохим методам программирования. Вы никогда не должны использовать or die($this->con->error.__LINE__)
. Это ужасная практика кодирования и совершенно не нужная. Вместо этого вы должны включить правильную отчетность об ошибках. См. Как получить сообщение об ошибке в MySQLi?
Ваш метод select()
должен возвращать только массив. Это сделало бы ваш код намного проще и менее подверженным ошибкам. Итак, перепишите свою функцию select()
следующим образом:
public function select($sql){
return $this->con->query($sql)->fetch_all(MYSQLI_ASSOC);
}
Как видите, вся функциональность представляет собой одну строку кода, а это означает, что ваш метод select()
не очень полезен. Вместо этого вы можете заменить его чем-то более общим. Таким образом, вы избегаете большого количества повторений кода.
public function executeQuery(string $sql, array $params = []): ?array {
// Prepare/bind/execute
$stmt = $this->con->prepare($sql);
if ($params) {
$stmt->bind_param(str_repeat("s", count($params)), ...$params);
}
$stmt->execute();
// If it was a select query which gives result then return results in an array
if ($result = $stmt->get_result()) {
return $result->fetch_all(MYSQLI_BOTH);
}
// If it is INSERT/UPDATE then return null instead of array
return null;
}
Конечно, этот метод не должен быть частью вашей модели. Он должен быть частью специального класса для связи с базой данных. Затем вы можете создать один его экземпляр в своем приложении и передать его в свою модель.
person
Dharman
schedule
04.07.2020