Задать вопрос

Покритикуйте код! Какие грубые и негрубые ошибки совершил?

Больше интересует что я налепил в PHP части кода.

https://github.com/kovil1402/positions-list

Заранее больше спасибо!
  • Вопрос задан
  • 434 просмотра
Подписаться 4 Средний 16 комментариев
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Ну тут скорее ни одной почти строчки нормальной.
  • 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");
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы