Ставки скрыты
Ставки пока отсутствуют
-
Алексей Митрошин
9 февраля 2022
<?
class DBI
{
## Class properties description
var $dbh, # database link handler
$sth, # resource handler
$errno, # database error number
$errmsg, # database error message
$host, # host
$user, # user name
$pass, # password
$database, # database name
$q, # query text
$log_file = '', # Log FileName, if empty - no loging mysqlog.txt
$time_limit = 1.5; # Log only querys above this time
#@@@ PUBLIC METHODS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
### Connect to server and select database
function connect($host="",$user="",$pass="", $database="")
{
error_reporting(!E_WARNING);
$this->dbh=mysql_connect($host,$user,$pass);# or $this->GetError("Connection failed");
if (!$this->dbh){
echo "На сервере ведутся технические работы. Извините за доставленное неудобство.";
exit;
return false;
}else{
error_reporting(E_ALL & ~E_NOTICE);
mysql_select_db($database) or $this->GetError("Database selection failed");
$this->database = $database;
return true;
}
}
## set auto_recoding from cp1251 to koi8ukr
function cp1251_koi8(){
$this->query("set option character set cp1251_koi8");
}
## set auto_recoding to default
function to_default(){
$this->query("set option character set DEFAULT");
}
### Send query
function query($query="", $debug_query = 0){
global $debug_query;
if(!$query){
echo "DB class error: [No query parameter]";
$this->close();
exit;
}
if($debug_query){
//echo "<pre>".$query."</pre>";
echo $query."<br>---<br>";
}
$this->q = $query;
$page_parse_time_start = microtime();
if($query)
$this->sth = mysql_query($query, $this->dbh) or $this->GetError("Query error");
if ($_SERVER['REQUEST_URI'] and $this->log_file)
$tmp = explode('.',$_SERVER['REQUEST_URI']);
if($this->log_file && !in_array(strtolower($tmp[count($tmp)-1]),array('jpg', 'png', 'gif'))){
$time_start = explode(' ', $page_parse_time_start);
$time_end = explode(' ', microtime());
$time_int = $time_end[1] + $time_end[0] - ($time_start[1] + $time_start[0]);
if($time_int > $this->time_limit){
$parse_time = number_format($time_int, 3);
###### лог запросов в файл #########
$query = ereg_replace("\r", "", $query);
$query = ereg_replace("\n", " ", $query);
global $ROOT_DIRECTORY, $HTTP_AFTER, $domain;
$fp = fopen($ROOT_DIRECTORY.$this->log_file, "a+");
fwrite($fp, date(" H:i:s")." ".$parse_time." ".$_SERVER['REMOTE_ADDR']." ".($domain ? $domain.'.'.$HTTP_AFTER : $_SERVER['SERVER_NAME']).$_SERVER['REQUEST_URI']." ".session_id()." ".$query."\n");
fclose($fp);
####################################
}
}
return $this->sth;
}
### Return number of result rows of last SELECT QUERY
function num_rows($linkno=0)
//$linkno - number of link resource (default = 0)
{
if (!$this->sth && !$linkno){ ## IF NO RESOURCE
echo "No performed SELECT query: [Invalid resource link]";
exit;
}
$num=mysql_num_rows($linkno ? $linkno : $this->sth);
return $num;
}
### Return number of affected rows of performed query
function affected_rows()
//$linkno - number of link resource (default = 0)
{
$num=mysql_affected_rows();
return $num;
}
### Fetch row as array
function fetch_row($linkno=0)
//$linkno - number of link resource (default = 0)
{
//echo $linkno;
return mysql_fetch_row($linkno ? $linkno : $this->sth);
}
### Fetch row as ac array
function fetch_array($linkno=0)
//$linkno - number of link resource (default = 0)
{
return mysql_fetch_array($linkno ? $linkno : $this->sth);
}
### Fetch row as hash
function fetch_hash($linkno=0)
//$linkno - number of link resource (default = 0)
{
return mysql_fetch_assoc($linkno ? $linkno : $this->sth);
}
### Data seek; Move result pointer to the row $row, by default 0
function seek($row=0, $linkno=0)
//$linkno - number of link resource (default = 0)
{
return mysql_data_seek($linkno ? $linkno : $this->sth,$row);
}
### Fetch field
function fetch_field($row=0,$field=0, $linkno=0){
//$linkno - number of link resource (default = 0)
$flag=true;
if ($row<0 || $row>=$this->num_rows()){
//echo "Data seek error: [Invalid row offset ($row)]";
return false;
}
if ( (!is_int($field)) || $field<0 || $field>=$this->num_fields()){
echo "Field seek error: [Invalid field offset ($field)]";
exit;
}
return mysql_result($linkno ? $linkno : $this->sth,$row,$field);
}
function last_id(){
return mysql_insert_id($this->dbh);
}
function num_fields($linkno=0){
//$linkno - number of link resource (default = 0)
if (!$this->sth && !$linkno){
echo "Fetch length error: [Invalid resource link]";
exit;
}
return mysql_num_fields($linkno ? $linkno : $this->sth);
}
### Close connection
function close(){
@mysql_close($this->dbh);
}
#@@@ PRIVATE METHODS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
## Get database error parameters. Print error, close database connection and terminate
function GetError($hint="")
{
$this->errno=mysql_errno($this->dbh);
$this->errmsg=mysql_error($this->dbh);
$this->close();
$this->q = eregi_replace("select ", "<b>SELECT</b> ", $this->q);
$this->q = eregi_replace("update ", "<b>UPDATE</b> ", $this->q);
$this->q = eregi_replace("insert ", "<b>INSERT</b> ", $this->q);
$this->q = eregi_replace(" from ", "\n<b>FROM</b> ", $this->q);
$this->q = eregi_replace(" left ", "\n<b>LEFT</b> ", $this->q);
$this->q = eregi_replace(" right ", "\n<b>RIGHT</b> ", $this->q);
$this->q = eregi_replace(" join ", " <b>JOIN</b> ", $this->q);
$this->q = eregi_replace(" where ", "\n<b>WHERE</b> ", $this->q);
$this->q = eregi_replace(" order ", "\n<b>ORDER</b> ", $this->q);
$this->q = eregi_replace(" group ", "\n<b>GROUP</b> ", $this->q);
$this->q = eregi_replace(" limit ", "\n<b>LIMIT</b> ", $this->q);
$e = debug_backtrace();
echo '<b>Error</b> in line: <b>'.$e[1]['line'].'</b> [<font color="green">'.$e[1]['file'].'</font>]';
echo '<pre>';
echo $this->q;
echo '</pre>';
echo "<b>$hint.</b> Error #",$this->errno,"<blockquote>",$this->errmsg,"</blockquote>";
exit;
}
}
?>
Актуальные фриланс-проекты в категории PHP
После смены версии PHP с 7.0 на 7.4 на сайте OpenCart немного съехали два элемента: меню на главной странице и поля в оформлении заказа.
Хочу бот для Телеграмма. Загрузка диалогов. С помощью ИИ проверка на потенциальную ложь. Сайт с расширенными возможностями. Регистрация, апи, статистика и т д .
Необходимо мигрировать интернет-магазин Opencart с PHP 7.4 на PHP 8.x. В настоящее время стоит ядро v 3.0.3.8. Читаем, что скорее всего придется мигрировать и ядро на версию 4.0 и вроде сложностей не должно быть... Функционал в основном кастомный, также есть Simple, OCFilter, Нова пошта. Ждем рекомендации и ориентировочную цену. В идеале, кто уже проводил подобную работу.
Необходимо выполнить обновление, перенос и настройку Laravel-проектов на новый сервер с обеспечением стабильной работы, безопасности, защиты от эксплойтов и корректной работы всех сервисов после миграции. 1. Основные задачи Подготовить новый сервер к работе. Перенести файлы проектов, базы данных, конфигурации и cron-задачи. Обновить серверное программное обеспечение. Настроить безопасное окружение для Laravel. Проверить совместимость PHP, Laravel, Composer-пакетов и зависимостей. Обеспечить защиту от известных эксплойтов, вредоносных запросов и несанкционированного доступа. Настроить SSL-сертификаты. Проверить работоспособность сайтов после переноса. 2. Перенос Laravel-проектов Для каждого проекта необходимо: Перенести файлы проекта. Перенести базу данных. Перенести .env конфигурацию. Настроить права доступа к директориям: storage bootstrap/cache Проверить работу: главной страницы; админ-панели; авторизации; форм; API; загрузки файлов; email-отправки; cron-задач; queue workers.3. Безопасность и защита Необходимо реализовать базовый и прикладной уровень защиты: закрыть root-доступ по SSH; настроить SSH-доступ только по ключам; изменить стандартный SSH-порт, если нужно; настроить firewall; разрешить только необходимые порты; установить Fail2Ban; скрыть служебные версии Nginx/Apache/PHP; запретить доступ к .env, .git, backup-файлам, log-файлам; настроить правильные file permissions; проверить проекты на наличие вредоносных файлов; проверить Composer-пакеты на известные уязвимости; обновить зависимости, если это не ломает функционал; настроить защиту от SQL injection, XSS, CSRF и path traversal; проверить правильность Laravel APP_ENV и APP_DEBUG; установить APP_DEBUG=false на production; настроить rate limiting для критических endpoint-ов; проверить доступы к storage/uploads; настроить защиту от выполнения PHP в upload-директориях; проверить права доступа к админ-панелям. 4. SSL и домены Необходимо: Установить SSL-сертификаты. Настроить автоматическое обновление SSL. Включить редирект с HTTP на HTTPS. Проверить корректную работу сайтов через HTTPS. 5. Резервное копирование Необходимо настроить backup: файлов проектов; баз данных; .env файлов; uploaded media; cron-конфигураций; Nginx/Apache конфигураций. Backup должен выполняться автоматически по расписанию. Желательно хранить копии отдельно от основного сервера. 6. Проверка после переноса После миграции необходимо проверить: отсутствие 500/403/404 ошибок; отсутствие критических ошибок в Laravel logs. 9. Результат выполнения После завершения работ должно быть: Laravel-проекты успешно перенесены на новый сервер; сайты работают стабильно; SSL настроен; сервер защищен базовыми security-настройками; доступы к критическим файлам закрыты; backup настроен; cron и queues работают; старый сервер можно отключить после финальной проверки.
Разработка двух специализированных сайтов по продаже запчастейОбщая информация Необходимо разработать два специализированных сайта: Запчасти для квадроциклов, UTV, SSV и другой подобной техники. Запчасти для специальной техники. Существующий сайт компании: https://kiaparts.com.ua/ Новые проекты не должны быть копией существующего сайта. Необходимо предложить современное решение с акцентом на SEO, скорость работы, удобство для клиентов и менеджеров, а также возможность дальнейшего развития и масштабирования.Основная цель проекта Создать не просто интернет-магазин, а платформу для продажи запчастей, которая будет: хорошо индексироваться Google; привлекать органический трафик; удобно наполняться менеджерами; поддерживать большие каталоги товаров; легко масштабироваться в будущем. Для меня важнее получить правильную архитектуру и фундамент проекта, чем большое количество функций в первой версии.Архитектура проекта Необходимо два отдельных сайта для клиентов. При этом желательно, чтобы они были построены на единой платформе: одна административная панель; общий функционал; одна или связанные базы данных; отдельные домены; отдельное наполнение; возможность различного дизайна и оформления для каждого проекта. То есть фактически два отдельных сайта для клиента, но одна система управления для компании. Преимуществом будет модульная архитектура, которая позволит в будущем запускать новые проекты на этой самой платформе.SEO (один из главных приоритетов) Главная задача сайта не только продавать товар, а и получать максимальную органику из Google. Для каждой запчасти должна создаваться отдельная страница товара с собственной URL-адресой. К задаче прилагается пример существующей страницы товара, которая демонстрирует общий принцип наполнения SEO-информацией. Для каждого товара должна быть возможность добавлять: номер детали; OEM номер; кросс-номера; аналоги; бренд; название; альтернативные названия; характеристики; фото; описание; PDF-файлы; список применений; список моделей техники. Основная цель: Чтобы одна запчасть могла получать трафик по десяткам различных поисковых запросов: OEM номер; кросс-номер; аналог; название; бренд; модель техники.Важно относительно структуры данных Не хочу, чтобы менеджеры вручную писали большие тексты для каждой страницы. Желательно реализовать структурированную систему данных: Товар → OEM номер → Кросс-номера → Аналоги → Применения → Модели техники → SEO страница То есть менеджер заполняет информацию один раз, а система использует её для: SEO; поиска; перелинковки; фильтров; аналогов.Каталог и поиск Необходимо реализовать поиск: по номеру; по части номера; по OEM номеру; по кросс-номеру; по названию; по бренду. Желательно: автоподсказки; быстрый поиск; поиск аналогов; быстрая работа даже при большом каталоге.Импорт и обновление товаров Обязательно: импорт Excel; импорт CSV; экспорт данных; массовое обновление цен; массовое обновление остатков; массовое обновление описаний; массовое обновление фотографий; массовое обновление SEO-данных.Складской учет Необходимо реализовать: несколько складов; отображение наличия; резервирование товаров; синхронизацию остатков. В перспективе необходима возможность синхронизации со старым основным сайтом и другими проектами компании.Безопасность Необходимо предусмотреть: защиту административной панели; двухфакторную авторизацию; разграничение прав доступа; журнал действий пользователей; защиту от типичных атак; защиту API и интеграций.Резервное копирование Необходимо реализовать: автоматические дампы базы данных; автоматическое резервирование файлов; резервирование фотографий; резервирование документов; автоматическое сохранение копий в облако (Google Drive, AWS, Backblaze или аналогичные сервисы); возможность быстрого восстановления после сбоя или взлома.Дальнейшее развитие На первом этапе реализация ниже перечисленного функционала не является обязательной. Но архитектура должна позволять его дальнейшее внедрение без необходимости создания нового сайта. В будущем могут быть реализованы: AI-поиск по каталогу; AI-генерация описаний товаров; AI-генерация SEO-контента; автоматический поиск аналогов; интеграция с CRM; интеграция с поставщиками через API; автоматизация работы менеджеров; аналитика продаж; B2B кабинеты клиентов; маркетинговые инструменты. Поэтому важно, чтобы архитектура была готова к дальнейшему развитию.Примеры сайтов Нравятся по структуре, логике и удобству: Chrysler.com.ua Secoparts.net Comtac.parts RockAuto.com Не нужно копировать дизайн этих сайтов. Они приведены как примеры удобной структуры каталога, поиска и подачи информации.Платформа Допускается использование OpenCart, WordPress/WooCommerce или других платформ. Главные требования: хорошая SEO-архитектура; быстрая работа; возможность масштабирования; наличие API; возможность дальнейшего развития. Прошу обосновать выбор платформы и объяснить перспективы развития проекта на ней.Бюджет Ориентировочный бюджет первого этапа: 3 000 – 7 000 USD за весь проект (два сайта на единой платформе). Бюджет может быть пересмотрен после обсуждения архитектуры и этапов реализации. Готов рассматривать поэтапную реализацию, но для запуска желательно более срочно реализовать часть. Важно получить правильную архитектуру и качественный фундамент для дальнейшего развития, чем максимальное количество функций в первой версии.От исполнителя ожидаю предложение архитектуры; рекомендацию платформы; примеры аналогичных работ; ориентировочный бюджет; ориентировочные сроки; видение дальнейшего развития проекта. Большим плюсом будет опыт создания каталогов автозапчастей, магазинов с поиском по OEM-номерам и кросс-номерам, а также проектов с большим каталогом товаров. также просьба к заявке желательно добавить короткое описание того, как именно вы видите SEO-архитектуру проекта и каким образом будет обеспечиваться органический рост каталога. Фото добавляю для простого примера страницы под органический поиск