Ответы пользователя по тегу PHP
  • Как реализовать пополнение баланса личного кабинета пользователем сайта?

    @D3lphi
    Раз сервис
    Два сервис
    Три сервис
    И еще много других платежных агрегаторов. У них всех есть встроенный API, с помощью которого можно "прикрутить" их к (веб) приложению.
    Ответ написан
    Комментировать
  • Оптимально ли я парсю данные?

    @D3lphi
    Задержка не из-за того, что вы не так парсите данные, а из-за cURL запроса. Уверен, что это он выполняется так долго. И это от вас не зависит. Собственно, что мешает взять и измерить время выполнения того или иного куска кода?
    Ответ написан
  • Как добавить в БД >> массивы (array) / группа чекбоксов PDO?

    @D3lphi
    $result->bindValue(':delivery', serialize($options['delivery']), PDO::PARAM_STR); // Сериализовать массив.
    // Или
    $result->bindValue(':delivery', json_encode($options['delivery']), PDO::PARAM_STR); // Преобразовать в json - формат.
    // Или
    $result->bindValue(':delivery', implode(',' ,$options['delivery']), PDO::PARAM_STR); // Соединить элементы массива в строку с запятой в качестве разделителя.
    Ответ написан
  • Как работает password_verify?

    @D3lphi
    <?php 
    require "db.php";
    $login2 = $_POST['login2'];
    $password2 = $_POST['password2']; 
    var_dump($password2);
    if (isset($_POST['submit-log'])) {
        $query2 = "SELECT password FROM users WHERE login ='$login2' LIMIT 1";
        #var_dump($query2);
        $query2 = mysqli_query($connect, $query2);
        if( $query2->num_rows ){
            $hash = $query2->fetch_assoc()['password'];
    
            if (password_verify($password2, $hash)) {
                echo "<div style='color:green; font-family: 'Lobster', cursive;'>Вы успешно вошли!</div>";
            }else{
                echo "<div style='color:red; font-family: 'Lobster', cursive;'>Пароли не совпадают!</div>";
            }
        }else{
          echo "<div style='color:red; font-family: 'Lobster', cursive;'>Пользователь не найден!</div>";
        }
    }
    Ответ написан
    Комментировать
  • RedBeanPHP или PDO для манипуляций с базой данных?

    @D3lphi
    Вы сравнивает тапок со слоном. RedbeanPHP - это orm, а pdo - расширение для php, предоставляющая интерфейс для работы с базами данных. ReadbeanPHP использует pdo, чтобы "общаться" с бд. Уметь работать с pdo нужно энивей. А уж какую orm выбирать, решать вам.
    Ответ написан
    2 комментария
  • Как сохранить файл из инпута на сервер?

    @D3lphi
    Создаете форму, внутрь всатвляете инпут:
    <form id="my-form" enctype="multipart/form-data">
        <input type='file' id='file_id'>
    </form>


    Пишите js код:
    $.ajax({
        url: "ajax/save-photo.php",
        method: 'POST',
        data: new FormData($('#my-form')[0]), // Вот таким образом создаем экземпляр FormData
        processData: false,
        contentType: false,
        dataType: 'json',
        success: function() {
            alert('success');
        },
          error: function(){
            alert('error');
         }
    });


    Готово.
    Ответ написан
    Комментировать
  • Каким образом могут навредить сайту?

    @D3lphi
    Все что захотят эти самые злоумышленники. Прочитайте эту статью и все сразу поймете.
    Злоумышленник передаст в запрос параметр REG с нужной ему строкой (PHP кодом). А уж что он там напишет зависит только от его фантазии и намерений.
    Ответ написан
    Комментировать
  • Как из массива достать нужную инфу?

    @D3lphi
    У вас в $country хранится массив. Array получается при преобразовании массива в строку. Дабы занести все данные, вы можете либо в цикле прогнать элементы массива и произвести с ними нужные действия, либо воспользоваться встроенными функциями, например implode(), (Если только внутри массива у вас нет вложенного массива), либо же преобразовать в json формат функцией json_encode($countru), что скорее всего, является самым подходящим и универсальным вариантом.

    $ip = $_SERVER["REMOTE_ADDR"];
    $country = json_encode($SxGeo->getCityFull($ip));
    $intoip = mysqli_query($connection, "INSERT INTO views(ip, country)  VALUES('$ip', '$country')");


    Потом, при выборке, данные нужно будет преобразовать в массив функцией json_decode().
    Ответ написан
    Комментировать
  • Что не так с регулярным выражением?

    @D3lphi
    Добавьте флаг u к регулярному выражению, чтобы получилось так:
    if(!preg_match("/^([А-Я]{1}[а-яё]{1,23}|[A-Z]{1}[a-z]{1,23})$/u", $_POST['firstname']))


    Это включит поддержку юникода.
    Ответ написан
    1 комментарий
  • Php - то отправляет почту, то нет. Почему так?

    @D3lphi
    Потому что к сообщениям отправленные функцией mail() очень подозрительно относятся почтовые сервисы. Ведь, у таких сообщений по сути, нет надежного адресата. Вы можете написать в адрес отправителя все, что захотите. Поэтому почтовые сервисы часто не пускают такие сообщения. Для отправки почты лучше использовать smtp протокол. С этим протоколом умеет работать библиотека PHPMailer.
    Ответ написан
    Комментировать
  • HMVC, так что все таки использовать?

    @D3lphi
    я не могу содержать кучу контроллеров в одной папке, кучу моделей в другой,

    А кто вам это запрещает делать, стесняюсь спросить? Вы можете хранить это все где душа пожелает, а уж в ларавеле то тем более.

    Я тупо визуально охреневаю от этого в процессе работы, мне постоянно приходится что-то искать, "черт побери, а где этот самый контроллер, а где его вьюха", постоянный скролл по листу проекта, напряжение зрения в процессе поиска, меня это дико бесит, я как будто в мусорном баке ковыряюсь в поисках того, что мне нужно.

    PHPSTORM:
    ctrl+shift+N > Вводим название файла > Enter
    ctrl+N > Вводим название класса > Enter
    ???
    PROFIT!!!

    Насчет ларавела слышал, что там вся система каким то магическим образом работает, и часть разрабов тупо не понимает, что это за шайтанство.

    Брешут. Если и есть тот, кто не понимает, как работает фреймворк, то в этом виноват не фреймворк, а тот, кто, скорее всего, даже не пытался вникать в устройство оного. Там все достаточно прозрачно.

    И сижу я сейчас и думаю, хочется учиться, хочется взять какой-то сносный продукт и начать его изучать.
    Но, в какую сторону то смотреть?

    Посмотрите в сторону Symfony. Лучший PHP фреймворк в плане архитектуры. Но на Yii или Laravel приложение разрабатываются быстрее.

    У вас какая-то внутриутробная неприязнь к MVC. Очень странные доводы приводите против него, мол, неудобная структура папок. Первый раз слышу такое.
    Ответ написан
    4 комментария
  • Какую взять ORM для своего проекта?

    @D3lphi
    Возьмем ORM из двух популярных PHP-фреймворков. Первая будет Eloquent ("Родная" для фреймворка Laravel), а вторая - Doctrine (Одна из доступных ORM в фреймворке Symfony). Кардинальным отличием этих двух "систем" является то, что первая разработана на основе паттерна Active Record, а вторая - с использованием паттерна Data mapper. Чем же они отличаются? Приведу абстрактные примеры кода для первого и второго паттерна:

    Active Record:
    $user = new User(); // Создаем "сущность" нового пользователя.
    $user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
    $user->password = '123456'; // Устанавливаем пароль этому пользователю.
    $user->save(); // Сохраняем пользователя.


    Все, новый пользователь создан и находится в базе данных. Теперь, Data mapper:
    $user = new User();
    $user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
    $user->password = '123456'; // Устанавливаем пароль этому пользователю.
    
    $manager = ... // получаем объект менеджера (Например, из DI контейнера).
    $manager->persist($user); // "Скармливаем" новоиспеченного пользователя нашему менеджеру.
    // $manager->persis($user1); // Мы можем создать еще одного пользователя и уведомить менеджер об этом.
    // $manager->persis($user2); // И еще одного...
    $manager->flush(); // После выполнения этого метода данные отправятся в базу данных.


    Очевидно, первый способ куда проще. Но не все так просто. Дело в том, что паттерн Active Record нарушает принцип единственной ответственности (Single responsibility SOLID). И поэтому, в какой-то степени, может считаться антипаттерном. (Но это ни в коем случае не значит, что его не нужно использовать, для большинства проектов "хватит" за глаза). Наша сущность пользователя делает слишком много. Она не только представляет данные, но и еще работает с ними. В больших проектах это может усложнить поддержку кода. Data mapper, напротив же, разделяет представление данных в сущность (user) и работу с данными (manager, в данном примере. Также, за работу с данными отвечает репозиторий. Вы столкнетесь с ним, как только вам потребуется получить данные из БД (Doctrine)). В небольших проектах вы не заметите особой разницы. Разве что во втором случае увеличится количество классов. Так, в Eloquent вы создаете 1 модель, а в Doctrine - сущность и репозиторий.

    Все современные ORM включают в себя также, так называемые, query builder'ы. Они помогают отказаться от языка запросов, такого как SQL. Вы будете составлять запросы таким образом:
    $result = $qb
          ->select(['id', 'login'])
          ->where('id', '<>', 3)
          ->get();


    Собственно, query builder'ы помогают абстрагироваться от конкретной СУБД. То бишь, вы написали запрос 1 раз, а затем от того, какую СУБД вы используете будет зависеть выходной sql код. Генерация этого кода будет произведена абсолютно прозрачно для вас.

    Обе ORM имеют работать с отношениями. Вам нужно будет указать, как таблицы относятся друг к другу, а затем вы сможете удобно обращаться к связанным сущностям.

    Теперь конкретно. Так как вы только начинаете осваивать ORM, я бы порекомендовал начать с Eloquent. Она гораздо проще, чем Doctrine, да и более производительная, к тому же. Как освоите Eloquent, смело учитесь работать с Doctrine. Она обязательно должна быть "в копилке" ваших скиллов, так как является самой мощной в "мире" PHP.

    Успехов!
    Ответ написан
    2 комментария
  • Каким должен быть правильный контроллер?

    @D3lphi
    Контроллер должен быть тонким. Именно это и есть "правильно". Сами по себе контроллеры берут на себя, например, валидацию входных данных, построение http ответа и тд. Все логика должна выносится в сервисы. Чтобы вы понимали, сервис - это просто класс, зачастую, без хранения состояния и с единственным методом, который содержит бизнес логику. Из контроллера будет вызываться метод этого сервиса, тот будет возвращать результат. Контроллер будет преобразовывать этот результат в нужный формат, дабы отдать его пользователь в нужном виде. Сервисы можно не использовать в небольших приложениях. Согласитесь, может быть излишним создавать класс ради того, чтобы, грубо говоря, сложить 2 и 2. В документации Laravel почти все пишется в контроллерах по причине упрощения код. Дабы было проще понять саму суть.
    Ответ написан
  • Вывод даты PHP с добавлением дней?

    @D3lphi
    В одном дне 86400 секунд. Получаем текущую unix метку времени и прибавляем к ней 86400 секунд, далее скармливаем это все функции date().
    echo 'Только ' . date('d') . ' и ' . date('d', time() + 86400) . ' скидка 90%';
    Ответ написан
    Комментировать
  • Вызов первого символа в цикле foreach?

    @D3lphi
    Да. Если такая конструкция $str[<индекс>] используется на переменную, содержащую строку, то будет получен определенный символ этой строки. Так как нумерация начинается с нуля, то $str[0] - первый символ строки.
    Ответ написан
  • Как записать путь для incude?

    @D3lphi
    Во-первых, лучше будет создать файл в директории config и уже доставать настройки с помощью функции config().
    Например, вы создали файл config/test.php с содержимым:
    return [
         'option' => 'value',
         'second_option' => 'value'
    ];

    И вам нужно получить значение option. Тогда вы используете вызов:
    config('test.option'); // test - это название файла. option - имя ключа в массиве. Разделитель - точка.


    А вообще, если вам так нужно подключить файл в этой директории(Например, у вас там функции определены какие-либо), следует использовать composer. открываем compose.json. Ищем секцию autoload и прописываем следующее:
    "autoload": {
         "files": ["app/confs/dnsconf.php"],
    
         // ...
    }

    Далее, необходимо, чтобы композер "узнал" об этих изменениях. Выполняем команду:
    composer dump-autoload
    Ответ написан
    Комментировать
  • Что такое php процесс?

    @D3lphi
    Из википедии:
    Проце́сс — программа, которая выполняется в текущий момент.


    Ну вот смотрите: Пользователь перешел на ваш сайт (site.ru/test.php). Веб-сервер обработал запрос, понял то, что файл имеет расширение .php, а значит, его необходимо обработать при помощи PHP, Обратился к пакетному менеджеру fast-cgi и запустил новый PHP процесс. Тот в свою очередь начал выполнять код, написанный в файле test.php. Он отработал и отдал данные для вывода информации веб-серверу. На этом, php процесс "умер". Веб-сервер отдал информацию в браузер пользователя.
    Ответ написан
    3 комментария
  • Скрипт "установки" php движка. Как реализовать?

    @D3lphi
    Реализуемо ли такое вообще?

    Нет, не реализуемо. Это засекреченные разработки советских ученных.

    А если серьезно, то что вы хотите услышать? Как это писать?
    При входе человека на сайт, нужно проверять, установлено ли приложение (Есть множество вариантов, как это можно сделать: проверять наличие какого-либо файла(ов), проверять наличие какой-либо информации в нем (них) и тд). И, в зависимости от результата этой проверки, либо пускать его на сайт, либо выводить "окно установки". Во время установки собираем необходимую информацию. Производим создание необходим таблиц БД (Для подключения к ней, используем то, что указал юзер). Создаем пользователя администратора. В конце, генерируем файлы конфигурации. В них, как минимум, нужно занести информацию для соединения с базой данных. Остальные настройки можно хранить как в таких же файлах конфигурации, так и в базе данных, например.

    Ну вот, собственно, и все.
    Ответ написан
    1 комментарий