Ответы пользователя по тегу PHP
  • DI как правильно внедрять "постоянные зависимости"?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Как быстро все это конструировать не используя DI - контейнеры?


    Ответ - если вы хотите писать приличный код, то никак. Извернуться можно по-разному, но в итоге у вас все равно получится подобие DI контейнера. Круглое - лучше катить. Поэтому проще сразу взять DI контейнер. Рядом в ответах уже подсказали неплохой вариант (League). С ним не так сложно разобраться, просто надо понять базовый принцип.
    Ответ написан
  • Как сделать надежную защиту для личной страницы?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    1. Хранить пароль в открытом виде - неправильно.
    2. На каждой странице вводить пароль - неудобно. Лучше в сессии запомнить, что вы уже его спрашивали

    $password = '...'; // результат работы crypt('пароль');
    if (empty($_SESSION['login'])) {
      if($_POST["login"] === $login && !empty($_POST["password"]) && crypt($_POST["password"]) === $password) {
        // здесь создаем сессию, и пишем в нее что-то типа
        $_SESSION['login'] = TRUE;
      }
    }


    Это черновик, а не готовый код, в нем не хватает некоторых проверок. Применяйте с головой =)

    Очень желательно ознакомиться с вот этим:
    https://www.php.net/manual/ru/faq.passwords.php#fa...

    Второй вариант - использовать авторизацию веб-сервера. Например, для nginx:
    https://nginx.org/ru/docs/http/ngx_http_auth_basic...
    Ответ написан
    Комментировать
  • PHP, class PDO not found, что делать?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Как вариант, в верхней части страницы после namespace - c новой строки добавить

    use PDO;

    Если, конечно, у вас установлено расширение mysql (почти всегда - установлено)
    Ответ написан
  • Как правильно подключать сторонние скрипты?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Обычно создается спец. файл, который подключается первой строкой во всех страничках (или index.php, если все запросы приходят в него). Например, init.php, он кладется в корневую директорию сайта. Т.е. в ту, которая соответствует "http://название_ресурса/". А в нем определяется константа, которая потом используется для подключения библиотек и т.п.

    init.php
    define('DOCROOT', realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR);


    somepage.php
    require_once('./init.php');
    require_once(DOCROOT . 'lib/database.php');


    Также, в init.php можно вынести другие глобальные настройки, например подключение к БД.
    Ответ написан
    Комментировать
  • Как можно изменить значения в БД при помощи PHP?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Если предположить, что у вас таблица вида
    |   id   | reviews_name | reviews_body | reviews_logo |
    -------------------------------------------------------
    |    1   | Вася         | тут был вася | /pic.jpg     |
    -------------------------------------------------------
    |    2   | Петя         | Петя тут был | /pic2.jpg    |
    -------------------------------------------------------

    И вам надо иметь возможность сделать редактирование нескольких строк сразу, то можно вот так:

    $model = [ 'id' => 'Идентификатор', 'reviews_name' => 'Имя', 'reviews_body'=> 'Текст', 'reviews_logo'=>'Аватар' ];
    
    if (!empty($_POST)) {
       $update_review = $db->prepare(
        'UPDATE reviews SET 
          reviews_name = :name, 
          reviews_body = :body,
          reviews_logo = :userpic
        WHERE id = :id'
          );
    
        $id = $_POST['id'];
        $name = $_POST['reviewName'];
        $body = $_POST['reviewBody'];
        $userpic = $_POST['userPic'];
    
        foreach ($_POST['reviews']  as $pr) {
            $data = [];       
            foreach ($model as $field=>$field_name) {
                $data[$field] = !empty($pr[$field]) ? $pr[$field] : '';
            }
            $update_review->execute($data);
       }
        $update_review->execute([
          'name' => $name,
          'body' => $body,
          'userpic' => $userpic,
          'id' => $id
        ]);
    
    $reviews = $db->select ... // получаем отзывы, которые нам нужны
    
    foreach ($reviews as $r) {
       foreach ($model as $field=>$field_name) {
           ?>
           <?=$field_name?>: <input type="text" name="reviews[<?=$r['id']?>][<?=$r[$field]?>]" value="<?=$r[$field]?>" />
           <?php
       }
       ?>
       <br />
       <?php
    }
    ?>
    <input type="submit" />


    Чтобы добавить новое поле - понадобится по сути, только обновить таблицу в БД и массив $data.
    Ответ написан
    Комментировать
  • Стоит ли в PHP в функциях или методах класса закрывать объявленные переменные, для экономии памяти и ЦПУ?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Здесь достаточно подробно описана работа с памятью в PHP
    Ответ написан
    Комментировать
  • Стоит ли создавать интернет-магазин для портфолио на чистом PHP?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Не тратьте время на чистый PHP. Начните с любого распространенного фреймворка, сделайте на нем что-то простое, чем можно будет пользоваться. Главное - четко поставьте себе ТЗ. ПосмОтрите на архитектуру, на организацию кода, сделаете пару модулей. И получите удовольствие, а не будете биться об собственное незнание. Главное, берите что-то нормальное - Laravel, Kohana, Yii, даже opencart можно, чтобы начать с чего-то простого.

    Вы же не начинаете сажать лес, когда нужно сделать деревянный забор, правда? Это только кажется, что все просто. Не просто, серьезно.
    Ответ написан
    Комментировать
  • Как проверить форму отправки без сервера?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Установите локальный сервер, будет очень удобно в дальнейшем. Наиболее хардкорно, зато полезно для обучения - Linux в виртуалке, например, Virtualbox. Можно и попроще, open server, или хоть Денвер - он древний, но довольно прост в установке.

    Также, стоит сделать валидацию формы на стороне клиента, и ресурсы сервера сэкономите, и пользователям удобнее будет. Но стоит отметить, что валидация на стороне клиента не освобождает вас от проверки корректности данных формы на сервере.
    Ответ написан
    Комментировать
  • Какое посоветуете легкое IDE для PHP под Linux?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Netbeans IDE для PHP.

    1. Нет, подсвечивает весь синтаксис.
    2. Да.
    3. Да.
    4. Да.
    5. Да.
    6. проверка синтаксиса PHP - есть, интеграция с интерпретатором PHP - вроде нет, но подсветка отличная, можно указать версию PHP.
    7. Да.
    8. Не настраивал у себя, но вроде бы да.

    Пользуюсь сам уже много лет, мощная IDE c множеством плюсов. Пробовал вместо нее phpStorm - и все равно остался на Netbeans. Да, иногда медленная, но оно того стоит.
    Ответ написан
    Комментировать
  • Как при помощи PHP и cUrl передать GET запрос с XML в теле запроса?

    puchkovk
    @puchkovk Автор вопроса
    Усложнять — просто. Упрощать — сложно.
    Промучавшись с cUrl весь вечер и часть утра, нашел статью на Хабре: habrahabr.ru/post/48726

    Сделал все при помощи file_get_contents.

    $url = 'http://site.ru/api/';
    $xml = '<request><tag>1</tag></request>';
    
    $username = 'user';
    $password = '12345';
    
    $opts = array('http' =>
        array(
            'method'  => 'GET',
            'header'  => "Content-Type: text/xml\r\n"
                . "Authorization: Basic ".base64_encode("$username:$password")."\r\n",
            'content' => $xml,
            'timeout' => 60
        )
    );
    
    $context  = stream_context_create($opts);
    
    $result = file_get_contents($url, false, $context, -1, 40000);


    Уже после того, как все заработало, наткнулся на HTTPFUL, и guzzle, обе библиотеки довольно мощные, httpful - попроще.
    Ответ написан
    Комментировать
  • Как сделать подсчёт времени?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    date('Y-m-d H:i' , time() - mktime('12', '02', '15', '09', '01', '2014'));

    вернет количество годов, месяцев, дней, часов, секунд, прошедших с 12 часов 02 минут 15 сек. 1 сентября 2014 года
    Ответ написан
    Комментировать
  • Как сделать такой запрос?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Тут судя по всему, диапазоны IP адресов, нужно это как-то пересохранить, как сказал FanatPHP в более машиночитаемый вид, возможно, в 2 колонки - start_ip и end_ip и тогда уже строить запрос.

    Можно, теоретически, и регулярку придумать, но мне кажется, она будет какая-то лютая совсем, я явно не быстрая.
    Ответ написан
    Комментировать
  • Как создать архив и добавить в него файлы при помощи php c сохранение прав доступа на добавленные файлы?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Права сохраняются в .tar архивах, которые потом можно зазиповать, как это часто и делают, расширения .tar.gz встречаются нередко.

    Как создать такой архив, подскажет статья, и особенно комментарии к ней: Работа с архивами tar и gz средствами PHP
    Ответ написан
    Комментировать
  • Какой подход к изучению PHP выбрать(+mySQL +jQuery)?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Разберитесь сначала отдельно с PHP и, отдельно, с MySQL. jQuery можно на закуску оставить. Иначе в голове совсем каша будет. По PHP можно посоветовать книгу Дмитрия Котерова "PHP 5 в подлиннике" издательства bhv. Кое-какая информация по MySQL там тоже есть.
    Ответ написан
    Комментировать
  • Как подключать классы Joomla 3 в модулях и компонентах?

    puchkovk
    @puchkovk
    Усложнять — просто. Упрощать — сложно.
    Оно же английскими буквами по экрану пишет, что PHP не находит файл JPATH_ROOT/modules/mod_calctrans/controller.php

    Судя по конструкции "define('_JEXEC', 1) or die('...');" в 3 строке ajax.php вы вызываете его напрямую из браузера. А значит, JPATH_ROOT не определена.

    Почитайте о внутренней "кухне" Joomla. К сожалению, не могу посоветовать литературу, т.к. слишком давно не имел дела с этой CMS.
    Ответ написан