Ответы пользователя по тегу PHP
  • Пустой результат mysqli_query($link,$query), где искать?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Получить информацию об ошибках при работе с MySql можно при помощи функции mysqli_error.

    printf("Errormessage: %s\n", mysqli_error($link));

    $query = "SELECT * FROM users WHERE `username`= '$username_login' LIMIT 1";

    Что будет, если убрать условие и сделать такой запрос:

    $query = "SELECT * FROM users LIMIT 1";

    Если запрос успешно выполнится, то вероятно проблема в значении переменной $username_login.

    Передавать значения из переменных прямо в текст запроса не рекомендуется. Лучше передавать через параметры, или как минимум экранировать потенциально опасные символы.

    Если результатов не будет, то необходимо проверить строку соединения и успешность соединения с базой данных. Проверить наличие ошибок при соединении можно с помощью функции mysqli_connect_error:
    $link = mysqli_connect("localhost", "имя пользователя", "пароль", "имя базы");
    
    if (!$link)
    {
        echo mysqli_connect_error();
    }
    Ответ написан
    3 комментария
  • Как сделать вывод данных не с первого значени?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    www.mysql.ru/docs/man/SELECT.html
    Выражение LIMIT может использоваться для ограничения количества строк, возвращенных командой SELECT. LIMIT принимает один или два числовых аргумента. Эти аргументы должны быть целочисленными константами. Если заданы два аргумента, то первый указывает на начало первой возвращаемой строки, а второй задает максимальное количество возвращаемых строк. При этом смещение начальной строки равно 0 (не 1):
    mysql> SELECT * FROM table LIMIT 5,10; # возвращает строки 6-15

    Если задан один аргумент, то он показывает максимальное количество возвращаемых строк:
    mysql> SELECT * FROM table LIMIT 5; # возвращает первых 5 строк


    Т.е. в вашем случае будет запрос вида:
    SELECT * FROM  `users` ORDER BY `money` DESC LIMIT 1, 2
    Ответ написан
    Комментировать
  • Как записать данных из формы в txt файл?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Использовать режим w:
    $file = fopen('mes.txt', 'w+');

    modeОписание
    'r'Открывает файл только для чтения; помещает указатель в начало файла.
    'r+'Открывает файл для чтения и записи; помещает указатель в начало файла.
    'w'Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует - пробует его создать.
    'w+' Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует - пытается его создать.
    'a' Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует - пытается его создать.
    'a+' Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует - пытается его создать.
    'x' Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст ошибку уровня E_WARNING. Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2).
    'x+' Создаёт и открывает для чтения и записи; иначе имеет то же поведение что и'x'.
    'c' Открывает файл только для записи. Если файл не существует, то он создается. Если же файл существует, то он не обрезается (в отличии от 'w'), и вызов к этой функции не вызывает ошибку (также как и в случае с 'x'). Указатель на файл будет установлен на начало файла. Это может быть полезно при желании заблокировать файл (смотри flock()) перед изменением, так как использование 'w' может обрезать файл еще до того как была получена блокировка (если вы желаете обрезать файл, можно использовать функцию ftruncate() после запроса на блокировку).
    'c+'Открывает файл для чтения и записи; иначе имеет то же поведение, что и 'c'.

    php.net/manual/ru/function.fopen.php
    Ответ написан
    1 комментарий
  • Как локализовать проект при помощи mo файлов?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Проводить локализацию проектов PHP, и тем более WordPress, силами gettext не приходилось, но на днях делал это с некоторыми bash-скриптами. Возможно мой опыт будет полезен.

    1. Необходимо определить домен и область поиска файлов сообщений.
    Домен задается функцией textdomain, а путь к ресурсам - bindtextdomain.
    bindtextdomain('example', './local');
    textdomain('example');

    2. В коде, весь локализуемый текст следует выводить через функцию gettext. Например:
    echo gettext("Hello world!");
    echo gettext("Test123");

    Можно использовать фразы, либо ключи.

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

    Если использовать ключи (например, MSG_ABOUT_TEXT1), то придется создавать ресурсы для языка по умолчанию. При отсутствии ресурсов, или если что-то сломается, пользователю будут выводиться ключи, что не очень хорошо.

    Какой подход выбрать, зависит от сложности проекта и предпочтений. Фразы проще и проблем с ними в небольших проектах точно не будет.

    3. Необходимо извлечь строки из кода и создать файлы po. Делается это при помощи набора инструментов gettext. Если ранее этим заниматься не приходилось, то скорее всего придется выполнить установку необходимых компонентов.

    Под Debian/Ubuntu установить пакет gettext можно следующей командой:

    sudo apt-get install gettext

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

    Под Windows мне не доводилось этим заниматься. Думаю, можно что-нибудь найти. Например, sourceforge.net/projects/gettext

    Я опишу только порядок действий под Linux (конкретно Debian).

    Для создания po-файла необходимо выполнить следующую команду:

    xgettext --extract-all --default-domain=example --from-code=utf-8 /путь к проекту/*.php


    Параметры:

    --default-domain - имя домена, должно соответствовать домену, который используется в коде PHP (textdomain). Не путать с доменом сайта, хотя обычно используется название проекта;
    --from-code=имя кодировки текста. Например: utf-8;
    --extract-all - указывает на необходимость извлечения всех строк.

    Дополнительно можно указать параметры:

    --output=имяФайла.po - по умолчанию строки будут извлечены в файл messages.po, этот параметр позволяет указать любое имя файла;
    --no-wrap - запрет разбития длинных строк;
    --join-existing - если есть предыдущие извлеченные строки, то эта опция указывает на необходимость склейки новых найденных строк с существующими (использовать, только если po-файл существует);
    --copyright-holder="Вася Пупкаидзе" - кому принадлежат авторские права.

    Параметр --help позволяет посмотреть список всех параметров :-)

    Программа создаст po-файл примерно следующего содержания:
    # SOME DESCRIPTIVE TITLE.
    # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
    # This file is distributed under the same license as the PACKAGE package.
    # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
    #
    #, fuzzy
    msgid ""
    msgstr ""
    "Project-Id-Version: PACKAGE VERSION\n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2016-01-15 14:55+0300\n"
    "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    "Language-Team: LANGUAGE <LL@li.org>\n"
    "Language: \n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=CHARSET\n"
    "Content-Transfer-Encoding: 8bit\n"
    
    msgid "Hello world!"
    msgstr ""
    
    msgid "Test123"
    msgstr ""


    msgid - это идентификатор сообщения.
    msgstr - перевод.

    После указания перевода и сохранения изменений в файле po:
    msgid "Hello world!"
    msgstr "Привет, мир!"
    
    msgid "Test123"
    msgstr "Тест123"

    Его необходимо компилировать в файл mo.
    Делается это при помощи команды msgfmt:
    msgfmt --output-file="/путь к файлу.mo" "/путь к файлу.po"

    Для себя я написал следующий bash-скрипт, который компилирует все файлы po в каталоге (включая все подкаталоги), в котором был запущен скрипт:
    #!/bin/bash
    
    lang="$1"
    path="$(cd "$(dirname "$0")" && pwd)"
    
    if [[ -n "$lang" ]]; then
      path="$path/$lang"
      if [[ ! -d "$path" ]]; then
        mkdir "$path"
      fi
    fi
    
    cd "$path"
    
    find "$path" -name "*.po" | while read -r f; do
      po_dir="$(dirname $f)"
      po_file="$(basename $f)"
      po_name="$(echo $po_file | cut -d'.' -f1)"
      msgfmt --output-file="$po_dir/$po_name.mo" "$f" && \
      printf "Created: $po_dir/$po_name.mo\n" || \
      printf "ERROR: Could not create mo-file from: $f\n"
    done

    Если все пройдет без эксцессов, файлы mo следует разместить по подпапкам LC_MESSAGES нужных культур, которые должны располагаться в папке указанной в коде PHP функцией bindtextdomain. Запутано вышло, проще показать :-)

    Если:
    bindtextdomain('example', './local');
    textdomain('example');

    , то структуру размещения файлов mo:
    /local/ru/LC_MESSAGES/messages.mo
    /local/en/LC_MESSAGES/messages.mo
    /local/en_US/LC_MESSAGES/messages.mo
    /local/ru_GB/LC_MESSAGES/messages.mo
    /local/[Код культуры]/LC_MESSAGES/messages.mo

    /local - часть пути, указанная в коде PHP: bindtextdomain('example', './local');
    Код культуры - это стандартный (ISO 639) двузначный код языка, или код языка с указанием кода региона (ISO 639 + ISO 3166): ru (русский язык), ru_RU (русский язык, Россия), en (английский язык), en_US (американский английский) и т.п.

    Честно говоря, я не вижу пока никаких особых преимуществ от использования gettext. Слишком сложный процесс генерирования всех этих po и mo. Проще и удобней текстовой файл с нужными ресурсами создать, или использовать базу. Хотя работу с gettext можно автоматизировать, но придется потратить на это время.
    Ответ написан
    Комментировать
  • Вчера работал jQuery, cегодня нет. Поможете разобраться?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Дело в коде, размещенного в переменной $js:
    $(document).ready(function(){
      $(".debug_loginbutton").click(function(){
        $("#div_debug_loginbutton").css("display": "none");
        $("#a_load").css("display": "block");
        $("#content").load("ajax/login");
      })
    })

    Неправильный разделитель:
    $("#div_debug_loginbutton").css("display": "none");
    $("#a_load").css("display": "block");

    Запятая должна быть:

    $("#div_debug_loginbutton").css("display", "none");
    $("#a_load").css("display", "block");

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

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

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Таблицы для реализации "подчеркивания" и моноширинный шрифт (фиксированной ширины) для подставляемого текста.

    За счет фиксированного размера текста можно будет без проблем рассчитать максимальное число символов в строке и разбить по строкам.
    Ответ написан
    Комментировать
  • Как обрезать значения в многомерном массиве?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Подозреваю, что нужна рекурсия.

    Примерный алгоритм может быть таким:
    function Circumcision($arr, $size) // :-)
    {
      $arr = array_slice($arr, 0, $size);
      foreach($arr as $item)
      {
         if(is_array($item))
         {
            $item = Circumcision($item, 1); // привык к ооп, если что я не виноват :)
         }
      }
      return $arr;
    }
    
    $input = array("a", "b", "c");
    $result = Circumcision($input, 1);

    Давно не программирую на PHP, мог забыть нюансы и не уверен, что код заработает. Но идея, думаю, должна быть понятна.
    Ответ написан
    Комментировать
  • Как закрывается код известных cms?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Силой слова - лицензионным соглашением :)

    Обфускация немного ограничит возможности по незаконному использованию.
    Ответ написан
    7 комментариев
  • Как вывести символы запрещенные в регулярном выражении?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Если я правильно понял вопрос, то можно заменить на пустоту символы, которые подходят под шаблон. А те что останется и будут "запрещенными символами".

    if (preg_match('/^[a-zA-Z\p{Cyrillic}\d\_\-]+$/u', $str) === 0) {
        echo "Некоторые символы не смогли пройти испытание: ".preg_replace('/^[a-zA-Z\p{Cyrillic}\d\_\-]+$/u', '', $str); 
       // по шаблону, не уверен, возможно потребуется убрать границы: ^ и $
    }
    Ответ написан
    2 комментария
  • В чем польза изучения PHP сегодня?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    А как же Великая и ужасная (технология) ASP .NET? Почему нет в списке? ;-)

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

    Я бы рекомендовал сделать акцент на ООП.
    PHP может быть объектно-ориентированным, но может и не быть, если лень или недостаточно знаний.

    Если говорить об ASP .NET, то тут без ООП не обойтись. Хочешь не хочешь, придется работать с объектами/классами и прочими сопутствующими вещами.

    ASP .NET позволяет программировать на Visual Basic .NET и C#. Изучив один из этих языков можно будет создавать приложения для Windows и Windows Phone, всякие библиотеки и компоненты. В общем, много чего можно будет делать.

    Сложные и большие проекты делать в ASP .NET проще, чем на PHP (мне доводилось работать и с тем и другим). Раньше у PHP было преимущество в доступности и дешевизне. Сейчас такого преимущества нет. Технология .NET за поседение годы стала доступней. Сервера и хостинг под Windows по стоимости не уступает Linux. Основная среда разработки под .NET - Visual Studio потихоньку становится совсем бесплатной, былые ограничения постепенно уходят в историю, хотя даже с ограничениями многое можно реализовывать гораздо быстрее и проще.

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