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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никогда не мог понять, почему пользователи пхп так стремятся раздувать код на пустом месте и писать одно и тоже по 5-6 раз.

    $sql = 'INSERT INTO employees (first_name, second_name, middle_name, id_position) VALUES (?, ?, ?, ?)';
    $pdo->prepare($sql)->execute([$_POST['f_name'], $_POST['s_name'], $_POST['m_name'], $_POST['list-position']]);
    Ответ написан
    Комментировать
  • Pdo->query() дважды выполняет запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Убедись, что файл выполняется только 1 раз.
    Чаще всего двойные запросы - это результат кривого фронт контроллера который запускается на любой запрос к сайту.
    Сделай поле типа варчар и пиши в него $_SERVER['REQUEST_URI'] и увидишь
    Ответ написан
    4 комментария
  • Как грамотно составить функции запросов mysqli?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос содержит взаимоисключающие параграфы.
    Если задача наговнокодить абы как, лишь бы работало - то зачем спрашивать, как правильно?

    Если же задача действительно научиться писать правильно, то надо учить ПДО, просто потому что правильная работа с БД в mysqli ГОРАЗДО сложнее, чем в ПДО.

    Для примитивного примера в вопросе действительно разницы никакой. Но как только речь зайдет о добавлении переменных в запрос, то сразу встанет проблема использования подготовленных выражений. Это и само по чебе для новичков сложно, а уж с mysqli их освоить и вовсе задача нереальная. С ПДО гораздо легче. Чтобы начать польззоваться ,надо знать всего три вещи:

    1. Все переменные заменяются в запросе на знаки вопроса. после этого делаем запросу prepare
    2. Сами переменные запихиваем по порядку в execute
    3. После этого запрашиваем у ПДО результат запроса сразу в том виде, в котором они нам нужны

    И все. Пример:
    $stmt = $pdo->prepare("SELECT id, name, price, amount FROM table WHERE id = ?");
    $stmt->execute([$id]);
    $row = $stmt->fetch();

    Все ОЧЕНЬ просто.
    Ответ написан
  • Стоил ли использовать PDO для отправки запросов к БД на php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сравни эти два кода и ответь себе сам:
    mysqi
    $stmt = $mysqli->prepare("SELECT id, name, price, amount FROM table WHERE id = ?");
    $stmt->bind_param("i", $id);
    $stmt->bind_result($id, $name, $price, $amount);
    $stmt->execute();
    $rows = array();
    while ($stmt->fetch())
        $rows[] = array(
            'id' => $id;
            'name' => $name;
            'price' => $price;
            'amount' => $amount;
        );
    }

    pdo
    $stmt = $pdo->prepare("SELECT * FROM table WHERE id = ?");
    $stmt->execute([$id]);
    $rows = $stmt->fetchAll();

    В общем, если ты мазохист, то mysqli тебе отлично подойдет.
    Ответ написан
    1 комментарий
  • Можно ли использовать rowCount() в подготовленных выражениях?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Можно но не нужно.
    Для запросов типа SELECT применять эту функцию нет ни малейшего смысла.

    В данном случае логичнее сделать fetch. Мы же запрашивали какие-то данные из БД? Значит их надо получить. А если мы их получили - значит данные есть, и считать их не нужно
    $check->execute(array(":domainid" => $domainid , ":vhostid" => $vhostid, ":userid" => $login));
    $mainname = $check->fetchColumn();
    if ($mainname) {}

    Если запрос подразумевает получение не одного поля, а нескольких, то вместо fetchColumn() пишем fetch()
    Если запрос подразумевает получение нескольких строк, то вместо fetch() пишем fetchAll()
    Ответ написан
  • Почему не выполняется SQL запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    О том, почему не выполняется запрос, ты должен спрашивать не у дяди с улицы, а у своей БД. Только она это знает точно.
    Дядя с улицы может только подсказать, как правильно спросить у базы данных.
    Поэтому меняем код подключения на
    $connect = new PDO("mysql:host=127.0.0.1;dbname=***", "***", "***",[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

    И закономерно получаем ошибку
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index)

    В которой черным по белому написано что слово index базе данных не нравится.
    идем в список зарезервированных слов и убеждаемся что так оно и есть

    И вот дальше начинаем удивляться - почему в phpmyadmin аффтар употребляет обратные апострофы, а в пхп - нет.
    Ответ написан
    1 комментарий
  • Я новичок, объясните правильно ли я использую pdo и обрабатываю ошибки?

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

    Если коротко, то

    1. Класс Database выкинуть на помойку.
    2. Все exit() в коде выкинуть на помойку
    3. Все try..catch туда же

    В итоге у нас останется

    class article {
        public function __construct($pdo)
            $this->pdo = $pdo;
        }
        public function get_all_db() {
            $sql = "SELECT `articles_id`, `title`, `keywords`, `description` FROM `articles`";
            return $this->pdo->query($sql)->fetchAll();
        }
        public function get_one_db($id){
            $sql = "SELECT `articles_id`, `title`, `keywords`, `description` FROM `articles` WHERE articles_id = ?";
            $stmt = $this->pdo->prepare($sql);
            $stmt->execute([$id]);
            return $stmt->fetch();
        }
    }


    Все удобно, компактно и безопасно.
    Кода получается меньше чем в mysqli и mysql вместе взятых.
    Ответ написан
  • Удаленное подключение а Mysql на php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Удаленное подключение к Mysql является оправданным решением в разработке системы или же нет?

    вопрос бессмысленный. ответ зависит от конкретных условий задачи.
    к влажным подростковым мечтам про 100500 запросов в секунду не имеет отношения.

    Подойдет ли Mysql для загруженных систем?

    Ну если Фейсбук для тебя недостаточно нагруженная, то даже не знаю. Наверное нет.

    подкиньте литературу, у кого есть по этому направлению?

    Вынужден тебя огорчить. Литературу придется читать 5 лет, в институте, и потом еще столько же набираясь опыта.
    Но сначала надо будет закончить школу
    Ответ написан
    Комментировать
  • Pdo, подстановки в execute, возможно ли в подстановках значения на кириллице?

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

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

    Но тут важно понимать, для чего ты это делаешь.
    Если просто "шоб було" - продолжай использовать mysqli.
    Если хочешь сократить размер кода в 3-10 раз - тогда имеет смысл. Но тогда надо сначала разобраться с тем, что такое PDO и какие преимущества оно дает программисту.

    Например, вместо такого кода
    $name = $mysqli->real_escape_sring($_GET['name']);
    $price = $mysqli->real_escape_sring($_GET['price']);
    $color = $mysqli->real_escape_sring($_GET['color']);
    
    $sql = "SELECT * FROM goods WHERE name = '$name' and color = '$color' and price > '$price'";
    $res = $mysqli->query($sql);
    $result = [];
    while ($row = mysqli_fetch_assoc($res)) {
        $result[] = $row;
    }
    echo json_encode($result);

    В ПДО можно написать
    $stmt = $pdo->prepare("SELECT * FROM goods WHERE name = ? and color = ? and price > ?");
    $stmt->execute([$_GET['name'],$_GET['price'],$_GET['color']]);
    echo json_encode($stmt->fetchAll());

    Что гораздо удобнее.

    Учитывая, что ПДО умеет возвращать данные в десятках различных форматов, вариантов сокращения кодов может быть такое же количество
    Ответ написан
    Комментировать
  • Как отследить на каких доменах используется моя CMS?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Детский сад, штаны на лямках.
    Наивные мечтатели задают этот вопрос уже много лет, но ответ за это время не изменился:

    1. Чтобы отсечь нелицензионное использование - никак не отследить. Нулленая версия твоего горе-движка появится в интернете через день после релиза, у которой будет оторваны все проверялки, какие ты только сможешь придумать.
    2. Продавать надо не программу а сервис. Размещай свою платформу на своем же сервере и бере помесячную плату за использование. Никаких других вариантов отслеживать использование нет ,и быть не может
    Ответ написан
    7 комментариев
  • Как подсчитать количество заказов?

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

    Как это должно выглядеть на самом деле:

    public function countOrders($user_id)
    {
          $stmt = $this->pdo->prepare("SELECT count(1) FROM orders WHERE user_id =?");
          $stmt->execute([$user_id]);
          return $stmt->fetchColumn(); 
    }
    // и использование
    echo $obj->countOrders($_SESSION['user_session']);

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Странно, в тексте упоминается объект $pdo, а в коде статический вызов, у которого никаких проблем с видимостью в принципе быть не может.

    Но есть отвечать буквально, то

    1. Если код процедурный, то global для $pdo или статический вызов через DB:: - это нормально. Если код объектный, то передавать $pdo как параметр в конструктор, присваивать локальной переменной класса и потом уже использовать только ее.
    2. В данную конструкцию никакая инъекция не пролезет

    Писать, кстати, можно короче, чтобы не канителиться.

    $data = array(
      'email' => $_POST['email'],
      'id' => $_POST['id']
    );
    $res = DB::prepare("UPDATE `users` SET `email` = :email WHERE `id` = :id")->execute($data);
    Ответ написан
    1 комментарий
  • Ошибка php или мой косяк?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я думаю, тут мы имеем случай кривого чпу.
    Ну и кривой отладки, разумеется: сначала в одном месте записываем что-то в датабазу, а потом через два километра проверяем.
    Для проверки запускать этот код через консоль, а не через браузер.
    Ответ написан
  • Как в PHP через PDO добавить спец. символ?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Кодировка к кавычкам не имеет никакого отношения.

    Чтобы всегда добавлять любые символы в БД без ошибок, надо использовать подготовленные выражения.
    Кодировку, впрочем, тоже надо задавать не с помощью шаманских плясок с бубном, а правильно.
    В итоге код должен выглядеть примерно так
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $charset = 'utf8';
    
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $pdo = new PDO($dsn, $user, $pass, $opt);
    
    $ujasnaya_kavychka = '"""""';
    // подготавливаем запрос, заменяя все переменные знаками вопроса
    $stmt = $pdo->prepare("INSERT INTO table (pole_s_kavychkoy) VALUES (?)");
    // исполняем его, передавая все переменные отдельно
    $stmt->execute([$ujasnaya_kavychka]);

    При таком способе выполнения запросов ни одной ошибки, вызванной передаваемыми в запрос данными никогда в принципе не произойдет.

    Еще одна проблема может быть связана не с запросом, а с выводом. многие нубы выводят свои данные с кавычками в атрибут тега HТML,
    <input type="text" value="<?=row['pole_s_kavychkoy']">

    получают на выходе что-то вроде
    <input type="text" value="артель "рога и копыта">
    и страшно пугаются - оказывается, коварная база данных украла у них весь текст после кавычки.
    Чтобы отобрать этот текст обратно ,весь вывод надо производить через htmlspecialchars()

    Поскольку вопросы был отредактирован, то отредактирую и ответ:
    Если речь идет не про кавычку, а про развесистую эмодзи, то в стандартной ut8 они не поддерживаются, и надо использовать utf8mb4 - как в таблицах, так и при соединении.
    Ответ написан
    1 комментарий
  • Как посчитать количество и вывести сумму(класс корзины + куки)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если коротко, то автор этой "корзины" идиот.
    Так корзины никто не делает.
    Беги с этого сайта куда глаза глядят. Это "девионити" еще хуже видеокурсов попова.

    В корзине должны лежать только уникальные товары, а количество пишется в отдельное поле.
    if (isset($this->products[$id])) {
        $this->products[$id] = 1;
    } else 
        $this->products[$id]++;
    }

    примерно так.
    но чтобы сделать по-человечески, надо будет будет выкинуть весь идиотский код который тебе впаривают на этом сайте.
    Ответ написан
  • 'Allowed memory size of 134217728 bytes exhausted' Почему это происходит с PDO, при выборке всего 27k записей?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Единственная независящая от программиста причина, по которой PDO будет жрать память, это буферизованные по умолчанию запросы. поэтому если перед выполнением запроса написать
    $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, FALSE);

    То ошибка исчезнет.
    Остальные рекомендации настолько очевидны, что я постеснялся их писать сначала.

    1. При выборке большого объема данных fetchAll() использовать не рекомендуется.
    2. Если все же хотим использовать, то надо убрать двойное заполнение массива
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

    Все остальные претензии по памяти предъявлять РНР и собственному коду.
    Ответ написан
    8 комментариев
  • Как сделать чтобы при нажатии на ссылку выводилось обЪявление полностью?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Открыть исходный текст страницы в браузере и увидеть там свое объявление в целости и сохранности
    2. Применять для вывода значений функцию htmlspecialchars
    Ответ написан
    Комментировать
  • Последнее значение ID через PDO?

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

    Запрашивать Последнее значение ID в принцие неправильно, и приведет к очень неприятным последствиям.
    Запрашивать можно последнюю запись целиком, чтобы показать ее юзеру. Это делается с помощью оператора ORDER BY. Но запрос "последнего ид" говорит о том что логика программы неправильная. И начнутся проблему после того, как такой запрос вернет не самый последний ид
    Ответ написан
    3 комментария
  • Почему не срабатывает запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $num = '1';
    $fields = 'title';
    
    $stm = $pdo->prepare('SELECT * FROM products WHERE id=?');
    $stm->execute([$num]);
    $data = $stm->fetch();
    
    var_dump($data[$fields]);
    Ответ написан
    Комментировать