Ответы пользователя по тегу PHP
  • Правильный запрос к MySQL?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Страшный конечно запрос. Не делайте так никогда, используйте PDO и биндинги.
    Покажите структуру таблицы, тип и кодировку поля url, набор данных для примера и содержимое $url
    Ответ написан
  • Как отправить форму игнорирую пустое поле?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    <?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
    	if (!empty($_POST['formData'])) {
    		$formData = $_POST['formData'];
    	}else{
    		$formData = 'Без темы';
    	}
    	$to = "kna4er76@gmail.com"; /*Адрес, на который должно приходить письмо*/
    	$sendfrom = "tenderklass@yandex.ru"; /*Адрес, с которого будет приходить письмо*/
    	$headers = "From: " . strip_tags($sendfrom) . "\r\n";
    	$headers .= "Reply-To: ". strip_tags($sendfrom) . "\r\n";
    	$headers .= "MIME-Version: 1.0\r\n";
    	$headers .= "Content-Type: text/html;charset=utf-8 \r\n";
    	$subject = "Заявка с сайта Тендерный отдел";
    	$message = "Тема: $formData \n \n ";
    	if (!empty($_POST['name'])) {
    		$message .= "Имя: ". htmlspecialchars($_POST['name'])." \n \n";
    	}
    	if (!empty($_POST['phone'])) {
    		$message .= "Телефон: ". htmlspecialchars($_POST['phone'])." \n \n ";
    	}
    	if (!empty($_POST['day'])) {
    		$message .= "Срок аренды: ". htmlspecialchars($_POST['day'])." \n \n ";
    	}
    	if (!empty($_POST['avto'])) {
    		$message .= "Автомобиль ". htmlspecialchars($_POST['avto'])." \n \n ";
    	}
    	if (!empty($_POST['option_dop1'])) {
    		$message .= "Дополнительные опции: ". htmlspecialchars($_POST['option_dop1'])." \n \n ";
    	}
    	if (!empty($_POST['option_dop2'])) {
    		$message .= "Дополнительные опции: ". htmlspecialchars($_POST['option_dop2'])." \n \n ";
    	}
    	if (!empty($_POST['option_dop3'])) {
    		$message .= "Дополнительные опции: ". htmlspecialchars($_POST['option_dop3'])." \n \n ";
    	}
    
    	if (!empty($_POST['data_do'])) {
    		$message .= "Дата начала аренды: ". htmlspecialchars($_POST['data_do'])." \n \n ";
    	}
    	if (!empty($_POST['data_po'])) {
    		$message .= "Дата окончания аренды: ". htmlspecialchars($_POST['data_po'])." \n \n ";
    	}
    	if (!empty($_POST['mesto'])) {
    		$message .= "Откуда хотите забрать автомобиль?: ". htmlspecialchars($_POST['mesto'])." \n \n ";
    	}
    	if (!empty($_POST['address'])) {
    		$message .= "Откуда хотите забрать автомобиль?(Адрес): ". htmlspecialchars($_POST['address'])." \n \n ";
    	}
    	if (!empty($_POST['mesto_s'])) {
    		$message .= "Где хотите сдать автомобиль?: ". htmlspecialchars($_POST['mesto_s'])." \n \n ";
    	}
    	if (!empty($_POST['address_s'])) {
    		$message .= "Где хотите сдать автомобиль?(Адрес): ". htmlspecialchars($_POST['address_s'])." \n \n ";
    	}
    
    	$message .= 'Заявка пришла со страницы: ' . $_SERVER["HTTP_REFERER"]; 
    
    	if (mail($to, $subject, $message, $headers)) {
    		echo 'Отправлено';
    	} else {
    		echo 'Ошибка. Сообщение не отправлено!';
    	}
    } else {
    	http_response_code(403);
    	echo "Попробуйте еще раз";
    }
    ?>
    Ответ написан
    Комментировать
  • Должен ли я при использовании какого-либо популярного фреймворка обрабатывать $_POST и $_GET данные функцией htmlspecialchars (или подобными)?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    При выводе записей из бд нужно делать экранирование от xss самому. Курите доки по вашему шаблонизатору и классам экранирования в фреймворке.
    Ответ написан
    Комментировать
  • Как уменьшить нагрузку при использовании foreach для считывания БД?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Пагинация это вечный гемор. Offset на больших объёмах будет жестко тормозить, а если еще и нагрузка большая по запросам то совсем беда.
    Такие пагинации в открытый мир лучше не выпускать, я обычно это использую в админке, или лк пользователя, в общем в местах где нагрузка около нуля.
    Для всех остальных случаев я бы советовал курить пагинацию на основе первичных ключей, сначала будет больно все это писать, но потом приятно ;)

    Тут очень хорошо про это расписано
    Ответ написан
  • Как делать и как работает шифрование сообщений PHP MySQL?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Не нужно вам шифрование между php и mysql, зачем тратить такты CPU в пустую. Если залезут на сервер то дампнут и бд и ключи ваши, которые наверняка будут в конфигах лежать. Лучше займитесь базовой безопасностью окружения. На внешних портах ничего кроме веб сервера (еще ssh и возможно dhcp в "облаках") висеть не должно, отключите в ssh аутентификацию по паролю, сделайте ssh ключ под паролем надежным, проведите аудит своего приложения, в первую очередь на предмет sqlinj, используйте PDO ну или ORM, upload файлов извне только по белым спискам и только в изолированный virtualhost с отключенным php, только для статики (в идеале - отдельный сервер). Регулярно обновляйте ПО на сервере. Бэкапы - ваши друзья в горе и радости.

    Это только самое элементарное.
    Ответ написан
    Комментировать
  • Почему file_put_contents не работает после вызова классов?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    use modules\database\connection;
    // Было тут
    $CONNECT = new Connection;
    
    file_put_contents($_SERVER['DOCUMENT_ROOT'].'/vasa.txt' , 'тут был вася');
    Ответ написан
    3 комментария
  • Почему передается неверный mimetype при отправке файла средствами php?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    $data = array('files' => '@' . $tempFile);
      curl_setopt($request, CURLOPT_POSTFIELDS, $data);

    Разве не deprecated 100 лет в обед?

    Попробуйте так
    function sendFile($file, $server) {
      $request = curl_init($server);
    
      $tempFile = $_SERVER['DOCUMENT_ROOT'] . '/temp/' . $file['name'][0]; 
      move_uploaded_file($file['tmp_name'][0], $tempFile); 
      //http://php.net/manual/en/class.curlfile.php
      $file_data = new CurlFile($tempFile);
      //http://php.net/manual/ru/function.mime-content-type.php
      $file_data->setMimeType(mime_content_type($tempFile));
      curl_setopt($request, CURLOPT_POST, 1);
      curl_setopt($request, CURLOPT_POSTFIELDS, ['files' =>  $file_data]);
    
      curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
      $res = curl_exec($request);
    
      curl_close($request);
    
      return $res;
    }
    
    sendFile($_FILES['files'], $server);


    Ну и не хватает проверки пары extension=>mime по белым спискам.
    Ответ написан
  • Что лучше для LIVE сайта: php или node.js?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Зависит от требований и вашего опыта в стеке. Не имея опыта с node.js после php вы там лапшу сделаете которая будет работать через раз при малейших нагрузках.
    Опишите проект более подробно, что за игра в плане сетевого кода.

    Если вы делаете на подобии сайтов-рулеток стимовских, где от реалтайма нужна только рассылка сообщений по каналам от бекенда, то вам и php хватит. См в сторону rachet или такой классной штуки как centrifugo.
    Ответ написан
    Комментировать
  • Как удалить выбранный файл с сервера?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Если вы принимаете имя удаляемого файла из внешнего мира - вопрос валидации должен стоять на первом месте. Как минимум это так:
    if (!empty($_POST['name'])) {
      $name = basename($_POST['name']); //иначе беды огребете. 
      $file_path = $_SERVER['DOCUMENT_ROOT'].'/project/html/'.$name;
      if (is_file($file_path)) {
         @unlink($file_path);
      }
    }


    По поводу самого алгоритма - все в топку, у вас по 1 форме на каждую запись с одинаковыми айдишниками, браузер с ума сходит, делайте rest, храните в базе физическое имя файла, из внешнего мира получайте только id файла, все остальное должно быть blackbox.

    Допустим:
    <? foreach ($nnn as $row) {
        $v=$row['id'];
        $n=$row['filename'];
        ?>
                    <div class="admph">
                        <?php
                        echo "$row[filename]";
                        ?>
                        <button type="button" onclick="deleteRecord(<?=$v?>); return false;">Удалить</button>
                    </div>
                    <?php
    }


    <script>
    function deleteRecord(id) {
       console.log(id);
       //Тут уже ajax post на action удаления, параметр del со значением id
    }
    </script>
    Ответ написан
    Комментировать
  • Почему идёт разный ответ апи?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    curl_setopt($ch, CURLOPT_urlERER, $url); //Это чего такое?

    Судя по тому что валятся и curl и file_get_contents у вас к php не подключена OpenSSL. А для курла не настроен корневой сертификат.
    Пробуйте так. Смотрите какую ошибку курл выдаст.
    $ua = 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)';
    $url = "https://sites.ru/api/index.php?key=apikey&action=create&service=295&quantity=1&link=111";
     
    $ch = curl_init($url);
          curl_setopt($ch, CURLOPT_HEADER, 0);
          curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
          curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
          curl_setopt($ch, CURLOPT_USERAGENT, $ua);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); //Можете поставить в 0, но это риск mitm.
          curl_setopt($ch, CURLOPT_URL, $url);
    $buf = curl_exec ($ch);
    
     // Проверяем наличие ошибки.
    if (curl_errno($ch)) {
         //На продакшене заменить логгированием. 
         echo 'Ошибка curl: ' . curl_error($ch);
    }
    curl_close ($ch);
         
    echo $buf;
    Ответ написан
  • PHPmailer, не отправлять письмо, если один из $_POST[''] пустой?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Как правильно выше написали, лучше всегда делать проверку всех используемых переменных из $_POST.
    if (empty($_POST['var'])) {
       return 'error, field var not filled';
    }


    empty(mixed $var)
    эквивалент конструкции
    if(!isset($var) || $var == false)

    Даже если поле не обязательно к заполнению - делайте проверки на существование и объявляйте пустую строку если поле пустое или вообще не пришло с фронтенда:
    if (empty($_POST['var1'])) {
      $_POST['var1'] = '';
    }
    ...
    $text.= $_POST['var1'];
    ...


    Ну и делайте дополнительно валидацию формы на фронтенде js'ом (это не снимает необходимость проверок на бекенде!!!)
    Ответ написан
    Комментировать
  • Как записать float число в БД (MySQL)?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Что же это за валюта с семью знаками после запятой? Беда у вас будет с округлениями.
    Ответ написан
  • Как сделать на PHP генерацию рандомного числа?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Код работы с числами верный, а вот вывод нет.
    echo $result.' баллов<br/>';
    echo $basik.' начислено';

    + Если вывод в шаблоне, то
    <div id="random"><?=$result;?> баллов</div>
    <div id="result"><?=$basik;?> начислено</div>
    Ответ написан
    Комментировать
  • Ошибки авторизации phpmyadmin?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    В восьмом мускуле сменился метод авторизации
    https://bugs.php.net/bug.php?id=76243
    Тут решения на выбор:
    https://stackoverflow.com/questions/49948350/phpmy...
    Ответ написан
    3 комментария
  • Где ошибка в php-коде?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Это конкретно под ваш кусок кода. В идеале нужно смотреть все и переписывать с нуля.
    <?php
    
    $num1 = intval(isset($_POST['num1']) ? $_POST['num1'] : 0);
    $num2 = intval(isset($_POST['num2']) ? $_POST['num2'] : 0);
    
    if (empty($num1) || empty($num2)) {
      echo "Что-то не передано!";
    }
    
    ?>
    Ответ написан
  • Как обнулять счетчик заказов каждый день?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Самое простое без особой боли - апнуть Redis (тык).
    В него же можно потом загнать какие-либо горячие данные и сессии.
    Ответ написан
  • Как правильно реализовать таймер до события?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Ну обычно так и считают, event timestamp - timestamp now
    Если все пляски нужны для клиента, то посмотри в строну
    moment.js
    Ответ написан
    Комментировать
  • Фреймворк, макро-Фреймворк для разработки портала?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Laravel, Yii, Phalcon
    Ответ написан
    Комментировать
  • Как организовать счётчик обращений к скрипту?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Делать Rate Limit через Redis.
    https://redis.io/commands/incr
    Ответ написан
    Комментировать
  • Ошибка в 17 строке, что не так?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    for ($i=0; $i < $rows; $i++) { 
         $rezult.='\
          <li>
              <img src="'.bloginfo('template_url').'/img/music.svg" alt="">
              <a href="">'.$row[$i].'</a>  /// 17-строка
          </li>';
    }
    Ответ написан