Ну тут скорее ни одной почти строчки нормальной.
exit('Ошибка подключения к базе данных!');
дважды глупость. Пользователю сайта не интересно читать, что у тебя сломалось - база данных или деньги на пиво кончились. Как программисту, тебе эта бессмысленная фраза тем более бесполезна, она ничего не говорит о том, ЧТО КОНКРЕТНО сломалось, чтобы ты мог исправить
if ($numRows > 0) {
бессмысленный кусок кода
while ($row = $result->fetch_assoc()) {
заменяется на $result->fetch_all(MYSQLI_ASSOC)
$this->connect()
коннектимся каждый раз, чтобы выполнить запрос, серьёзно?
- А когда будет еще один класс, для другой таблицы, снова будешь писать код подключения к БД? И так в каждом?
- Почему класс для работы с "позициями" называется DBh?
- По сути это не класс, а набор функций. Если ты уберешь красивые слова class и this, то НИЧЕГО не изменится
- SQL инъекции кругом
class Handler extends Dbh
ВООБЩЕ непонятно зачем
В общем, как-то так
dbh.php
class Dbh
{
public $conn;
public function __construct($config)
{
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$this->conn = new mysqli(...$config);
$this->conn->set_charset('utf8mb4');
}
public function preparedQuery($sql, $params, $types = '')
{
$types = $types ?: str_repeat('s', count($params));
$stmt = $this->conn->prepare($sql);
$stmt->bind_param($types, ...$params);
$stmt->execute();
return $stmt;
}
public function selectResult($sql, $params, $types = '')
{
if (!$params) {
return $this->conn->query($sql);
}
return $this->preparedQuery($sql, $params, $types)->get_result();
}
public function selectAll($sql, $params = [], $types = '')
{
return $this->selectResult($sql, $params, $types)->fetch_all(MYSQLI_ASSOC);
}
public function selectAssoc($sql, $params = [], $types = '')
{
return $this->selectResult($sql, $params, $types)->fetch_assoc();
}
public function selectRow($sql, $params = [], $types = '')
{
return $this->selectResult($sql, $params, $types)->fetch_row();
}
public function selectCell($sql, $params = [], $types = '')
{
$row = $this->selectRow($sql, $params, $types);
return $row ? $row[0] : false;
}
}
position.php
class Position
{
protected $dbh;
public function __construct(Dbh $dbh)
{
$this->dbh = $dbh;
}
// Получаем все позциии из БД и возвращаем их в массиве $output если записей больше нуля
public function getAllPositions()
{
return $this->dbh->selectAll('SELECT * FROM positions');
}
protected function addPosition($content)
{
$count = $this->dbh->selectCell('SELECT count(*) FROM positions');
if ($count < 10) {
$this->dbh->preparedQuery("INSERT INTO positions (content) VALUES (?)", [$content]);
}
}
protected function deletePosition($id)
{
$this->dbh->preparedQuery("DELETE FROM positions WHERE id = ?", [$id]);
}
//Поиск позиций в БД по столбцу content
protected function searchPosition($content)
{
$content = "%$content%";
return $this->dbh->selectAll('SELECT * FROM positions WHERE content LIKE ?',[$content]);
}
}
config.php
return [
'db' => [
'host' => '127.0.0.1',
'username' => '',
'password' => '',
'dbname' => '',
'port' => 3306,
],
];
handler.php
$config = require 'config.php';
$dbh = new Dbh($config['db']);
$position = new Position($dbh);
switch ($_GET['action']) {
case 'getpositions':
$output = $position->getAllPositions();
echo json_encode($output);
break;
case 'addposition':
$content = $_GET['content'];
$position->addPosition($content);
break;
case 'getsearchpositions':
$content = $_GET['content'];
$output = $position->searchPosition($content);
echo json_encode($output);
break;
case 'deleteposition':
$id = $_GET['id'];
$position->deletePosition($id);
break;
default:
header("HTTP/1.0 400 Bad Request");
}