link) $this->link->close(); } public function connect(): bool { $this->link = new mysqli(); $result = $this->link->real_connect($this->host, $this->user, $this->password, $this->database); if ($result) $this->link->set_charset('utf8mb4'); return !!$result; } public function query(string $sql, ...$args): mysqli_result|bool { $sql = $this->prepareQuery($sql, ...$args); $q = $this->link->query($sql); if (!$q) logError(__METHOD__.': '.$this->link->error."\n$sql\n".backtrace(1)); return $q; } public function fetch($q): ?array { $row = $q->fetch_assoc(); if (!$row) { $q->free(); return null; } return $row; } public function fetchAll($q): ?array { if (!$q) return null; $list = []; while ($f = $q->fetch_assoc()) { $list[] = $f; } $q->free(); return $list; } public function fetchRow($q): ?array { return $q?->fetch_row(); } public function result($q, $field = 0) { return $q?->fetch_row()[$field]; } public function insertId(): int { return $this->link->insert_id; } public function numRows($q): ?int { return $q?->num_rows; } // public function affectedRows() { // return $this->link->affected_rows; // } // // public function foundRows() { // return $this->fetch($this->query("SELECT FOUND_ROWS() AS `count`"))['count']; // } public function escape(string $s): string { return $this->link->real_escape_string($s); } }