Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Как сделать выборку данных из Mysql и создать из них ассоциативный массив php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если подумать за автора, то ему надо это
    $result= mysqli_query($conn, "SELECT value FROM _main WHERE variable = 'logo'");
    $row = mysqli_fetch_assoc($result);
    $logo = $row['value'];
    В ПДО действительно будет проще
    $logo = $pdo->query("SELECT value FROM _main WHERE variable = 'logo'")->fetchColumn();


    Если нужен, как выясняется, словарь, где ключами являются значения колонки variable, то PDO без вариантов.
    $settings = $pdo->query("SELECT variable, value FROM _main")->fetchAll(PDO::FETCH_KEY_PAIR);
    echo $settings['logo'];

    даст нам вожделенную картинку, поскольку метод fetchAll() с модификатором PDO::FETCH_KEY_PAIR
    как раз и дает нам двумерный массив, где ключи - это содержимое перво....
    Ответ написан
    5 комментариев
  • Как вывести данные из объекта PHP в HTML?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сначала надо получить из ПДО массив
    $query = $pdo->query('SELECT * FROM `telephone` ORDER BY `fullname`');
    $data = $query->fetchAll(PDO::FETCH_ASSOC));
    А потом уже в ХТМЛ выводить из массива
    <select class="viewing-select">
             <?php foreach ($data as $row): ?>
                 <option value="<?= $row['id'] ?>"><?= $row['fullname'] ?></option>
             <?php endforeach ?>
          </select>

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

    "Тетенька, дайте попить, а то так есть хочется, что аж переночевать негде"

    Ты это, милай, не путай тостер с Фрилансим. Если тебе целиком сайт написать, так ты туда обращайся.
    Ответ написан
    Комментировать
  • Как быстрее всего забить базу 5 млн юзерами и в последствии всех их выбирать?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Разумеется, $result не имеет отношения к тому, нашел что-то запрос, или нет.
    А вот $mywe, если подумать, как раз имеет. Ну это если подумать, конечно.

    $mywe = mysqli_fetch_array($result, MYSQLI_ASSOC);
        if ($mywe) {
            echo 'Найдено совпадение: '; echo $mywe['adress'];
        } else {
              echo "текст";
        }
    Ответ написан
    Комментировать
  • Как узнать какой php код нагружает процессор?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    На PHPRussia2019 был отличный доклад от Павла Мурзакова из Badoo, где он как раз рассказывал именно про это.

    В данном случае поможет https://github.com/adsr/phpspy
    Ответ написан
    1 комментарий
  • Как можно передать данные из 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 комментариев
  • Где и кто должен делать валидацию?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это хороший вопрос.

    Когда форма сама занимается своей валидацией, то тут вариантов немного. Остаемся в контроллере.

    Но по-хорошему, если отвлечься от конкретных велосиепедов, плотно увязывающих вывод ХТМЛ и валидацию входящих в модель данных, то в AccountService должен быть метод validate().

    Соответственно, из любого места, где нам надо создать юзера, сначала дергаем validate(), а потом по результатам либо выдаем ошибку, либо дергаем create()
    Ответ написан
  • Как отправить текст в базу 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 комментариев