Ответы пользователя по тегу PHP
  • Как использовать функции другого файла в PHP?

    @MadridianFox
    Web-программист, многостаночник
    Если у вас нет классов, то без include никак.
    Но даже когда у вас функции являются методами классов, и настроена автозагрузка, то include тоже делается, только неявно.
    Поэтому совсем без include никак не получается.
    Ответ написан
    Комментировать
  • Почему выводит только 1 запись?

    @MadridianFox
    Web-программист, многостаночник
    mysqli_fetch_assoc возвращает одну строку результата запроса в виде ассоциативного массива.
    При следующем вызове этой функции она вернёт следующую строку результата запроса.
    В случае если в результате закончились строки, функция вернёт false;
    В итоге надо вызывать эту функцию в цикле.
    $query_result  = mysqli_query($sqlConnect, "select ...");
    while($row = mysqli_fetch_assoc($query_result)){
        //...
    }
    Ответ написан
  • В чем проблема вроде как и php настроил?

    @MadridianFox
    Web-программист, многостаночник
    Сессию стартовать надо до печати любого текста.
    Об этом и текст варнинга - headers alredy send.
    При старте сессии сервер отсылает клиенту куки с идентификатором сессии. Куки передаются в заголовках. Заголовки можно посылать только перед посылкой тела ответа. Любой echo начинает отправлять тело ответа, и заголовки уже отправлять нельзя.

    Ну а самый первый варнинг - устаревший способ обозначения конструктора. Люди, очнитесь, php 5 уже лет десять как вышел! Надо использовать __construct()
    Ответ написан
  • PHP постоянный обмен при исполнении кода?

    @MadridianFox
    Web-программист, многостаночник
    отправили пост запрос через js он вернул результат только 1 раз

    Это естественно. Протокол HTTP именно так и устроен: запрос - ответ. Причём ответ сначала вычисляется, а затем отправляется клиенту.
    у меня работает foreach в php и при каждом завершении цикла я хочу получать результат

    Как уже написано выше - сначала код полностью отрабатывает, а потом результат отправляется клиенту. Вы не можете отправить клиенту данные и продолжить работу используя HTTP.
    или есть какой то обработчик получения return ?

    Нет.

    В итоге остаётся всего несколько решений.
    1) WebSocket
    2) Server Sent Events
    3) Comet

    Однако. Все эти решения требуют глубокой переработки вашего приложения, и просто добавить кусочек кода в имеющийся цикл не получится.
    Ответ написан
  • Как объединить 2 строки в одну?

    @MadridianFox
    Web-программист, многостаночник
    Если вы хотите возвращать из функции несколько значений, используйте массив.
    function banana(){
        $first = "first";
        $second = "second";
        return [$first, $second];
    }

    Для получения такого результата удобно использовать функцию list
    list($first, $second) = banana();
    echo $first;
    echo $second;
    Ответ написан
  • AJAX + PHP постепенный вывод результатов?

    @MadridianFox
    Web-программист, многостаночник
    Скорее не первый $info, а последний, т.к. вы в цикле перезаписываете переменную.
    Возможно вы хотели написать
    public function start ($message) {
        $info=[];
        foreach ($user as $user){ 
            $status = $op->post($message,$user,$us);
            if($status == false){ 
                $info[] = "error"; 
            }else{
                $info[] = "ok";
            }
        }
        return $info;    
    }
    Ответ написан
    4 комментария
  • Как передать значение Label в обработчик формы?

    @MadridianFox
    Web-программист, многостаночник
    Делайте скрытое поле, которое будет содержать текст из label.
    Ответ написан
    2 комментария
  • Есть ли способы удобно обработать несколько десятков вариантов формирования sql запроса?

    @MadridianFox
    Web-программист, многостаночник
    В простейшем случае сформировать условие из набора параметров можно вот так:
    $params = [
        'param1'=>'value 1',
        'param2'=>'value 2'
    ];
    $where_str="";
    if(!empty($params)){
        $where = [];
        foreach($params as $param=>$value){
            $where[]="$param = '$value'";
        }
        $where_str = " WHERE ".join(" AND ", $where);
    }
    $sql = "select * from table".$where_str;

    Этот код довольно условный - тут нет защиты от sql инъекций, он не привязан к расширению для работы с БД. Но в целом так работает большинство генераторов запросов.
    Ответ написан
    Комментировать
  • Как правильно распарсить строку?

    @MadridianFox
    Web-программист, многостаночник
    Разбиваем правило по слешу, проходимся по полученному массиву и строим регулярку.
    Если элемент массива начинается с двоеточия - добавляем в регулярку ([a-zA-Z]+), иначе добавляем сам элемент. Ктати, надо запоминать что :app - в нулевой позиции, а :action - в первой.
    В итоге получаем /\/emergency\/([a-zA-Z]+)\/([a-zA-Z]+)/. Если строка проходит поиск по этой регулярке - то мы нашли что искали. Остаётся только взять найденные регуляркой значения и передать их в контроллер, не забыв присвоить им имена - не зря же мы запоминали в какой позиции стоят плейсхолдеры.
    Ответ написан
  • Что не так с запросом?

    @MadridianFox
    Web-программист, многостаночник
    Если вы создаёте кучу одинаковых таблиц с разными названиями - то у вас проблемы не с запросом как таковым, а с подходом к работе с БД.
    Что мешает создать одну таблицу, в которой дополнительно будет поле user?
    Ну и подобным образом вставлять данные в запрос тоже нехорошо. Любой пользователь может послать в POST вместо названия таблицы кусок sql кода, который либо удалит всю базу, либо позволит увидеть конфиденциальные данные.
    Ответ написан
    Комментировать
  • Как сделать на сайте поиск по товарам с учетом геолокации?

    @MadridianFox
    Web-программист, многостаночник
    В некоторых СУБД есть функция для расчёта расстояния на сфере по координатам.
    Соответственно необходимо для каждого города продавца знать координаты - широту и долготу, а так же определять координаты пользователя.
    Запрос в таком случае будет выглядеть примерно так:
    select * from table where geo_length(table.x, table.y, '<x пользователя>', 'y пользователя') < 100

    Название функции зависит от СУБД.
    Ответ написан
    Комментировать
  • Как перевести нумерованный массив в ассоциативный?

    @MadridianFox
    Web-программист, многостаночник
    Как уже сказал Роман, в php массивы изначально являются ассоциативными и по сути являются хеш-таблицами.
    Таким образом массив без ключей, на самом деле является ассоциативным массивом, где в качестве ключей используются числа.
    Ответ написан
    Комментировать
  • Как составить PHP7 Dockerfile с intl и ICU версии 55.1?

    @MadridianFox
    Web-программист, многостаночник
    Необходимо найти репозиторий для используемого дистрибутива с нужной версией ПО, и прописать его в /etc/apt/sources.list
    Ну и в дальнейшем устанавливать необходимый пакет с указанием версии.
    Ответ написан
  • Не получается удалить записи из таблицы!?

    @MadridianFox
    Web-программист, многостаночник
    Нужно сначала удалять связи комментариев и категорий а только потом удалять саму категорию.
    Иначе получается что вы удалили категорию, а в другой таблице остался её id. СУБД этого не допускает и выдаёт ошибку.
    Ответ написан
    5 комментариев
  • В чем разница между namespace и use? И как они связаны с файловой системой?

    @MadridianFox
    Web-программист, многостаночник
    На уровне языка пространства имён с файловой системой никак не связаны.
    Пространства имён - лишь способ решить конфликты имён классов.
    Вот ты говоришь - у меня есть класс ClassName, но к сожалению, такой класс уже есть в одной из библиотек, которые ты используешь. Можно было бы назвать класс MyClassName, ну и везде добавлять приставку My. Редко, но бывает что надо сделать два класса с одинаковым именем в одном проекте. Тогда ты называешь один класс MyBananaSybsystemClassName, а другой MyAnanasSubsystemClassName - тем самым обозначая разницу в названии.
    И даже это не спасёт от простого совпадения.

    И тут на помощь приходят пространства имён.
    В начале файла в котором лежат классы (лучше один класс в одном файле) пишется название пространсва имён, вот так:
    namespace banana;
    И теперь все классы, объявленные в этом пространстве имён имеют название banana\ClassName, хотя внутри этого файлв ты можешь по прежнему обращаться к ним просто по ClassName.
    В другом файле надо использовать полное название, вроде как:
    $obj = new banana\ClassName();
    но, если надо много раз писать название класса можно сделать вот так:
    use banana\ClassName;
    $obj = new ClassName();

    , но самое полезное здесь это разрешение конфликтов. Если вдруг в другом месте определён такой же ClassName, то можно просто переименовать его:
    use banana\ClassName;
    use ananas\ClassName as AnanasClass;
    $obj1 = new ClassName();
    $obj2 = new AnanasClass();


    Вот это и есть суть пространства имён. Таковы они во всех языках программирования в которых они есть.
    Но есть от них ещё одна польза - можно настроить автоматическое подключение unclude(); файла с классом.
    Делается это с помощью определения функции автозагрузки
    function __autoload($classname){
    // как-то по имени класса находим файл и подключаем
    }
    // или, лучше
    spl_autoload_register(function ($classname) {
       // как-то по имени класса находим файл и подключаем
    });


    Каждый раз, когда ты обращаешься к классу и php не может его найти в подключенных файлах - запускается код написанный в функции автозагрузки. В эту функцию передаётся название класса.
    При чём же тут пространства имён? А при том, что в функцию автозагрузки передаётся полное имя класса с пространтсвом имён.
    Это значит что ты можешь делать по одному файлу на класс, класть их в папки, а в пространство имён в каждом файле писать путь до этого файла.
    После этого пишешь функцию, которая просто заменяет в названии класса слеши на те, что поддерживаются операционной системой как разделители пути, и просто подключаешь файл.
    Именно об этом и написано в каком-то там PSR
    Ответ написан
    2 комментария
  • Как сортировать ключи массива php по алфавиту и длине?

    @MadridianFox
    Web-программист, многостаночник
    Не изобретайте велосипед.
    Возьмите какую-нибудь реализацию стемминга на php и сделайте вот такую матрицу:
    $words = [
        "слово"=>["кол-во вхождений", "корень", "длинна слова"],
        ...
    ];

    где "корень" - это результат работы стемминг-функции над словом. Такие слова как Бык и Быки будут преобразованы к слову Бык.
    Далее эту матрицу сортируем во всем столбцам в том порядке в котором они указаны - по вхождениям, по корню, по длине. Таким образом, одинаково встречающиеся слова отсортированные по корню будут в алфавитном порядке, но когда корни одинаковые - будет играть роль их длинна.
    Ответ написан
    Комментировать
  • Как через xpath добраться до середины текста на php?

    @MadridianFox
    Web-программист, многостаночник
    XPath - способ добраться до элемента, но не редактирования DOM.
    Ответ написан
    Комментировать
  • Как сменить версию php на xampp в ubuntu?

    @MadridianFox
    Web-программист, многостаночник
    Проблема всяких *AMP сборок в том что человек привыкает не "держать в руках" конфигурацию. Ну и ещё некоторые сборки грешат тем, что изменяют расположение конфигурационных файлов.
    Сейчас Вы вроде уже нашли решение, но в целом надо взять, потратить день и научиться всё ставить самостоятельно, тогда и проблемы смены версии не будет.
    В идеале надо потратить ещё день, и научиться работать с docker, т.к. проектов много, а ОСь одна, и постоянно менять на ней версии ПО не очень удобно.
    Ответ написан
    Комментировать
  • Как писать код сворачивать его фрагменты в NetBeans?

    @MadridianFox
    Web-программист, многостаночник
    Если у вас есть огромная простыня кода, которая не содержит "естественных" регионов которые можно скрыть, то значит что-то с вашим кодом не так.
    Лучшие практики всех популярных языков программирования говорят о том что тело функции должно помещаться на экране, а иногда и вообще быть не больше 10-15 строк.
    Бывают случаи когда большие куски кода оправданы, но если у вас они встречаются так часто что необходим способ их сворачивания...
    Ответ написан
    Комментировать
  • Как перечислить значения в условии?

    @MadridianFox
    Web-программист, многостаночник
    if(in_array($chislo,['1','2','3'])){}
    Ответ написан
    Комментировать