Т.е. сложно понимаю, что "засунуть" в один объект, что в другой, что должно быть статическим методом, что приватным и тд.
Вообщем писав всё время на процедурке, сложно перейти на ооп.
Подскажите, какой проект начать писать (гостевая, блог), или может начать изучать фреймворк.
Или может подскажите книгу/сайт где пошагово в ооп написан какой-то проект, чтобы быстрее пришло понимание.
Как работодатели смотрят на 40 летних программистов?
особенно тех кто стартует в этом возрасте?
# Install composer plugins
RUN composer global require --optimize-autoloader \
"hirak/prestissimo:${VERSION_PRESTISSIMO_PLUGIN}" && \
composer global dumpautoload --optimize && \
composer clear-cache
{
"name": "pomelchenko/project",
"type": "project",
"description": "description",
"minimum-stability": "stable",
"license": "proprietary",
"require": {
"php": "^7.4",
// тут зависимости для продакшена, когда будешь устанавливать приложение с флагом --no-dev
},
"require-dev": {
"phpunit/phpunit": "^9.5"
// тут зависимости для dev среды, с тестами и прочими инструментами которые несут вспомогательный смысл.
},
"autoload": {
"psr-4": {
"App\\": "src/"
// тут перечисляешь нэймспэйсы и пути до директорий с классами этих нэймспэйсов для приложения, которое будет на проде крутиться
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
// тут перечисляешь нэймспэйсы и пути до директорий с классами этих нэймспэйсов для вспомогательных инструментов, как правило для тестов
}
}
}
exit('Ошибка подключения к базе данных!');
дважды глупость. Пользователю сайта не интересно читать, что у тебя сломалось - база данных или деньги на пиво кончились. Как программисту, тебе эта бессмысленная фраза тем более бесполезна, она ничего не говорит о том, ЧТО КОНКРЕТНО сломалось, чтобы ты мог исправитьif ($numRows > 0) {
бессмысленный кусок кодаwhile ($row = $result->fetch_assoc()) {
заменяется на $result->fetch_all(MYSQLI_ASSOC)
$this->connect()
коннектимся каждый раз, чтобы выполнить запрос, серьёзно?class Handler extends Dbh
ВООБЩЕ непонятно зачем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]);
}
}
return [
'db' => [
'host' => '127.0.0.1',
'username' => '',
'password' => '',
'dbname' => '',
'port' => 3306,
],
];
$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");
}
//сразу от body обращаемся, что бы избежать следующего вопроса - "а почему не работает клик, если подгружать динамически модалку "
$('body').on('click', '.open-modal-work-js', function(){
var get_id = $(this).attr("data-id");
$.ajax({
type: 'POST',
url: '/path-to-action.php',
data: {
id: get_id
},
success: (data) => {
$('.modal-window').show().html(data);
}
});
});
$id = $_POST['id'];
$sql= "SELECT * FROM works WHERE id_w = ".$id." ";
запрос составлен не верно и кишит sql инъекциями, предлагаю почитать что это - sql инъекции и заодно взглянуть на pdo. так же на примеры ajax запросов в связке php и mysql
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect($host, $user, $pass, $db_name);
$link->set_charset("utf8mb4");
error_reporting(E_ALL);
ini_set('display_errors',1);
, а на боевом - ini_set('display_errors',0);
ini_set('log_errors',1);
, и смотреть, соответственно, в логах.$sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
$stmt = $link->prepare($sql);
$stmt->bind_param("sssss", $title, $discription, $date, $path);
$stmt->execute();
$host = '127.0.0.1';
$db = 'test';
$user = 'root';
$pass = '';
$port = "3306";
$charset = 'utf8mb4';
$options = [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::ATTR_EMULATE_PREPARES => false,
];
$dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
$pdo = new \PDO($dsn, $user, $pass, $options);
$sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
$stmt = $link->prepare($sql);
$stmt->execute([$title, $discription, $date, $path]);
<?php
require __DIR__ . '/vendor/autoload.php';
// теперь можем работать с VK API
$vk = new VK\Client\VKApiClient();
/**
* @var string $databaseName2
*/
$databaseName2 = $this->db2->database;