• Как вывести строку по id php ?id=1?

    FanatPHP
    @FanatPHP
    Помогаю и новичкам, и старичкам
    Вопрос хороший, но здесь мы упираемся в главную беду пхп - ВСЕ учебники в интернете, и особенно видео - показывают как писать адов говнокод из прошлого века.

    1. Получение значения из адресной строки

    Чтобы получить значение переменной, которую передали в строке запроса (это то что после знака вопроса), надо обратиться к переменной $_GET

    То есть в данном случае можно написать $id = $_GET['id']. Имя получаемой переменной ($id) может быть любым и не обязательно совпадать с переданным значением. А вот в индекс массива $_GET разумеется надо писать именно то имя, которое в адресной строке. То есть если site.com/?id=1 то в $_GET['id'] будет значение 1.

    2. Валидация данных

    Далее очень желательно проверить, что мы в переменной получили то что хотели, а так же что мы вообще хоть что-то получили.

    Сначала надо проверить наличие в массиве $_GET нужного ключа. В данном случае это можно сделать с помощью оператора isset() (хотя вообще она для проверки наличия ключей в массивах не рекомендуется)
    Если для показа информации используем отдельную, специальную страницу, которая только занимается показом данных по айди, то после проверки на существование надо выдать ошибку.

    Затем, поскольку id может быть только целым числом больше нуля, то лучше проверить и это тоже и тоже выдать ошибку.

    3. Соединение с БД.

    в "config.php" должно быть написано не то что там сейчас а вот это (со своими параметрами подключения разумеется)
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");


    4. SQL

    Запрос, который нам нужен, выглядит так:
    SELECT * FROM `product` WHERE id=1

    5. Выполнение запроса в РНР

    Но разумеется вместо 1 надо подставить значение переменной.
    Это самое сложное. Но надо один раз выучить и потом везде применять

    Важно, чтобы данные в БД всегда попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    1. Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    2. Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    3. Привязать переменные к запросу.
    4. Выполнить подготовленный ранее запрос с помощью с помощью execute()
    5. Получить результат запроса через get_result()
    6. и дальше конкретную строку из БД с помощью уже знакомой fetch_assoc


    В коде это будет так
    $sql = "SELECT * FROM `product` WHERE id=?";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("s", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();


    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

    6. Вывод данных.

    Важно понимать, что в момент вывода данных никакой работы с БД уже быть не должно!
    Должны быть только переменные РНР с уже полученными данными.
    Ответ написан
    1 комментарий
  • Как создать файл с xmlwriter?

    @kudis
    Bitrix developer
    Вывод нужно снабдить заголовками:
    последнюю строку с echo убираем, далее так:
    $sXmlData =  xmlwriter_output_memory($xw);
    $sFilename = 'Test';
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . $sFilename . '.xml"');
    header('Content-Length: ' . mb_strlen($sXmlData, '8bit'));
    echo $sXmlData;

    теперь по адресу вашего php скрипта будет отдаваться контент Вашего xml, как файл для скачивания
    подменить .php на .xml можно через apache или nginx
    Вот тут описан пример для обеих платформ: https://habr.com/ru/post/181898/
    Ответ написан
    Комментировать
  • Способен ли Opencart тянуть серьезные интернет магазины с 1C? Существуют ли примеры таких магазинов?

    @akorvat
    >>> Возникнут трудности у тех, кто привык работать с 1С, кому неоходим импорт/экспорт товаров xml и сотрудничество с яндекс маркетом
    Да трудности колоссальные :) Модуль Яндекс Маркета идет в комплекте сразу в русской сборке :) Там же сразу карта сайта XML. Бери и юзай. Хочешь серьезней, с настройками, стоит аж 500-700 рублей - для всех версий есть расширения :) Ставится без замены файлов, под любую кастомизацию.

    Что значит работать с 1С? Это у 1С сложности сделать XML, например. Даже для собственного Битрикса. Там нужно сервер делать. Короче настройки разные. Посмотрите в сети, расширение импорт / экспорт для 1С - 10-20 тысяч стоит. А зачем оно нужно, если там, типа, авто синхронизация? Поясню. Потому что встроенного импорта быть не может. Т.к. у всех в 1С своя архитектура ведения товаров. Особенно, если речь про большие компании. И еще нужно всё настроить - денег заплати куча.
    Для опенкарта есть бесплатные импорты / экспорты. Есть платные - 500-1500 тысяч рублей тот же 1С excange :)
    И все дела.

    В Опенкарте есть всё, что нужно - все модули, все доставки, все формы оплаты, поиски, фильтрация, нотификация, 1 клик, оформление в одну страницу, и прочее, и многое-многое другое. Чего нет, скорее всего уже кто-то дописал. Стоит, как правило, 500-1500 рублей, в среднем. Ставится за 5 минут.

    Раньше были virtuamart, joomshoping и т.п. Но это компоненты под CMS, которые в принципе не для магазинов. С самого начала они такие - пойдут для первого раза.
    Сейчас из Open Source лучший это Опенкарт. По рейтингам магазинных CMS. А коммерческие. Ну там или пусто вообще (написано "мы скоро всё сделаем"). Или дорого и код такой, что развитие будет стоит 10000 рублей за мелочь. Ну потому что программисту лень погружаться в самописные или мегасамописные решения за 500 рублей.
    Про безопасность я вообще молчу. Откуда эта информация, что там плохо с ней? Это воообще не так.
    А на счет высокой нагрузки. Для высокой нагрузки нужен хостинг. Вообще для всех CMS. Просто получается, что ставят Опенкарт и когда врубаются, какая это классная штука. Пихают туда десятки тысяч товаров на хостинг за 100 рублей. Конечно он 10000 будет показывать. Там есть механизмы ускорения. Но вообще говоря, для нагрузки 5000-10000 хостинг уже нужен минимум простенький виртуальный сервер. И это не требование Опенкарт. Этого требует нагрузка 5000 и более тысяч товаров.

    Что касается архитектуры. Отличный пример MODX там вообще нет паттернов :) По этому никто ничего толком написать под каждый конкретный случай не может. Сначала, как говорится, "нужно посмотреть". В Опенкарт, строгая типизация не делает его хуже. А дает возможность быстро и недорого его развивать. Любому программисту. Если он не вчера PHP выучил. А без паттернов профессионалы не пишут. Потому, что они профессионалы. И паттерны, MVC и другие были придуманы не для того, чтобы их ругали те, кто не знает зачем нужны паттерны. Просто нужно не ругать паттерны, а изучить зачем они нужны. А еще лучше написать свое решение сначала без паттерна. А через пол года попытаться его развить :) И осознать, что "всё забыл, где тут чо"
    Ответ написан
    Комментировать