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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    > Есть какой-то еще способ заставить PHP просто вывести дробное число без изменения его внешнего вида?

    Нет

    Разумеется, никакого способа нет. Потому что никакого "внешнего вида" у дробных чисел не существует в природе. У них есть только внутренний вид, но вам на него смотреть не захочется. А для вывода в десятичном формате его всегда надо преобразовать и отформатировать.

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

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

    Отвечаем на оба вопроса

    Могут ли украсть сессию php?
    при нормальных настройках сайта (httponly cookies, SSL) - практически нереально. Только трояном с компа. Но если есть доступ к компу, то с сессиями уже заморачиваться как-то мелко.
    Хотя я не очень уверен насчет расширений браузера/тулбаров. Думаю, что они доступ к кукам имеют свободный.

    Может ли другой человек узнав ID сессии и приписав его в свой php скрипт получить доступ к данным сессии моего сайта?
    Разумеется, может.

    Только не описанным способом, конечно. Идентификация происходит через cookies. Соответственно, узнав ID, надо просто отправить нужный session_id со своего сервера или браузера.
    Ответ написан
    1 комментарий
  • Как узнать сколько было извлечено записей из базы данных.?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это абсолютно бессмысленная операция, которая никогда не бывает нужна.

    Если вдруг показалось, что нужно получить количество строк, которые вернул запрос, то значит проблемы с логикой. Это как раз тот случай, который мы наблюдаем сейчас. Откуда тут взялись 2 запроса к базе данных? Они существуют только в вашем воображении. В вашем коде используется только один запрос. И никакое количество строк тут не нужно, ваш код прекрасно работает без него. Разве что убрать из него SQL инъекцию и бессмысленные телодвижения

    $stmt = $_connect_->prepare("SELECT * FROM users WHERE login=?");
    $stmt->execute([$_SESSION['login']]);
    $user = $stmt->fetch();
    
    if($user){
        echo 'есть записи';
        echo 'Имя пользователя'.$user['login'];
    }else
        echo 'нет записей';
    }
    Ответ написан
    Комментировать
  • Как выполнить инициализацию переменных перед загрузкой сайта?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Открою маленький секрет.
    Все 100% современных приложений работают именно таким образом - сначала они инициализируют начальные константы, а потом запускают приложение.

    Для этого надо всего лишь, чтобы файлы проекта не валялись как попало, а были организованы в разумную структуру. В частности, имели единую точку входа. А точнее - две, для веб-приложения и для утилит командной строки. Как это организовать на примитивном уровне, можно посмотреть здесь. Но лучше поставить уже себе фреймворк и научиться использовать РНР не как в каменном веке, а так, как его используют современные программисты в двадцать первом.
    Ответ написан
    Комментировать
  • Непонятки в массиве php, что я делаю не так?

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

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

    Да, всё верно, Симфони приучает к правильной структуре кода. Так что самым лучшим вариантом будет устроиться на работу в компанию, где используется Симфони - и учиться на практике.

    Если же решать проблему с нуля - то есть из теории - то чтением книжек отцов-основателей - Мартина, Фаулера - вот это вот всё. Новичкам редко подходит, так что я бы рекомендовал совмещать теорию с практикой.
    Ответ написан
    4 комментария
  • Как загрузить картинку в папку на php и записать путь в базу mysql?

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

    1. проверять $_FILES['uploadfile']['error']
    2. Проверять расширение файла на соответствие разрешенным по списку
    3. Переименовывать файл, поскольку оригинальные имена - это адище и беспорядок плюс небезопасно.
    Ответ написан
    7 комментариев
  • Что означает $this-> -> в PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Закопать Fuel обратно в его могилу и больше не беспокоить прах этого умершего в далекой древности старца.
    2. Вместо него учить Laravel
    3. Открыть для себя документацию РНР и в непонятных случаях обращаться к ней. В это трудно, конечно, поверить, но там всё написаною Эта ссылка находится в двух кликах по запросу "РНР ООП"

    Честно говоря, я и сам себя часто ловлю на такой "лености мозга". Когда ты 100% можешь сам найти ответ, но спросить у знающего человека проще. но тут важно не поддаваться, и сначала пытаться самостоятельно. Для этого в любом вопросе должна быть фраза - "я искал такм-то", но не нашёл. В процессе написания этой фразы ответ сам и сыщется. В итоге в будет сэкономлено время, приобретён опыт и в интернете будет будет меньше мусора.
    Ответ написан
    4 комментария
  • Как экранировать строку в REGEXP (mysql) средствами PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я думаю, что preg_quote() должна подойти.
    Ответ написан
    1 комментарий
  • Как исправить ошибку Invalid parameter number?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как можно решить эту проблему?


    Такие проблемы решаются довольно просто. Нужно прочитать сообщение об ошибке. Если совсем не понимаешь по-английски - есть онлайн переводчики. Если все равно непонятно - берем сообщение об ошибке и ищем гуглем и смотрим по найденным ссылкам.
    Ответ написан
  • Почему приоритет операторов не соответствует оф. таблице?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Не знаю. Скорее всего, все так, как написал xtress. То, как операторы выполняются, и в каком порядке из результаты используются - это разные вещи.
    2. На самом деле написано, что "Рекомендуется избегать "нагромождения" тернарных выражений. Поведение PHP неочевидно при использовании нескольких тернарных операторов в одном выражении"
    3. Таблица не при чем, поскольку "эта оптимизация" не относится к приоритетам. https://phpdelusions.net/articles/or_die
    Ответ написан
    Комментировать
  • Какие курсы по php выбрать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Единственные качественные курсы, которые готовят современного разработчика, а не ремесленника для 1990-х - это https://otus.ru/lessons/razrabotchik-php/
    Но как я вижу, прием там закрыт :(
    Ответ написан
    Комментировать
  • Как сверить пароли с базой?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Правильный ответ
    // Достанем юзера по мылу
    $sql = 'SELECT * FROM `user` WHERE `email` = ?';
    $result = $db->prepare($sql);
    $result->execute([$email]);
    $user = $result->fetch();
    
    // потом сверим его хеш пароля с паролем из формы
    if ($user && password_verify($_POST['password'], $user['password'])) {
     echo "it's ok";
    }

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

    По поводу остальных вопросов. Есть такая штука, поисковая машина. Она помогает находить ответы на вопросы самостоятельно. Самыми популярными являются google.com и yandex.ru. И это реально работает. Просто попробуй:
    Что дают обратные апострофы в именах таблиц и полей?
    password_hash и PDO
    Ответ написан
    1 комментарий
  • Почему возникает ошибка 'SQLSTATE[HY000] [2002] No such file or directory'?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Поменять localhost в конфиге на 127.0.0.1

    А лучше поменять "новый хостинг" на нормальный, с пряморукими админами.
    Ответ написан
    Комментировать
  • Как переделать запрос под Prepared Statement?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    сначала пишем волшебную функцию
    function pdo($db, $sql, $params = null) {
            if (!$params)
            {
                 return $db->query($sql);
            }
            $stmt = $db->prepare($sql);
            $stmt->execute($params);
            return $stmt;
    }


    И после этого пишем почти такой же код, как и был
    $md5_hash = md5_file($_FILES["fail"]["tmp_name"], true);
    $res_double = pdo($db, 'SELECT * FROM `download__files` WHERE `md5hash`=?', [$md5_hash])->fetch();
    Ответ написан
    Комментировать
  • Стоит ли писать оболочку для PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нет, не стоит.

    С такой мотивацией ("а не написать ли мне враппер?...") писать вообще ничего не нужно. Потому что ничего хорошего не выйдет.

    Я даже могу точно предсказать, что выйдет: монстр, который многотрудно и многословно дублирует 10% функционала PDO, не добавляя при этом никаких улучшений, и при этом делает невозможным использование остальных 90%.

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

    Поэтому место написания враппера санчала надо научиться использовать оригинальный ПДО, разобраться с тем, как его правильно использовать, изучить его сильные и слабые стороны, понять, чего вам в нем не хватает, и только потом садиться писать враппер, который добавляет недостающую функциональность, но не урезает при этом существуюущую.
    Ответ написан
    Комментировать
  • Затыки с PDOStatement::execute и MySQL - куда копать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все верно объснили, но никто не написал, как сделать правильно.
    Единственным правильным вариантом использования такой функции будет что-то вроде
    function getСolumn( $db, $sql, $params = null) {
        $stmnt = $db->prepare( $sql );
        $stmnt->execute($params);
        return $stmnt->fetchAll( PDO::FETCH_COLUMN);
    }
    print_r( getColumn( $db, 'SELECT category_name FROM categories') );

    Или, в еще более генерализованном варианте,
    function query( $db, $sql, $params = null) {
        $stmt = $db->prepare( $sql );
        $stmt->execute($params);
        return $stmt;
    }
    print_r( query( $db, 'SELECT category_name FROM categories')->fetchAll( PDO::FETCH_COLUMN) );


    Я настоятельно не рекомендую заниматься экономией на спичках и пытаться скостить себе написание двух SQL операторов. Мало того, что надпись вида getNames( $db, 'categories', 'category_name' ) сторонний человек не поймет без того чтобы заглянуть в описание функции, мало того, что такое написание вызывает ложное чувство безопасности. Но, главное, запрос без параметров очень редко когда бывает нужен, и такая функция большую часть времени просто не будет использоваться.

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

    Код подключения также надо поменять, поскольку возвращать строку из функуции, которая должна возвращать объект - это какая-то бессмыслица, чтобы не сказать еще хуже.
    Вот допустим у нас подключение не удалось. Мы пытаемся использоватьс строку с ошибкой в качество объекта ПДО и... что?

    Не нужно вообще ловить исключения PDO. Они прекрасно могут сообщить о себе сами.
    function dbConnect($dsn, $user, $password) {
        return new PDO( $dsn, $user, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] );
    }
    Ответ написан
    1 комментарий
  • Почему apache2 не отображает ошибки?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что apache2 к ошибкам пхп не имеет вообще никакого отношения.
    А все установленные в php.ini значения могут быть переписаны в коде.

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

    А для домашнего компьютера, который никто кроме вас не видит, надо посмотреть, как настраивать ваше программное обеспечение для режима разработки. Наверняка есть опция настройки, которая за это отвечает.
    Ответ написан
    Комментировать
  • PDO добавление записи в БД. Что делать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не могу понять что ему не хватает)

    Наверное, вызова connect() перед началом использованием класса?

    Кроме того, странно, что РНР не ругается вот на эту строчку
    $arr = array('$login', '$email', '$pass', 'admin', '1', '$time', INET_ATON('$ip'));

    Я уж не говорю о том, что в ДБ пойдут значения буквально $login, $email - а не их содержимое, но в РНР нет функции INET_ATON. Это функция mysql, и писать ее поэтому надо в запросе.

    Вообще, с таким уровнем владения РНР (писать переменные в кавычках, да еще и в одинарных) я бы подождал пока с написанием собственных классов. Учитывая, что метод prep() и так бесполезен для большинства запросов, а connect() бесполезен полностью (его код должен быть в конструкторе), я бы настоятельно прекомендовал отложить класс DB в сторонку, поработать пока с чистым ПДО, набить руку, и только потом пробовать писать свои классы. Ну или по крайней мере воспользоваться готовым.
    Ответ написан
    Комментировать
  • Как сделать много страниц на одном шаблоне без $_GET?

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

    В папку videos положить .htaccess
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.php

    Это заставит апач запросы ко всем несуществующим файлам перенаправлять на index.php

    И потом в index.php смотреть на REQUEST_URI
    Ответ написан
    Комментировать