Архив рубрики: PHP

Простая загрузка файла на сервер используя JQUERY

Задача: сохранить файл на сервер без обновления страницы. Т.е. при помощи ajax

Решение:

Клиентская часть:

<h1>Отправка сообщения в техподдержку</h1>
    <div id="snd">
        <form id="data" method="post" enctype="multipart/form-data">
            <textarea id="tehtxt" name="tehtxt" class="form-control" rows="3" placeholder="Сообщение для техподдержки"></textarea>
            <br/>
            <input name="image" type="file" />
            <br/>
            <button class="btn btn-success" id="buttonsendteh">Отправить сообщение</button>
        </form>
    </div>
    <br/>
    <script>
        $("form#data").submit(function(e) {
                e.preventDefault();    
                var formData = new FormData(this);
                $("#buttonsendteh").hide();
                $.ajax({
                    url: "index.php?route=/controller/server/sendtoteh.php",
                    type: 'POST',                  
                    data: formData,
                    success: function (data) {
			$("#snd").html(data);    
			ListSbssMessages();
			$("#buttonsendteh").show();
                    },
                    cache: false,
                    contentType: false,
                    processData: false
                });
        });
    </script>    

Серверная часть:

 $tehtxt=mysqli_real_escape_string($sqlcn->idsqlconnection,$_POST["tehtxt"]);
 $prc="";  
  if (isset($_FILES['image'])==true){
    $orig_file = $_FILES['image']['name']; 
    $userfile_name = GetRandomId(8) . '.' . pathinfo($orig_file, PATHINFO_EXTENSION);
    $src = $_FILES['image']['tmp_name'];    
    $res = move_uploaded_file($src, WUO_ROOT."/files/".$userfile_name);     
    $prc="Прикрепленный файл: $userfile_name";
  };

Работаем с Router OS через API

Задача: организовать блокировку абонентов по «балансу», установка скорости интернета абонента, защита от «ручных IP». Биллинг: Lanbilling, Железка: Router OS

  1. Блокировка по «балансу»
Читать далее Работаем с Router OS через API

Клиент IRC сети на PHP

Задача: отправить сообщение абоненту сети IRC.

Решение: написал соответствующий класс. Исходники выложил на GitHub

<?php

/* 
 * (с) 2018 Грибов Павел
 * http://грибовы.рф * 
 * Если исходный код найден в сети - значит лицензия GPL v.3 * 
 * В противном случае - код собственность ГК Яртелесервис, Мультистрим, Телесервис, Телесервис плюс * 
 */

class Tirc{
    var $debug=false;
    var $server="localhost";
    var $port=6667;    
    var $errno0;
    var $errstr="";
    var $timeout=10;
    var $socket;
    var $nick="noname";
    var $chanel="noname";
    
    /**
     *  Внутрення функция для логов
     */
    private function putlog($st){
        if ($this->debug==true) echo date("H-i-s")." : ".trim($st)."\n";
    }
    
    /**
     * Конструктор класса. Вызывается при создании экземпляра
     * @param type $server  - хост сервера
     * @param type $port    - порт сервера
     */
    function __construct($server, $port,$debug=false) {
            $this->server = $server;
            $this->port = $port;
            $this->debug=$debug;
            $this->putlog("лог в режиме DEBUG");
            $this->putlog("сервер $server, порт $port");
    }	    
    /**
     *  Соединение с сервером. Возврат - результат
     * @return type
     */
    function connect(){
        $this->putlog("пробуем соедениться с irc сервером");        
        $this->socket=stream_socket_client("tcp://$this->server:$this->port", $this->errno, $this->errstr,$this->timeout,STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT);
        $this->putlog("возврат: errno: $this->errno, errstr: $this->errstr, socket: $this->socket");              
        return $this->socket;        
    }
    /**
     * Разрыв соединения с сервером. Возврат - результат
     */
    function disconnect(){
        $this->putlog("пробуем закрыть соединение с сервером $this->socket");
        $ret=fclose($this->socket);
        $this->putlog("результат: $ret");
    }
    /**
     *  Послать команду серверу. Возврат false или количество посланый байт
     * @param type $command
     * @return type
     */
    function send($command){
        $this->putlog("пробуем послать команду сервер $command");
        $ret=fwrite($this->socket, $command);
        $this->putlog("результат: $ret");
        return $ret;
    }
    function Join($chanel){
        $this->chanel=$chanel;
        $res=$this->send("JOIN :#$chanel\r\n");        
        return $res;
    }
    function is_ping($line){         
        if(strstr($line, 'PING')) {
            $this->putlog("получен PING");
            return true;         
        }            
        
    }
    function pong(){         
        $this->send("PONG :".$this->server."\r\n");         
        $this->putlog("отправлен PONG");
    }    
    function is_msg($line){ 
        if(strstr($line, 'PRIVMSG')) return true;         
    }        
    function SetNick($nick){
        $this->nick=$nick;
        $ret=$this->send("NICK $nick\r\n");
        return $ret;
    }
    function User($name){        
        $ret=$this->send("USER $name $this->server bla :$name\r\n");        
        return $ret;
    }
    function listChans(){
        $this->send("LIST\r\n");         
    }    
    function sendmessage($target, $msg){ 
        $this->send("PRIVMSG $target :$msg\r\n");         
    }    
    function loop($onMessage){
        while (!feof($this->socket)) {
             $res = fgets($this->socket, 256); // ждем сообщений
             $onMessage($res);
             if($this->is_ping($res)) $this->pong();
        };
    }
}

Пример использования:

<?php

/* 
 * (с) 2018 Грибов Павел
 * http://грибовы.рф * 
 * Если исходный код найден в сети - значит лицензия GPL v.3 * 
 * В противном случае - код собственность ГК Яртелесервис, Мультистрим, Телесервис, Телесервис плюс * 
 */

include_once 'irc_class.php';

$irc=new Tirc('ыкуаыукаыука',6667,true);
$irc->connect();
$irc->SetNick("каыукаы");
$irc->User("ыукаыукаыук");
$irc->Join("tviinet");
$irc->listChans();
$irc->loop("OnMessage");
$irc->disconnect();

function OnMessage($msg){
global $irc;
    var_dump(trim($msg));    
    if(strstr($msg,"PRIVMSG")){
        //получаю кто прислал сообщение?
        $ma=  explode("!",$msg);
        $user=  str_replace(":", "", $ma[0]);
        $irc->sendmessage("$user","Hello $user!");
    };
    //список пользователей канала
    if(strstr($msg,":$irc->server 353 $irc->nick = #$irc->chanel :")){
        $users_list=  str_replace(":$irc->server 353 $irc->nick = #$irc->chanel :", "", $msg);        
        //получаю список кто онлайн?
        $irc->send("ISON $users_list");
    };
    //кто онлайн?
    if(strstr($msg,":$irc->server 303 $irc->nick :")){
        $users_online_list= explode(" ",trim(str_replace(":$irc->server 303 $irc->nick :", "", $msg)));                
        //Всем кто онлайн, отправляем сообщения
        foreach ($users_online_list as $user) {
            $irc->sendmessage("$user","Hello $user!");
        }
    };
};

Drupal: Несоответствие определений сущности и/или поля

Решение:

Устанавливаем модуль Devel, становится доступна консоль выполнения php из админки, по адресу http://сайт/devel/php . В нем выполняем следующий код:

try {
\Drupal::entityDefinitionUpdateManager()->applyUpdates();
}
catch (EntityStorageException $e) {
print_r($e);
}

pChart Fatal error: Uncaught Error: Cannot use string offset as an array in

Продолжаю ловить ошибки перевода проекта с PHP 5.4 на PHP 7.2 😉 На этот раз обнаружилось что pChart используемый в части отчетов скорее мертв чем жив, а последнее обновление на официальном сайте от 2014 года. Но! Как всегда нашлись энтузиасты, которые создали форк, в котором в 2.1х ошибки совместимости с PHP 7.2 устранены и выпущена ветка 2.2, не совместимая с pChart 2.1x

https://github.com/bozhinov/pChart2.0-for-PHP7/tree/7.x-compatible

https://github.com/bozhinov/pChart2.0-for-PHP7/tree/2.2