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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для того, чтобы "играть в шахматы" конкретно на PHP, не нужно знать РНР. Всё, что делает РНР в последние годы - это изо всех сил пытается стать Ждавой. Поэтому если знание "серьёзных" языков столь могучее, то всё что надо делать - это применять имеющиеся знания. Впрочем, если w3fools считается авторитетным источником, то есть у меня сомнения.

    Чтобы узнать о последних версиях 5-й ветки, надо читать changelog.

    Тонкость в работе РНР ровно одна - это язык, который работает с протоколом НТТР. протокол желательно изучить.
    Ответ написан
    Комментировать
  • За кем будущее?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос "На каком языке говнокодить" не имеет ничего общего с прогнозированием. Профессионал и так в своей работе использует 2-3 языка, знает ещё больше, и при необходимости осваивает новый за неделю. А вот для васи-говнокодера, который два года бегал на тостер или стаковерфлой с каждой синтаксической ошибкой и в конце концов вызубрил самые часто встречающиеся пять штук - для него, конечно, смена языка это действительно катастрофа.
    Ответ написан
    Комментировать
  • Где найти грамотный код для хеширования/проверки на, скажем, PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Грамотный код есть в мануале:
    $hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

    и сохраняем в базу. потом, при проверке
    if (password_verify ("rasmuslerdorf", $hash)) echo "OK";
    Если версия РНР на хосте пока не доросла до 5.5, то есть имплементация на пхп - тупо заинклюдить, и всё.
    Ответ написан
    Комментировать
  • Можно ли как-то вернуть уже типизированный результат без лишних действий?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Да, можно. Надо юзать mysqli или PDO с поддержкой mysqlnd.
    Причем в этом случае можно будет получить от базы даже NULL - чего никаким ручным кастингом не сделаешь.

    Правда, в mysqli для этого надо использовать prepare - mysqli_query() типы не возвращает. А подготовленное выражение - да:
    $stmt = $db->prepare("SELECT NULL, 1, 's'");
    $stmt->execute();
    $res = $stmt->get_result();
    $row = $res->fetch_assoc();
    var_dump($row);

    array(3) {
      ["NULL"]=>
      NULL
      [1]=>
      int(1)
      ["s"]=>
      string(1) "s"
    }
    Ответ написан
    Комментировать
  • Как получить данные из Myslq по запросу и передать все в данные в приложение C# и записать все в SQLite?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну так и склоняйся в сторону "SOAP, Rest". Вопрос-то в чем?

    Все эти умные слова придуманы убогими джавщиками и шарпеями, никогда в глаза не видевшими НТТР запроса. Который, по сути своей (в компании с RPC) и представляют. Всё что тебе надо - это послать НТТР запрос к похапе серверу. Желательно с какой-никакой авторизацией. И получить ответ. Формат же передачи данных - вопрос десятый. Какой хочешь - такой и передавай. Хоть comma delimited, хоть HTML. Тем более, что нужен, как я понял, голый дамп, а не отдельные выборки.

    Со стороны пхп самым простым форматом будет JSON.
    echo json_encode($db->getAll("SELECT * FROM table"));

    будет достаточно.

    Если не умеешь из шарпа делать НТТР запросы, и хочешь чтобы наоборот - пых плевался данными по крону - тогда curl
    Ответ написан
    Комментировать
  • Интерфейсы PHP, что означет?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Type hinting на самом деле не имеет отношения к интерфейсам.
    Ответ написан
    2 комментария
  • Как определить php_value upload_max_filesize функциями PHP?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если выбирать из этих двух, то второй, разумеется. Он на порядок лучше первого:
    - в отличие от первого, он будет выдавать ошибки туда же, куда и весь остальной РНР. На машине разработчика это может быть экран, на боевом сайте - лог. Первый плюёт ошибки в браузер ВСЕГДА, чего на боевом сайте не должно быть никогда
    - в отличие от первого, он сообщит номер строки и имя файла, где произошла ошибка, что является критически важным для того самого отлова ошибки. Рекомендую попробовать поискать ошибочный запрос в коде на пару тысяч строк по сообщению от первого варианта. Подробнее про то, как правильно обрабатывать ошибки, можно почитать здесь: Обработка ошибок, часть 1

    Примечание: на самом деле ни тот, ни другой коды работать не будут, поскольку mysqli_error() тоже требует $link в обязательном порядке.

    Дальше уже идут более продвинутые варианты.
    Для начала, mysqli умеет кидать исключения из коробки:
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    и после этого любая ошибка mysqli будет порождать исключение.
    Но у этого подхода есть два минуса:
    1. Такой вариант может понадобиться только в случае, если обращения к mysqli_query разбросаны по всему коду, чего делать нельзя ни в коем случае.
    2. В брошенном исключении будет отсутствовать сам запрос, который может быть очень полезен при отладке.

    Поэтому идеальным вариантом будет такой:
    Во-первых, все обращения к mysqli API в обязательном порядке надо завернуть в какую-либо библиотеку, которая возьмёт на себя выполнение всей грязной и повторяющейся работы. Пример такой библиотеки - SafeMysql
    Во-вторых, в этой библиотеке оформить код обращения к mysqli_query такм образом:
    $res = $link->query($query);
    if (!$res) throw new Exception($link->error() ." [$query]");

    В результате мы получим идеальную обработку ошибок:
    - этот код уже из коробки будет так же следовать настройкам РНР, и не будет выдавать ошибки на экран на боевом сервере, но при этом программист всегда будет о ней проинформирован.
    - этот код будет выдавать трассировку вызовов - бесценную информацию, без которой найти место, где произошла ошибка, будет очень сложно.
    - брошенное исключение можно будет поймать в хендлере или блоке try..catch (однако если нет опыта работы с этими двумя вещами, то на первое время лучше оставить исключение как есть. В обработке ошибок есть много нюансов, неизвестных среднему кодеру, и поэтому лучше оставить эту задачу для РНР).
    Ответ написан
    Комментировать
  • PDO_MySQL: можно ли узнать наличие записей в result set'е без сдвига курсора?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ерунда какая-то.

    те, которые действительно считали строки - это требуется и использовалось не часто, по-этому было благополучно за полдня переписано вручную на fetchAll + foreach

    Какое отношение к подсчету строк имеет foreach? count наверное имелся в виду?

    те, которые проверяли, есть ли строки в результирующем наборе (таких несколько сотен).

    а здесь как раз нужен fetchAll + foreach и проверка сведется к проверке результата fetchall.

    все вхождения mysql_num_rows

    Таких вхождений должно быть в среднем ноль на веб-приложение.
    Если же они есть, то приложение написано криво, а функция используется не по назначению.

    А вы документацию читаете? Для select запросов не работает.


    Обновить документацию не пробовали? с 2004 года она могла немного поменяться. На худой конец можно попробовать и посмотреть самому. Это не так сложно, как кажется.

    ЗЫ: Я очень надеюсь, что речь идёт о подсчёте именно в резалтсете, а не в базе.
    ЗЗЫ:

    Все функции работы с БД были успешно переписаны за пару дней на PDO'шные путем замены имен функций регулярными выражениями по проекту

    - т.е., была проделана абсолютно бессмысленная, никому не нужная и совершенно бесполезная работа.
    Ответ написан
    Комментировать
  • Какие есть best practices в работе с PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    а как быть с конструкцией try-catch?

    Никак. Если подумать, то эта конструкция здесь не нужна: www.phpfaq.ru/pdo#exceptions

    По поводу же синглтона, то если выкинуть всё лишнее, и использовать РНР5, то получится так
    class DB
    {
        protected static $instance = null;
    
        final private function __construct() {}
        final private function __clone() {}
    
        public static function instance()
        {
            if (self::$instance === null)
            {
                $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHARSET;
                self::$instance = new PDO($dsn, DB_USER, DB_PASS);
                self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                self::$instance->query("SET NAMES ".DB_CHARSET);
            }
            return self::$instance;
        }
        public static function __callStatic($method, $args) {
            return call_user_func_array(array(self::instance(), $method), $args);
        }
    }


    и обращаться напрямую

    $stmt = DB::prepare($query);
    Ответ написан
    3 комментария
  • Какие статьи читать о применении sql inj в контексте php?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    "в бд заходят" - это не слишком корректное описание проблемы.
    Если все сделано именно так, как написано, то в БД входят нормальные символы. И надо тогда проверять, что при просмотре выбрана правильная кодировка.

    Но скорее всего всё-таки где-то в базе utf8 не указана. "Везде", кстати никакого значения не имеет. Важно только то, что стоит в описании таблицы/полей. Посмотреть можно через
    CREATE TABLE table_name
    Подробнее можно почитать здесь: Проблемы с кодировкой в MySQL
    К PDO эта проблема прямого отношения отношения не имеет.

    PS. Не принципиально, но лучше задавать кодировку в DSN, а не отдельным запросом
    Ответ написан
    3 комментария
  • Как сделать MySQL запрос, что бы получить сгруппированный массив?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В некоторых похожих случаях можно посмотреть на group_concat()
    Но здесь, я думаю, стоит сначала получить рецепты, а потом отдельными запросами по ингредиентам и инструкциям, where recipe_id IN(..)
    Ответ написан
  • Как дальше развиваться PHP программисту?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Попробовать применить всё нажитое непосильным трудом в реальном проекте. Столкнуться с проблемами, которые не решаются в нуботуториалах. Решить их. Сделать пулл-реквесты с решениями. Ловить баги в лучшем, что может предложить open source, в том числе и самом РНР. Делать пулл-реквесты.
    Освоить все перечисленные инструменты до такой степени, чтобы понять, чего им всем не хватает - и написать свой.
    Ответ написан
    Комментировать
  • Как в MySQLi сделать поиск по параметрам, если их количество неизвестно?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. И сейчас можно, только надо делать по уму.
    Совсем не обязательно упираться в родные препареды. Их вполне можно эмулировать. Поэтому подключаем safeMysql и пишем для первого запроса
    $data = $db->getAll("SELECT * FROM t WHERE id IN (?a)", $params);
    а для второго
    $sql = "SELECT user_id,password FROM user WHERE email = ?s";
    $row = $db->getRow($sql, $email);
    2. if($result) не нужно было делать и раньше. Если база даёт сбой - это гарантированный фейл, и надо аварийно завершать работу. А не писать "что-то пошло не так" и продолжать долбить неработающую базу запросами.

    В отдельных исключительных случаях можно ловить исключение. Но именно как исключение, а не правило.

    Если работаем с голым mysqli (что не рекомендуется), перед коннектом надо написать вот это
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    и после этого ловить ошибки в error handler-е или блоке catch.

    3. Посмотрел повнимательнее. Это единственный из всех приведенных кейсов, в котором использование родных препаредов оправдано. В принципе - да, так и делать. Особо тут не ничего не придумаешь. Mysqli умеет биндить только переменные и только по ссылке. Для одноразового использования можно написать враппер, который будет биндить переменное число плейсхолдеров. Но вот для выполнения подготовленного запроса в цикле - только так. PDO же умеет биндить по значению, и позволяет немного сократить код
    foreach($array_1 as $id => $chtoto) {
        $stmt->execute([$id, $chtoto, $array_2[$i],$array_3[$i]]);
    }
    Как вариант, можно сформировать мультиинсерт опять же с помощью safeMysql:
    $ins = array();
    foreach($array_1 as $id => $chtoto) {
        $ins[] = $db->parse("(?i,?i,?i,?i)",$id, $chtoto, $array_2[$i],$array_3[$i]);
    }
    $instr = implode(",",$ins);
    $db->query("INSERT INTO `MyTable` (`a`, `b`, `c`, `d`) VALUES ?p", $instr);
    Ответ написан
    2 комментария
  • Нужен ли HTML для изучения JavaScript и PHP?

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

    Не говоря уже о столь экзотических случаях, как SQL-запрос зависит от цвета html таблицы
    Ответ написан
    Комментировать
  • Как вы учили php/mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Главное не думать, что прилетит волшебник в голубом вертолёте, стукнет своей палочкой по темечку, и с этого момента ты станешь специалистом. Освоение профессии - это процесс. Не существует человека, который выучил язык. В каждый момент времени ты будешь понимать, что не знаешь гораздо больше, чем знаешь. Ну, впрочем, это банальность, подходящая для любой области знания в принципе.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не надо хранить список имён полей в другой таблице.
    Надо прочесть хотя бы букварь по реляционным базам данных и научиться ими пользоваться по-человечески.
    Ответ написан
    7 комментариев
  • Как установить LAMP на Ubuntu?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Комментировать
  • Алгоритм чтения большого количества файлов на php

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не надо пытаться ничего реализовывать через пхп.
    Надо узнать о существовании специализированных инструментов.
    В частности, если надо заархивировать каталог с файлами, то это делается командой
    tar -czf archive.tgz /path/to/catalog
    Эта команда добавляется в крон.

    А на похапе ничего изобретать не надо
    Ответ написан
    3 комментария