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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $user = 'andrey';
    $stmt = $conn->prepare("SELECT * FROM table WHERE user=?");
    $stmt->bind_param("s", $user);
    $stmt->execute();
    $result = $stmt->get_result();
    $data = $result->fetch_all(MYSQLI_ASSOC);
    echo json_encode($data);
    Ответ написан
    Комментировать
  • Как проверить поле на пустоту?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Учитывая твоя предыдущий вопрос, ты вряд ли осилишь, но вообще поиск по необязательным условиям делается так:
    $conditions = [];
    $parameters = [];
    
    // conditional statements
    if (!empty($_GET['name']))
    {
        // here we are using LIKE with wildcard search
        // use it ONLY if really need it
        $conditions[] = 'name LIKE ?';
        $parameters[] = '%'.$_GET['name']."%";
    }
    
    if (!empty($_GET['age']))
    {
        // here we are using equality
        $conditions[] = 'age = ?';
        $parameters[] = $_GET['age'];
    }
    
    $sql = "SELECT * FROM users";
    
    // a smart code to add all conditions, if any
    if ($conditions)
    {
        $sql .= " WHERE ".implode(" AND ", $conditions);
    }
    
    // the usual prepare/bind/execute/fetch routine
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param(str_repeat("s", count($parameters)), ...$parameters);
    $stmt->execute();
    $b = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
    if($b) {
        print_r($b);
    } else {
      echo "0 results";
    }
    Ответ написан
    5 комментариев
  • Как вывести данные из mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ошибка Couldn't fetch mysqli означает что ты где-то уже закрыл соединение с БД зачем-то

    Ну и чтобы ответить на вопрос из заголовка и переписать весь этот пещерный ужас на нормальный РНР

    $b = $conn->query("SELECT * FROM users WHERE name = 'alex'")->fetch_all(MYSQLI_ASSOC);
    if($b) {
        print_r($b);
    } else {
      echo "0 results";
    }
    Ответ написан
    Комментировать
  • Как получить минимальное значение массива с его название?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    внутри цикла сравнивать текущее значение с записанным ранее.
    если текущее меньше - записать его и ключ в переменную.
    Ответ написан
    Комментировать
  • Нужен ли объект в данном примере?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    ну вот конкретный пример, как сохранить объект в БД? Таким образом как я сделал?

    Если ты создал класс для того чтобы сохранять его объекты в БД - то нет, не нужен.

    Вообще, порог вхождения в ООП очень высокий. Особенно в сравнении с порогом вхождения похапе. Из 100 человек, пользующихся РНР, хорошо если один может понять, зачем ему классы. Так что в целом ничего страшного, если ты не понимаешь. Хотя мне кажется, что ты движешься в правильном направлении. Просто не надо думать, что с ООП получится так же легко и само собой, как с процедурщиной. Тут надо мозги нанизнанку выворачивать.

    А с классом надо так - сначала думаешь,зачем он тебе, а потом создаешь. Не наоборот :)
    Ответ написан
    2 комментария
  • Как получить выборку Mysql если в поле есть нужный ID?

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

    Сделать отдельную таблицу, в которой будет две колонки, id из исходной строки и id книги.

    Дальше делаем совершенно тупой запрос

    SELECT a.* FROM actions a, actions_books ab WHERE a.id= ab.aid and ab.book_id=?


    Это решит не только текущую проблему но и множество проблем в будущем. В частности с производительностью.
    Ответ написан
    Комментировать
  • Не могу занести данные в базу данных. Что не так?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Включи отображение ошибок и бд сама скажет, что ей не так.

    Плюс ты неправильно вставляешь переменную в запрос. Это никогда нельзя делать напрямую.

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $login, $password, $database_name);
    if (!empty($_POST['id'])){
      echo 'Вы ввели ' . $_POST['id'];
      $stmt = $link->prepare("INSERT INTO `single` (`id`) VALUES (?)");
      $stmt->bind_param("s", $_POST['id']);
      $stmt->execute();
    }

    ?>
    Ответ написан
    2 комментария
  • Как обойти защиту от пасеров?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    There are only two hard things in Computer Science: cache invalidation and naming things.

    -- Phil Karlton


    https://martinfowler.com/bliki/TwoHardThings.html
    Ответ написан
    Комментировать
  • Json_encode возвращает false?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Чтобы json_encode не возвращал false, надо чтобы исходные данные были в UTF-8
    Ответ написан
  • PHP 7.0 mysqli prepare как отобразить ошибку?

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

    А вот бессмысленные пляски с бубном, которые только засоряют код и не несут никакой полезной информации, надо вычистить. И оставить только нормальный код
    function AddTable($data)
    {
        global $DB;
        $query = 'INSERT INTO table (title) VALUES (?)';
        $stmt = $DB->prepare($query);
        $stmt->bind_param('s', $data['title']);
        $stmt->execute();
        return $DB->insert_id;
    }

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

    В класс, кстати, эту отдельно стоящую функцию запихивать не нужно.
    Ответ написан
    Комментировать
  • Как совместить реляционную модель бд с ООП?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Неужели сама идея реляционных бд с ООП несовместима?


    Ты весьма недалёк от истины.
    Некоторые сравнивают эту проблему с проигранной США войной во вьетнаме.

    Решение от Victhor подходит для единичных выборок, но как быть с коллекциями? Люди начинают изобретать разные стратегии подгрузки - lazy loading, eager loading. Вот Елоквент, например, собирает в кубышку все айди загруженных товаров и потом пуляет 1 запрос с IN (...) чтобы получить для них бренды, которые потом в цикле пришпандоривает к товарам.

    Но все это очень быстро начинает сказываться на производительности. И всё дальше затягивает нас в пучину Вьетнамской войны, или другими словами в кроличью нору Object-relational impedance mismatch - как по-научному называется озвученная тобой проблема. Дальше начинается совсем уж треш и угар, типа дико тормозащих коллекций в Доктрине или таких извращений, которыми занимался один мой знакомый - он плодил вьюхи в БД, поскольку его ОРМ умел работать только с одной таблицей.

    Или все же модифицируются в дальнейшем классы, переписыванием кода?


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

    И тут на первый план выходит организация ORM и становится очевидной превосходство стратегии Data Mapper, когда слой работы с БД полностью отвязывается от объекта бизнес-логики.

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

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

    И это мы сейчас говорим о read-моделях, и даже не трогали тему write models - то есть сохранения измененного объекта - со всеми гроздьями смежных объектов(!) - в БД!
    Ответ написан
    4 комментария
  • Почему результат сравнения $ip = $_SERVER['REMOTE_ADDR']; с тем же ip в переменной не равны?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    переменная из файла небось
    Ответ написан
    Комментировать
  • Обработчик POST запроса?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    "зацикленный слушающий POST запрос сервер" называется nginx. его писать не надо
    "обработчик формочек без формочек" используется точно такой же, как и с формочками.
    писать в нем примерно то же, что и в обработчике формочки авторизации.
    Ответ написан
    2 комментария
  • Как объединить массив циклом?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    array_merge(...$result);
    Ответ написан
    3 комментария
  • Стоит ли использовать php фреймворк?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как раз для банального функционала фреймфорки и востребованы больше всего.
    Ну и царь фреймворков для банального функционала - это Ларавель
    Ответ написан
    Комментировать
  • Почему не добавляются записи в БД?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надо понимать одну простую вещь. Что фреймфорк не создаёт за тебя приложение. Код, основанный на фреймворке, составляет от 1% до 10% от всего кода приложения. Все остальное - так называемую бизнес-логику - всё равно пишешь сам.

    Ну это если не брать вырожденные случаи конвейеров системы "фигак-фигак и в продакшен", какие-нибудь рест-апи без особой логики.

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

    Другое дело что когда учишь чистый РНР, то без вариантов учишь спагетти говнокод системы 1990-х годов. А хороший фреймворк ставит мозги на место, потому что одна из его функций - это правилно структурировать твоё приложение.

    В общем, учи сначала пых а потом Симфони
    Ответ написан
    Комментировать
  • Почему не работает крон?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    в начале кронтаба написать
    MAILTO=твой@емейл
    Весь вывод крон скриптов будет приходить на почту (если она настроена на хосте)
    Ответ написан
    1 комментарий
  • Почему функция create, update работает когда phpmyadmin стоит на локалке но не работает, когда я гружу его на свой сервер?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    self::$cont =  new PDO( 
    "mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, 
    self::$dbUsername, 
    self::$dbUserPassword, 
    [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);


    И повыкидиывать к едрене фене все бессмысленные try..catch из кода.

    И база даннх тебе сама человеческим голосом скажет, что ей не так.
    Ответ написан
    Комментировать