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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    современный и желательно простой

    echo json_encode($pdo->query("SELECT * FROM tablica")->fetchAll());
    Ответ написан
    Комментировать
  • Как записать данные из формы на сайте в базу данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Самая полезная информация по работе с mysqli, которую надо знать

    1. Как правильно соединяться. помимо множества других вещей, которые код по ссылке делает правильно, в нем задается правильный режим информирования об ошибках.
    2. Все запросы в которых участвуют переменные, надо выполнять только с помощью подготовленных выражений. Это сразу снимает все проблемы с синтаксисом рабочих запросов.
    $stmt = $mysqli->query("INSERT INTO $db_table (name,mobnumber,modelandbrandcar,yearissue,scheduledmain,repairs,paintwork,additionalequip,technicalinsp,other,detail) VALUES (?,?,?,?,?,?,?,?,?,?,?)");
    $stmt->bind_param("sssssssssss", $name, $mobnumber, $modelandbrandcar, $yearissue, $scheduledmain, $repairs, $paintwork, $additionalequip, $technicalinsp, $other, $detail);
    $stmt->execute();
    Ответ написан
    Комментировать
  • Выводит ошибку: Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in что делать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Перед соединением с БД надо написать строчку
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    после этого пхп будет писать реальную причину ошибки, а не эту ерунду.

    Колупаться, как тут предлагают, с mysqli_error() - это треш и прошлый век.

    Подробный пример того как правильно соединяться с БД, с выставлением всех необходимых опций
    Ответ написан
    9 комментариев
  • Где учиться PHP?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не нужно осваивать всё сразу. У тебя не будет работать тоже все сразу. И ты не будешь знать, что именно.

    Всегда надо решать только одну задачу за раз

    А у тебя тут и ООП, и ПДО, а неймспейсы ,и автолоад, и ни одну из этих вещей ты не понимаешь.

    Собрался писать класс для работы с БД? Отлично, пиши класс для работы с БД. БЕЗ неймспейсов и автолоадов. Не переломишься, добавишь один инклюд. Но зато хотя бы не будешь бегать по коду и искать, в каком из 10 мест у тебя ошибка.

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

    Свой велосипед, чтобы он был хоть на что-то годен и добавлял хоть что-то к оригинальному ПДО, переписываешь так
    class DB
    {
        public $pdo;
    
        public function __construct() {
            $host = "localhost";
            $user = "root";
            $password = "";
            $dbname = "dbtest";
            $charset = "utf8";
            
            $dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
            $this->opt = [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => FALSE
            ];
            $this->pdo = new PDO($dsn, $user, $password, $opt);
        }
        
        public function query($sql, $args = NULL)
        {
            if (!$args)
            {
                 return $this->pdo->query($sql);
            }
            $stmt = $this->pdo->prepare($sql);
            $stmt->execute($args);
            return $stmt;
        }
        public function __destruct() {
            $pdo = NULL;
        }
    }

    Объяснения по коду (на английском) - Детские болезни моего первого класса для работы с БД

    Дальше.
    Класс Settings не должен наследовать классу БД. Это совершенно разные сущности. Класс человек не должен наследовать классу Карман только потому что у всех людей есть карманы обычно.

    Если человеку нужен карман, то карман передается в конструктор добавляется в свойства класса. Поэтому

    сlass Settings {
        public function __construct($db) {
            this->db = $db;
        }
        public function getSiteName() {
            $stmt = $this->db->query("SELECT Value FROM configs WHERE Name = 'SiteName'");
            return $stmt->fetchColumn();
        }
    }
    Ответ написан
    7 комментариев
  • Как отправить текст в базу mySql, отправляются только символы?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Данные надо передавать отдельно от запроса
    $sql = $conn->prepare("INSERT INTO MyGuests2 (text2) VALUES (?)");
    $sql->bind_param("s", $_POST["name"]);
    $sql->exeсute();
    echo "Успешно созданы новые записи";


    И вдогонку, как правильно соединяться
    Ответ написан
  • Учить PHP 5 или 7?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никакой "колоссальной разницы" в самом языке нет.
    РНР 5 и РНР 7 - это не два разных языка. Это один и тот же язык, семерка просто быстрее и из нее выпилено много вещей, которые оставались еще с 4 версии, а в 5 считались устаревшими и не поощрялись к использованию.
    Поэтому сам по себе вопрос - что учить, 5 или 7 - не имеет смысла. Язык один и тот же.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Комментировать
  • Проблемы с кодировкой. Почему php возвращает русские буквы в виде u041f?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Зачем это исправлять?
    2. Если призвать на помощь логику, то можно догадаться , что подобный вывод возвращает не "пхп страница" а определенная функция. И если открыть раз в жизни описание этой функции в мануале, то и искать решение не пришлось бы, поскольку оно там написано русским по белому
    Ответ написан
    4 комментария
  • Как оптимизировать и сократить PHP код?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    То что написано в ответе выше, плюс

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Главное, сложность среднюю поставил.

    В последнее время появилось много вопросов про RB. причем у всех вопросов одна характерная особенность: спрашивающие не знают пхп. Вообще, от слова "совсем". Такое ощущение, что кто-то набрал на курсы школьников, но преподает почему-то одну малоизвестную библиотеку и больше ничего.

    И в итоге появляются вопросы типа этого, "я не знаю, как вывести в браузер значение переменной, памагитя пажалусто".

    Про логику я вообще молчу.
    "Все супер выводит как надо" означает что извлечь данные получилось успешно, с этим проблем нет.
    Но вопрос, тем не менее, называется "Как решить проблему извлечения данных из БД".
    Ответ написан
    9 комментариев
  • Как решить проблему с устаревшей функцией php mysql_escape_string?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В пресловутом BOM, конечно.

    При любых проблемах с "невидимыми" символами надо использовать urlencode()

    после того как на месте невидимых символов выведет что-то вроде %EF%BB%BF, тупо заменить проценты на слеши, и вырезать из начала строки

    if(substr($str, 0, 3) == "\xEF\xBB\xBF") {
        $str = substr($str, 3);
    }
    Ответ написан
    2 комментария
  • В чем проблема кода? Почему данные не добавляются в базу данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для начала query() меняем на это
    public function query($sql, $params = []) {
        $stmt = $this->db->prepare($sql);
        $stmt->execute($params);
        return $stmt;
    }

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

    А для получения ответа на вопрос надо научиться правильно соединяться с PDO.
    Для этого там, где создается инстанс класса $this->db, пишем вот такой код, в котором самой главной является строчка
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,


    После этого запускаем свой код, и PHP сам, человеческим голосом, сообщает нам, в чем проблема этого кода.
    Таким образом мы сразу убиваем двух зайцев:

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

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

    Поэтому никогда не надо уподобляться бабкам-гадалкам, которые пишут "а вы уверены" и "спробуй заячий помет, может поможет", а просто всегда настраивать пхп так, чтобы он сам сообщал, в чем конкретно заключается ошибка.
    Ответ написан
    5 комментариев
  • Загрузка картинок на сайт. Возможен ли универсальный подход?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    если пользователь загружает на сайт изображение, например, формата gif или png - приложение выдаёт ошибку

    Если отвечать на вопрос буквально, то есть, как бы, imagecreatefromgif и imagecreatefrompng.
    Но если это только "например", и хочется прям полной всеобъемлющей универсальности, и делать аватарки из pdf, imagick, причем лично й предпочту вызывать утилиту командной строки чем колупаться с расширением пхп
    Ответ написан
    Комментировать
  • Какие есть библиотеки для комментирования php кода и оценки покрытия кода комментариями?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это бессмысленный вопрос, и ответа на него не существует.

    Чисто процент строк с комментариями можно посчитать примитивным грепом, но следйет отдавать себе отчет, что эта метрика абсолютно бессмысленная, и ничего, кроме вреда, не принесет.
    Ответ написан
    Комментировать
  • Можно ли вывести оба параметра в одном foreach?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Принятый ответ - это какой-то ужас.
    Буквальный правильный ответ будет таким
    while($enum_fields = $property_enums->GetNext()) {
        $sorts[] = $enum_fields[VALUE];
        $ids[] = $enum_fields[ID];
    }
    natsort($sorts);
    foreach ($sorts as $i => $name) {
        echo $ids[$i], $name;
    }

    А правильный ответ будет, разумеется, в том, чтобы сразу создавать один массив
    while($enum_fields = $property_enums->GetNext()) {
        $sorts[$enum_fields['ID']] = $enum_fields['VALUE'];
    }
    natsort($sorts);
    foreach ($sorts as $id => $name) {
        echo "$id $name";
    }


    Если natsort не подходит, то использовать asort
    Ответ написан
  • Почему этот код работает?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я правильно понимаю, что из всего этого адского говнокода тебе непонятен только оператор добавления в массив []?

    Учебник разорвать, сжечь и выкинуть на помойку.
    На будущее, этот код пишется вот так
    $data = mysqli_query($link, "SELECT * FROM workers")->fetch_all(MYSQLI_ASSOC);
    var_dump($data);
    Ответ написан
  • Почему не получается сделать запрос в базу данных PDO PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Чтобы было понятно.

    Проблема в том, что админ наследует модели, а не использует её как сервис.
    И в итоге обращение идет не к Model:query(), а к PDO::query().

    Плюс в этом "ООП и MVC" еще примерно 100500 косяков.
    Например, этот сайт ляжет, как только выйдет в продакшен, и ты перестанешь быть его единственным посетителем.

    Класс Model надо переименовать в DB и сделать нормальный код соединения. Наследников у него быть не должно.
    после этого создать единственный экземпляр класса, и передавать его в конструктор всем классам, которым нужна работа с БД.

    Для общего развития: Детские болезни моего первого класса для работы с БД (англ.)
    Ответ написан
  • Как лучше отображать связи в таблицах?

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