Задать вопрос
  • Как получить значение атрибута элемента XML который нужно так же найти по атрибуту?

    GomelHawk
    @GomelHawk
    PHP / Symfony developer
    Можно использовать SimpleXML (он нередко уже идет в зависимостях)

    Инициализация:
    $xml = new SimpleXmlElement('<ElementList> ... </ElementList>');


    Поиск искомого элемента (берем первый попавшийся):
    $element = $xml->xpath('Element[@Name="TRF_CL_BASE"]')[0];


    Значение (можно заменить на int, если нужно использовать как целочисленное значение):
    $value = (string) $element['Value'];
    Ответ написан
    Комментировать
  • Как получать первые буквы Фамилии Имени и Отчества?

    slo_nik
    @slo_nik Куратор тега PHP
    Добрый вечер.
    // Результат работы "В"
    echo mb_substr("Вася", 0, 1);
    Ответ написан
    3 комментария
  • Как удалить каталог через время?

    @andreysuha
    Что то знаю
    Да, нужно написать скрипт удаления и запускать его по крону
    Ответ написан
    4 комментария
  • Нужен ли класс в этом случае? Или можно держать функцию особняком?

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

    Кроме того, авторы видеокурсов в большинстве своем - неграмотные имбецилы, которые с трудом понимают код, который пишут. Кроме шуток. Пример. Вот так пишут обезьяны:
    $i = 0;
        $newsList = array();
        while($row = $result->fetch()) {
          $newsList[$i]['id'] = $row['id'];
          $newsList[$i]['title'] = $row['title'];
          $newsList[$i]['date'] = $row['date'];
          $newsList[$i]['author_name'] = $row['author_name'];
          $newsList[$i]['short_content'] = $row['short_content'];
          $i++;
        }
        return $newsList;

    Реально, макаки.
    Этот гамадрил где-то сам увидел обучающий материал из 1990-х годов прошлого века, запомнил его, и теперь лепит уже в свои "обучающие ведидео".
    при том что если бы он понимал смысл этого кода, то написал бы просто
    $newsList = array();
        while($row = $result->fetch()) {
          $newsList[] = $row;
        }
        return $newsList;

    Поскольку $row уже содержит все нужные данные и переливать их из пустого в порожнее не нужно.
    А если бы наш бабуин хотя бы раз в жизни поинтересовался инструментами, которые он использует, то написал бы и вовсе одну строчку,

    return $result->fetchAll();

    Поскольку все уже написано до нас - надо только руку протянуть и использовать готовое.

    И это я не говорю о том, что класс насковозь дырявый в плане безопасности.

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

    В нормальной же модели класс нужен, поскольку в ней будут использоваться переменные класса, например соединение с БД. Таким образом его можно будет передать в конструктор один раз и не писать соединение в каждом методе.
    Также в модели удобно прописать имя таблицы. Тогда множество методов можно будет унаследовать от единого прототипа. например

    abstract class Model {
        protected $table;
        protected $db;
        public function __construct($db) {
             $this->db = $db;
        }
        public function find($id) {
            $sql = "SELECT * FROM `$this->table` WHERE id=?";
            $stmt = $this->db->prepare($sql);
            $stmt->execute([$id]);
            return $stmt->fetch();
        }
    }
    class News extends Model {
            protected $table = 'news';
    }
    $news = new News($db);
    $article = $news->find($id);


    Вот это уже будет минимальное оопэ, и использование класса будет более чем оправдано - один раз написали код, а потом его используем.

    Если хочется нормальных обучающих материалов, рекомендую канал Дмитрия Елисеева, https://www.youtube.com/user/ElisDN/videos
    Ответ написан
  • Как правильно подключать файлы сайта?

    В начальном файле вы можете создать константу, на "корень сайта".
    То есть в файле index.php добавляете

    <?php
        /**
         * Указываем начальную точку от куда,
         * будем тянуть все файлы в последующем.
         * Также для проверки как запущен наш файл, 
         * напрямую из браузера или подключен из главного скрипта.
         */
        define('BASEPATH', __DIR__);
    
        // подключаете нужные файлы header, content, footer
        require_once "partials/header.php";
    
        // в подключенных файлах используйте такой способ.
        // например в файле partials/header.php
        // require_once BASEPATH . "partials/menu.php";


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

    <?php if (!defined('BASEPATH')) exit('Прямой доступ к файлу запрещен...');
    // ... ваш код файла partials/header.php, partials/menu.php и т.д. ...
    Ответ написан
    1 комментарий
  • Почему при добавлении элемента в массив он перезаписывает предыдущий элемент, а не добавляет новый?

    0xD34F
    @0xD34F
    Странный вопрос. Что в коде написали - то и происходит. Нет у вас там никакого добавления в массив. Если хотите, чтобы text был массивом, тогда делайте так:

    $keyboard['keyboard'][$i]['text'][] = $buttons[$i];
    Ответ написан
    Комментировать
  • Как просматривать камеры тех, кто находится на сайте?

    maaGames
    @maaGames
    Погроммирую программы
    Индусский вирус :)
    Включите веб-камеру, поонанируйте перед камерой, отошлите видео по адресу ****, а теперь переведите 1000 долларов биткойнами, а то пошлю это видео вашим коллегам.
    Ответ написан
    Комментировать
  • Как вывести самый последний id из таблицы sql с помощью red bean php?

    DARKENN
    @DARKENN Автор вопроса
    $last = R::findLast('table_name');
    echo $last->id;
    Ответ написан
    Комментировать
  • Как проверить в php результат запроса?

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

    Проверять надо не карман, а деньги. Не результат запроса, а строки, которые он вернул. То есть надо просто сделать фетч и вот уже результат фетча проверять в условии. То есть if ($post)

    Ну и как всегда надо напомнить, что переменные никогда не пихают в запрос напрямую, а передают отдельно. Готовый код можно посмотреть здесь, https://phpdelusions.net/mysqli/check_value
    Ответ написан
    Комментировать
  • Как проверить в php результат запроса?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    if (!empty($id)) {
      header('Location:nt.php?id='.$id.'');
    }
    else {
      header('Location:index.php?error');
    }
    Ответ написан
    1 комментарий
  • Как отображать различное содержимое в зависимости от домена?

    @noeer
    if($_SERVER['SERVER_NAME'] === 'site.ru'){
    	// счетчик для site.ru
    }elseif($_SERVER['SERVER_NAME'] === 'site.com'){
    	// счетчик для site.com
    }
    Ответ написан
    1 комментарий
  • Как отображать различное содержимое в зависимости от домена?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Смотрите сами:
    echo($_SERVER['SERVER_NAME']);
    Ответ написан
    Комментировать
  • Подключение к базе данных MySql, как правильно и современно?

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

    А вот вопрос, как правильно подключаться в двух оставшихся вариантах, действительно важный, и ответ на него, как обычно, почти никто не знает, поскольку все друг у друга списывают статьи не 2-х, а 22-х летней давности. К счастью, есть сайты с актуальной информацией.

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

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

    Но правильным ответом, если выбирать из перечисленных трех, будет PDO. Здесь тоже не так просто, поэтому смотрим как правильно соединяться используя PDO - учитывая те же ключевые моменты, которые указаны выше.

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

    Пароль в базе данных не шифруется а хэшируется. Делается это с посощью функции password_hash
    Ответ написан
    3 комментария
  • Можно ли спарсить Json с не экранированными кавычками?

    TommyV888
    @TommyV888 Куратор тега PHP
    -
    Можно регулярным выражением заменить кавычки, но отталкиваться придется от символов json синтаксиса, а значит если они будут в тексте, то будут ошибки. Этот способ подойдет только если вы уверены что там просто текст, или вас устраивает тот процент ошибок, что вы получите.
    Ответ написан
    Комментировать
  • Почему не работает цикл в PHP?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Каждая форма работает отдельно. Объедините их в одну - и будут у вас одновременно доступны и $_POST['ans'], и $_FILES['file'].
    Ответ написан
    Комментировать
  • Почему не работает цикл в PHP?

    irishmann
    @irishmann
    Научись пользоваться дебаггером
    Ошибка с формами, радио кнопки у вас на одной форме, а отправляете файл вы совсем через другую спс. тов. Дмитрий
    code
    <form action="functions.php" method="post">
      A4 <input type="radio" name="ans" value="ans1">
      A3 <input type="radio" name="ans" value="ans2"  /><br />
    </form>
      
        <form method="post" enctype="multipart/form-data">
          <input type="file" name="file">
          <input type="submit" value="Datei herunterladen!">
        </form>



    Надо сделать так примерно
    code
    <form action="#" method="post" enctype="multipart/form-data">
                A4 <input required type="radio" name="ans" value="ans1">
                A3 <input type="radio" name="ans" value="ans2">
                <input type="file" name="file">
                <input type="submit" value="Загрузить">
            </form>


    Проверяете условие, а потом объявляете переменную, естественно у вас условие не выполняется.
    code
    if ($answer == "ans1") {
    $answer = $_POST['ans'];

    Надо сначала объявлять переменную, потом уж делать с ней что душе угодно. Но именно в данном случае в объявлении функции она не к месту. См. след. пункт.
    code
    $answer = $_POST['ans'];  	
    if ($answer == "ans1") {

    Как заметил Дмитрий так функции нельзя объявлять
    code
    if ($answer == "ans1") {
    $answer = $_POST['ans'];  	
         function make_upload($file){	
      // формируем уникальное имя картинки: случайное число и name
      $name = mt_rand(0, 10000) . $file['name'];
      copy($file['tmp_name'], 'Folder_A4_SW_EIN/' . $name); //ПАПКА ДОК
       return true;    
       }
    }else{
        function make_upload($file){	
      // формируем уникальное имя картинки: случайное число и name
      $name = mt_rand(0, 10000) . $file['name'];
      copy($file['tmp_name'], 'img7/' . $name); //ПАПКА, КУДИ ПАДАЮТЬ ДОКУМЕНТИ
      }      
    }


    Вынесите название в отдельный аргумент
    code
    function make_upload($file, $folder)
    {    
        // формируем путь + уникальное имя картинки
        $name = $folder . DIRECTORY_SEPARATOR . uniqid(true) . $file['name'];
        copy($file['tmp_name'], $name);
        return true;    
    }
    UPD: рабочий г-но код
    <?php
        include_once('functions.php')
    ?>
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>Загрузить изображения на сервер</title>
        </head>
        <body>
            <form action="#" method="post" enctype="multipart/form-data">
                A4 <input required type="radio" name="ans" value="ans1">
                A3 <input type="radio" name="ans" value="ans2">
                <input type="file" name="file">
                <input type="submit" value="Загрузить">
            </form>
            <?php
            // если была произведена отправка формы
                if(isset($_FILES['file']))
                {
                    // проверяем, можно ли загружать изображение
                    $check = can_upload($_FILES['file']);
    
                    if($check === true)
                    {
                        $folder = $_POST['ans'] == 'ans1' ? 'Folder_A4_SW_EIN' : 'img7';
                        make_upload($_FILES['file'], $folder); // загружаем изображение на сервер
                        echo "<strong>Файл был успешно загружен!</strong>";
                    }
                    else
                    {
                        // выводим сообщение об ошибке
                        echo "<strong>$check</strong>";  
                    }
                }
            ?>
        </body>
    </html>

    <?php
        function can_upload($file)
        {
            // если имя пустое, значит файл не выбран
            if($file['name'] == '')
            return 'Вы не выбрали файл.';
    
            /* если размер файла 0, значит его не пропустили настройки 
            сервера из-за того, что он слишком большой */
            if($file['size'] == 0)
            return 'Файл слишком большой.';
    
            // разбиваем имя файла по точке и получаем массив
            $getMime = explode('.', $file['name']);
            
            // нас интересует последний элемент массива - расширение
            $mime = strtolower(end($getMime));
            
            // объявим массив допустимых расширений
            $types = array('jpg', 'png', 'gif', 'bmp', 'jpeg', 'pdf', 'ppt', 'ods', 'dotx', 'docx', 'doc');
    
            // если расширение не входит в список допустимых - return
            if(!in_array($mime, $types))
            return 'Недопустимый тип файла.';
    
            return true;
        }
    
        function make_upload($file, $folder)
        {    
            // формируем путь + уникальное имя картинки
            $name = $folder . DIRECTORY_SEPARATOR . uniqid(true) . $file['name'];
            copy($file['tmp_name'], $name);
            return true;    
        }

    Ответ написан
    3 комментария
  • Как можно бороться с кодом элемента?

    @noeer
    Проверять данные от пользователя на серверной стороне.
    Как же еще... Это классика.
    Ответ написан
    Комментировать
  • Как повернуть див на 90 градусов?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    transform: rotate(90deg); контейнеру
    Ответ написан
    Комментировать
  • Как удалить из TXT файла, строчки где нет символа "@" используя PHP?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Для решения твоей задачи, тебе необходимо считать файл в переменную. Сделать это можно разными способами, но наиболее уместные тут, это: file и file_get_contents.

    Далее в случае с file_get_contents тебе надо или использовать регулярные выражения, для замены строк с помощью функции preg_replace и модификатором m в регулярном выражении, тем самым выполнить первую часть твоей задачи. Либо разбить полученный текст на строки с помощью функции explode по символу перевода строки. В результате получишь массив строк.

    В случае когда у тебя есть массив строк, тебе надо пройтись по нему и проанализировать строки на предмет вхождения подстроки. Заводишь новый массив, куда будешь складывать строки. Итерация делается с помощью for, foreach или while. Поиск подстрок делается с помощью функции strpos или mb_strpos. Соответственно если нет символа @, добавляешь строки в новый массив, если нет, то нет.

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

    После того, как ты это сделаешь, тебе нужно будет склеить строчки обратно в текст, для этого используй функцию implode. Записать полученный текст в файл, тебе поможет функция file_put_contents
    Ответ написан
    1 комментарий