Задать вопрос
  • Куда правильнее вынести создание prepared statement?

    TrogWarZ
    @TrogWarZ
    web developer
    Кто и где отвечает за хранение моделей (и в т.ч. за работу с хранилищем) зависит от задачи и используемой идеологии (active record vs data mapper).

    Грубо и кратко: в случае AR проще всего делать это с помощью сервиса прямо в модели, в случае DM в репозитории.
    Но для лучшего понимания хотя бы погуглите эти термины.
    Ответ написан
    Комментировать
  • Как обеспечить бесперебойный мониторинг работы сайтов/серверов, и их безопасность?

    Sanes
    @Sanes
    Очень просто. Набираете команду компетентных сотрудников и вперед. Аудит, ревизия и т.д.
    Ответ написан
    Комментировать
  • Был один интерактивный ресурс по SQL. Не помните ли?

    @protven
    Вот с "черной консолью" я помню только один, datamonkey.pro. Но не помню какие там были задания. А так, классический и очень прикольный ресурс - это sql-ex.ru , но это явно "не то".
    Ответ написан
    1 комментарий
  • Как сделать конструктор класса правильно?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Обычно это делается в отдельном методе, наподобие Save.

    У пользователя, которого нет в базе, $this->id будет нулевым.

    И для загрузки данных лучше сделать отдельный метод - Load.

    public function __construct($id = NULL)
    {
      $this->id = $id;
      $this->Load();
    }
    
    public function Load()
    {
      // идентификатор не указан, загружать данные не нужно
      if (!isset($this->id) || (int)$this->id == 0)
      {
        return false;
      }
    
      // указан идентификатор, загружаем данные в текущий экземпляр класса
      $mysqli = db_connect();
    
      $req = 'SELECT u.ID, u.name, u.age, u.city_id, c.city_name FROM users AS u '.
             'INNER JOIN cities AS c ON (c.city_id = u.city_id) '.
             'WHERE u.ID = '.$this->id; // опасно так передавать в запрос данные
    
      $res = $mysqli->query($req);
    
      if ($res !== false){
        if ($res->num_rows == 1 )
        {
          // смысла в цикле нет, ожидается ведь одна строка данных
          while ($row = $res->fetch_assoc())
          {
            $this->id = $row['ID'];
            $this->username =  $row['name'];
            $this->city_name = $row['city_name'];
            $this->city_id = $row['city_id'];
            $this->age = $row['age'];
          }
        }
        else
        {
          return false;
        }
      }
      else
      {
        return false;
      }
    }
    
    public function Save()
    {
      $sql = '';
      $params = [];
    
      if (!isset($this->id) || (int)$this->id == 0)
      {
        // запрос на добавление данных в базу
        $sql = 'INSERT INTO users (name, city_id, age) VALUES (?, ?, ?)';
        // параметры запроса
        $params = [$this->username, $this->city_id, $this->age];
      }
      else
      {
        // запрос на обновление данных в базе
        $sql = 'UPDATE users SET name = ?, city_id = ?, age = ? WHERE ID = ?';
        // параметры запроса
        $params = [$this->username, $this->city_id, $this->age, $this->id];
      }
    
      // код выполнения запроса
      // не могу быть уверен в коде, давно не писал и проверять лень
      // должно быть что-то типа такого:
    
      $mysqli = db_connect(); // лучше сделать отдельный метод для создания и закрытия соединений
    
      // подготавливаем запрос
      $s = $mysqli->prepare($sql);
    
      // выполняем запрос с указанными параметрами
      $s->execute($params);
    
      // тут еще неплохо бы закрыть все соединения :-)
    }

    Можно пойти дальше и сделать базовый класс, который будет содержать готовые методы Load и Save.
    Либо сделать отдельный класс, который будет получать данные и заполнять экземпляры классов этими данными, сохранять и удалять данные. В таком случае классы таблиц (сущности) будут просто описывать структуру данных в базе и не будут выполнять никаких действий. Этот вариант мне нравится больше, т.к. он чище (проще) и более гибкий.

    Придется придумать, как сопоставлять данные, если имена свойств не соответствую именам полей в базе. Скорее всего интерфейсы нужно будет использовать. Также учесть свойства, которые не определены в базе (которые следует игнорировать).

    Для работы со структурой классов потребуется использовать Reflection.
    В общих чертах примерно следующим образом:

    // создаем экземпляр класса User
    $instance = new User();
    
    // получаем информацию об экземпляре класса
    $r = new \ReflectionClass($instance);
    
    // получаем список публичных свойств
    $propeties = $r->getProperties(\ReflectionProperty::IS_PUBLIC);
    
    // перебираем все свойства
    foreach ($propeties as $property)
    {
      // получаем имя свойства
      $propertyName = $property->getName();
      // получаем значение свойства
      $propertyValue = $property->getValue();
      // и далее можно использовать полученную информацию
      // для формирования динамических запросов к базе
    
      // полученные из базы данные можно передать в нужные свойства
      $property->setValue("значение из базы");
    }

    Готовое решение найти будет проще :-)
    Ответ написан
    1 комментарий
  • Как сделать такую таблицу?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Вот это достаточно мощная штука datatables.net
    Ответ написан
    Комментировать
  • Как встроить обработчик ajax запроса на страницу с контентом?

    DevMan
    @DevMan
    в самом начале страницы сделать типа:
    if( isset($_GET['ajax']) ) {
        // нужный код
        exit;
    }
    и с ajax-запросом передавать параметр ajax.
    если невозможно вставить в самое начало или есть вывод до этого, то впридачу использовать буферизацию вывода.
    Ответ написан
    4 комментария
  • Как добавить в выборку графу из другой таблицы?

    @davidnum95
    SELECT schedule.*, couriers.full_name FROM schedule LEFT  JOIN couriers ON couriers.id = schedule.courier_id WHERE `trip_start` > '$2015-06-15' AND `trip_end` < '2016-01-01'
    Ответ написан
    Комментировать
  • Как вывести алертом xhr.responseText в jquery?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    ...
    success: function(response) {
        console.log(response);
    },
    ...
    Ответ написан
    Комментировать
  • Как вывести алертом xhr.responseText в jquery?

    nazarpc
    @nazarpc
    Open Source enthusiast
    https://api.jquery.com/jQuery.ajax/
    success
    Type: Function( Anything data, String textStatus, jqXHR jqXHR )


    У вас текст в первом аргументе, а jqXHR (что не то же самое что нативный XHR) в третьем.
    Ответ написан
    Комментировать
  • Почему не срабатывает условие проверки результирующего массива на NULL?

    Потому что, query не возвращает NULL.

    Возвращает FALSE в случае неудачи. В случае успешного выполнения запросов SELECT, SHOW, DESCRIBE или EXPLAIN mysqli_query() вернет объект mysqli_result. Для остальных успешных запросов mysqli_query() вернет TRUE.
    Ответ написан
    3 комментария
  • Изменяется ли объект класса DateTime при применении метода modify?

    qonand
    @qonand
    Software Engineer
    при применении modify изменения значение даты и времени происходит внутри самого объекта DateTime, т.е. $date=$date->modify() - не имеет смысла.
    Ответ написан
    4 комментария
  • Реализация TCP/IP как general I/O на 8bit avr?

    NeiroNx
    @NeiroNx
    Программист
    Такая реализация уже есть - для сетевого контроллера ENC28J60, у которого есть лишь буферы приема и передачи. В стандарте нет жестких таймингов - все можно устанавливать в timeout. В конечном счете пострадает лишь скорость обмена информацией и память нужная чтобы обрабатывать сокеты и отсылку хардварных пакетов(SYN, ACK).

    Но если вы имели ввиду реализацию Ethernet 10/100Mbit( выводы мк сразу на трансформатор) - то ответ нет AVR не потянет даже на 10 Мбит и он не может работать аппаратно с Дифференциальными парами напрямую.
    Ответ написан
    Комментировать
  • Где и в каких случаях правильно использовать extern?

    @Mercury13
    Программист на «си с крестами» и не только
    Назначение extern единственное. Мы говорим, что этой переменной нет в данной единице компиляции, но не надо переживать, она есть в другой и компоновщик её подкомпонует.

    По факту является extern’ом static-поле класса. Это решение принято Строуструпом по простой причине: определение класса может промелькнуть несколько раз в разных единицах компиляции, а определение переменной должно быть одно на программу.

    Если ваш код не работает без extern — это значит, что где-то нашлась глобальная переменная по имени client, и для корректной работы вебмастера потребовалось обращаться к этому нашему клиенту. По факту — очень навороченный способ создать static-поле.

    Таким образом, у вас три варианта.

    1. Если Ethernet-клиент один на всех вебмастеров, вам нужно static-поле.
    // HEADER
    class WebMaster {
    public:
        WebMaster();
        bool connect_open();
    private:
        static EthernetClient client;
    }
    
    // CPP
    EthernetClient WebMaster::client;


    Впрочем, этот вариант крайне маловероятен.

    2. Скорее всего, у вас один вебмастер — один клиент и, вероятно, вам нужно обычное нестатическое поле.
    class WebMaster {
    public:
        WebMaster();
        bool connect_open();
    private:
        EthernetClient client;
    }


    3. Если у нас приходится привязывать мастеров к клиентам, приходится использовать указатели и ссылки. В простейшем виде…
    // HEADER
    class WebMaster {
    public:
        WebMaster(EthernetClient& aClient);
        bool connect_open();
    private:
        EthernetClient& client;
    }
    
    // CPP
    WebMaster::WebMaster(EthernetClient& aClient) : client(aClient) {}
    
    ...
    EthernetClient client;
    WebMaster webmaster(client);
    Ответ написан
    Комментировать
  • Как наиболее простым способом написать демона под win, который будет вызывать php скрипт?

    @skazi_premiere
    Верстаем как умеем ;) HTML/CSS/JS
    Планировщик заданий, нет? Вызывайте браузер с этой страницей. e9ed1f03cbec4b60bf3a5e3e35e3834c.png
    Ответ написан
    5 комментариев
  • Можно ли получить видеопоток с ip камеры без установки доп. расширений в браузер?

    A_M
    @A_M
    Основная специализация - системы видеонаблюдения
    Как вариант можно попробовать Ivideon. Напрямую на сайт выталкивать rtsp или mjpeg over http не получится из-за ограниченных внутренних ресурсов камеры. Она не вытянет одновременно больше 5-10 пользователей.
    Ответ написан
    3 комментария
  • Как получить int из значения параметра r1_input строки типа "GET /set?r1_input=123?&nocache=885898.3828703746 HTTP/1.1"?

    auto end = str.find("?", start);
    Это неверно, точнее неверно сформулирован вопрос.
    Искать нужно "&"
    Реальное значение передано в поле "123?"
    Ответ написан
    Комментировать
  • Как получить int из значения параметра r1_input строки типа "GET /set?r1_input=123?&nocache=885898.3828703746 HTTP/1.1"?

    AtomKrieg
    @AtomKrieg
    Давай я поищу в Google за тебя
    Пользуйтесь всеми преимуществами STL в с++. strtok в нем не очень нужен.
    #include <string>
    #include <iostream>
    #include <stdexcept>
    
    int r1_input(const std::string& str)
    {
    	using namespace std;	
    	string varname = "r1_input=";
    
    	auto start = str.find(varname);
    	if (start == string::npos)
    		throw invalid_argument(varname+ " not found");
    
    	start += varname.size();
    
    	auto end = str.find("?", start);
    	size_t len = (end == string::npos) ? string::npos : end-start;
    	return stoi(str.substr(start, len));
    }
    
    int main()
    {
    	std::string input = "GET /set?r1_input=123?&nocache=885898.3828703746 HTTP/1.1";
    	std::cout << r1_input(input) << std::endl;
    
    	system("pause");
    	return 0;
    }
    Ответ написан
    Комментировать
  • Как получить последние х строк из mysql?

    MaxDukov
    @MaxDukov
    впишусь в проект как SRE/DevOps.
    сортируйте c ORDER BY по любому удобному Вам полю, потом делайте LIMIT
    сортировать можно по любому полю
    Ответ написан
    Комментировать
  • Как получить последние х строк из mysql?

    valerium
    @valerium
    Изобретая велосипед
    SELECT * FROM `имя_таблицы` ORDER BY `Дата` DESC LIMIT 10;


    И если нужно именно последние x в хронологическом порядке, то сортировать по полю с датой — это единственное правильное решение, потому что никто не гарантирует, что id привязан к хронологии. Например, данные о погоде могли быть добавлены «задним числом».

    UPD. Действительно, допустил ошибку в ответе, поправил.
    Ответ написан
    Комментировать