Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Как посчитать кол-во строк в бд MySQL PHP подготовленным запросом PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Здесь два вопроса в одном.

    1. Как посчитать кол-во строк в бд MySQL PHP подготовленным запросом PDO?

    Очень просто. Надо узнать, как в SQL считают строки, а потом выполнить подготовленный запрос. В SQL строки считают запросом count(*). А в РНР строки считают только обезьяны.

    Далее просто подготовить этот запрос и выполнить его

    $sql = "SELECT count(*) FROM `clients` WHERE `email` = ?";
    $pattern = [$data['email']];
    $sth = $connection->prepare($sql);
    $sth->execute($pattern);
    $result = $sth->fetchColumn();


    Просто как три копейки

    Вопрос номер два: Пачиму ничиво нинаходит?

    Ответ тоже простой - потому что в базе данных не находится совпадения с входящими данными.

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

    Потому что если ты воображаешь, будто "GET-параметр принимается правильно, пользователи с нужным E-mail есть", а база данных говорит обратное, то база данных права в 100% случаев. Её писали совсем не дураки.

    И если ничего не находит, то надо проверять. Что у тебя в базе, и что у тебя в во входящих параметрах. Там могут быть непечатные символы, ты можешь обраoаться к какой-то другой базе, у тебя может быть опечатка во входящих данных. Всё надо проверить. И ошибка обязательно найдётся.

    Кроме прочего, в поисках проблем помогает правильный код соединения с ПДО, который попросит базу данных сообщать обо всех ошибках.
    Ответ написан
    Комментировать
  • Как передать данные из базы в константу?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не надо этого делать.
    Константы используются не для данных из базы.
    Записывай в переменную, а не в константу.
    Обычным способом, обращаясь к БД через элоквент
    Ответ написан
    6 комментариев
  • Как лучше всего хранить и получать аватар пользователя?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Логин - это самая дебильная вещь, какую похапе программисты смогли изобрести за все время своего существования. Хотя они в этом деле эксперты.

    Мучений потом не оберёшься. Пользователи пишут вместо логина емейл, потому путаются где у них что, потом регистрируют ещё один аккаунт в котором указывают уже зарегистрированный емейл в качестве логина, а потом рыдают в службу поддержки что сайт их не пускает
    Логин вообще надо выкинуть из базы данных, он никому не нужен. Есть емейл, под которым пользователь регистрируется - вот его и использовать для логина.

    В данном же случае логин еще и не подходит для имени файла. Проблем с валидацией не оберешься.
    При том, что есть гораздо более простое и надежное значение - автоикерементный id. То есть аватарки тупо сохраняются с именем совпадающим с шд пользователя. Даже расширение можно не делать. Ну или можно какое-то одно, png например. Браузеры все равно разберутся что показывать.

    То есть для аватарок отдельная колонка точно не нужна. В нее просто нечего писать
    Ответ написан
  • Как использовать PDO в других классах?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос хороший и правильный. Всё остальное - не очень.
    К сожалению, то что у тебя сейчас - это тоже говнокод и неправильно.

    Тут надо понимать одну очень простую, но очень неприятную вещь: ООП, в отличие от ПХП - это сложная тема. Явочным порядком, там подглядев, тут скопипастив - ООП изучить нельзя.
    Максимум что у тебя получится - это та же процедурщина, вид сбоку. Неподдерживаемый говнокод, просто по-обезьяньи обернутый в классы.

    Но учиться все равно надо.
    Главное что надо понимать про ООП - оно не про сами классы, а про их взаимодействие.
    именно поэтому то самое жлобал и является говнокодом. Потому что никакого взаимодействия нет ,и класса тоже нет - есть функция, которую если вынуть из класса, то НИЧЕГО не изменится.

    Но и то что у тебя сейчас - это не ООП.
    Каждый раз создавать новое подключение можно и без всякого ООП. Вот только оно убьёт тебе сервер БД.
    Чтобы было ООП, надо передать уже созданный инстанс класса для работы с БД как параметр конструктора.

    Кроме того, класс qpdo - это какой-то анекдот, бессмыслица. Обезьяна увидела как человек носит очки, напялила на нос ложку и ходит с гордым видом. Внешне вроде то же самое, но смысла никакого.
    Ты можешь объяснить, ЗАЧЕМ тебе класс qpdo? Чтобы настройки прописать? А ты подумал что настройки бывают РАЗНЫЕ? Что дома у тебя логин рут и пароль пустота, а на хостинге это не прокатит. И что - будешь код переписывать, каждый раз заливая из дома на сервер? Серьёзно?
    Настройки должны всегда лежать отдельно. А больше ни для чего твой класс не нужен.

    Поэтому,

    1. qpdo выкинуть на помойку, по крайней мере до тех пор, пока не поймешь, для чего тебе свой класс, и как с ним обращаться.
    2. Создать один раз инстанс класса для работы с БД (в простейшем случае - PDO) и передавать в другие классы через констркутор
    3. в конструкторе присваивать его переменной класса, которую использовать для доступа к БД.

    В итоге возвращаемся к исходному вопросу, как передать соединение в другой класс:
    class somethingClass {
      function __construct($db) {
        $this->db = $db;
      }
    
      function somethingFunction(string $key) {
        $query = $this->db->prepare("SELECT `key` FROM `table` WHERE `key` = :key");
        $query->execute(array(':key' => $key));
        return $query->fetchColumn();
      }
    }


    Бонус
    echo 'Ошибка подключения к БД MySQL: ' . $error->getMessage() . ''; die;
    - это ад и говнокод.
    Да, в прошлом веке так писали. С тех про прошло уже 20 чертовых лет. 20, Карл! Тебя небось еще в проекте не было.
    Сайт, который вываливает вот это всё на всеобщее обозрение - это позор.
    Все ошибки сайт должен всегда держать при себе. И никому не показывать. И поэтому никогда не надо лезть руками в ту ошибку, которую выбрасывает РНР. Надо дать ей спокойно пойти туда, куда идут все остальные ошибки.
    Ответ написан
    Комментировать
  • Достаточно ли безопасен этот скрипт загрузки изображений на сервер?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    черный список всегда небезопасен.
    проверять надо только по белому

    Плюс желательно переменовывать файл целиком, потому что к примеру веб-сервер апач может принять за расширение файла то, что им не является.
    Ответ написан
  • Правильно ли я понял централизованную обработку исключений в PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В целом правильно, неплохая проработка материала.
    У меня есть только пара замечаний, не относящихся напрямую к централизованному обработчику.

    • error_reporting(E_ALL & ~E_NOTICE); делать не стоит. Если только не приходится работать с адовым легаси, которое сыпет нотисами, лучше отлавливать все ошибки. Учитывая же что в 8-ке обращение к несуществующей переменной станет не нотисом а предупреждением, такая конструкция со временем станет бессмысленной. что означает - ошибки надо исправлять, а не замалчивать.
    • ini_set("error_log", __DIR__ . "/php-errors.log"); будет не очень хорошей идеей, если файл error-handler.php выше корня веб-сервера. Ошибки надо прятать подальше.
    • ini_set('display_startup_errors', 1); - это какая-то дичь, которая кочует из руководства в руководство. Никто никогда этих стартап еррорс не видел, но многие старательно пишут это заклинание у себя в коде. Это по-любому связано с настройкой сервера, и в отладке ошибок поможет примерно ничем.
    • само по себе задание настроек через ini-set ненадежно. Ошибка может случиться до того, как РНР прочитает эту команду. Задавать надо в конфигурации веб-сервера.
    • в теории можно добавить флаг или автоматическую проверку на джейсон запрос. и соответственно кодировать ответ в джейсон. Но это только для криовруких фронтендеров, которые не умеют читать НТТР статусы, а ждут что им все разжуют в джейсоне, и без error: true они не поймут, что была ошибка
    • стек вызовов может быть довольно длинным, и раздувать логи. Можно подумать о более укороченном варианте.


    Вообще всё зависит от задач. Например все современные фреймворки в режиме разработки выдают развесистую страницу с отчетом об ошибке, которая включает в себя и кусок кода вокруг строи, на которой произошла ошибка.
    Но как именно базовый обработчик, необходимый минимум - вполне годно.

    Я только не понял, почему вопрос про error_handler. Что именно смущает?
    Ответ написан
    5 комментариев
  • Как вывести информацию сразу с из двух таблиц, в которых пересекаются только ID клиента?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для того чтобы получить данные из трех разных таблиц в базе данных, надо выполнить три разных запроса.
    Ваш Капитан Очевидность.
    Ответ написан
  • Как вставить верстку посредством генерации в пхп?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Правильный ответ
    <?= '<option value="Berlin">Берлин</option>' ?>
    Ответ написан
    Комментировать
  • Марка, модель, категория, как лучше реализовать связку данных из 3таблиц?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я вообще ничего не понял из этого вопроса.
    Но категорию надо сразу привязывать к модели, в момент заведения, а не когда-то потом.
    Ответ написан
    4 комментария
  • Знать ООП или нет?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Смотря что понимать под этим словом.
    Программисту - надо
    Говнокодерам, вайтишникам, одинэсникам, вордпрессникам, эникейщикам и прочим тыжпрограммистам - не нужно.
    Ответ написан
    Комментировать
  • Почему на хостинге не видит класс?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    The file name MUST match the case of the terminating class name.
    Ответ написан
    Комментировать
  • Как вывести json файл?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    У тебя перевод строки добавляется только один раз, в самом конце.
    Но главная проблема в том, что у тебя двумерный массив, а ты пытаешься с ним работать как с одномерным.
    Если у тебя есть "элементы строки", это значит что строка - это массив.
    То есть ты пытаешься выводить строки, разделяя их пробелом.
    Как выводить элементы массива ты уже знаешь. То есть надо добавить этот код внутри уже существующего.

    Только ради бога, забудь ты про перебор массивов оператором for. Уже почти 20 чертовых лет в РНР есть нормальный оператор foreach, но какие-то недоумки все еще преподают студентам искомаемую версию языка.
    Ответ написан
    Комментировать
  • Как сделать правильный вывод фото/изображения?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для каждой переделывать размеры при загрузке. Для мутроной работы у тебя компьютер есть.
    Ответ написан
    Комментировать
  • Как вывести определенную колонку csv?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сначала прочитать первую колонку.
    сделать полученному массиву array_flip()
    дальше при чтении остальных строк использовать этот массив для получения нужных колонок по их имени, например $data[$header['product']]

    если же выводить не по имени, а по номеру, то всё ещё проще - посчитать колонки и подставить нужный индекс вручную
    Ответ написан
  • Не понимаю, где ошибка?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ошибка тут везде, только в первой строчке её нет, во всех остальных есть, включая последнюю
    <?php
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $connection = mysqli_connect('localhost', 'root', 'root', 'bdwheelz');
    $connection->set_charset('utf8mb4');

    вот так будет правильно
    Ответ написан
    Комментировать
  • Как изменить чужую картинку с HTTP на HTTPS?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Чужую - никак.

    Как вариант можно рассмотреть возможность не паразитировать на чужом контенте, а сделать что-то своё
    Ответ написан
  • При бекапе файл .htaccess не попадает в него, что можно сделать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вместо звёздочки надо поставить точку.
    Ответ написан
  • Все подключенные файлы будут запускаться при запуске одного PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    страница долго грузиться, я подумал если это подключил ко всем файлам то все связаны и все запускаются в тот момент когда запускаю одну. Так ли это,

    Нет, не так.
    Сайт грузится долго из-за того что какой-то код написан через одно место.
    Тебе надо найти это место, и переписать нормально.
    А все эти инклюды перенклюды не при чем.
    Ответ написан
    Комментировать
  • Как получить полный адрес поста и добавить его в базу?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нет, нельзя получить idшник поста, еще до того, ка пост был создан.

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

    Непонятно только, почему в коде отсутствует сохранение ид юзера.
    Ответ написан
    2 комментария
  • Как использовать RedBeanPHP внутри namespace в php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надо обновить версию этой фасоли.
    Автор там что-то колупал в своем древнем коде, чтобы сделать поддержку неймспейсов. Не знаю насколько удачно.
    Ответ написан
    Комментировать