Ответы пользователя по тегу PHP
  • В mysql для быстрого поиска по дате лучше использовать timestamp как int или как date (datetime)?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Для скорости абсолютно без разницы, а для хранения даты и времени надо использовать предназначенные для этого типы данных
    Ответ написан
  • Почему SMTP не отправляет русские символы на почту?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Три простых шага для решения данной проблемы:

    1. Посмотреть на календарь и уточнить, какой сейчас век на дворе.
    2. Аккуратно выделить этот код, и нажать кнопочку Del
    3. Скачать phpmailer
    4. Забыть все эти кустарные ковыряния как страшный сон.

    В итоге код должен получиться примерно таким:

    require 'PHPMailerAutoload.php';
    $mail = new PHPMailer;
    $mail->setFrom('from@example.com', 'First Last');
    $mail->addAddress('whoto@example.com', 'John Doe');
    $mail->Subject = 'PHPMailer file sender';
    $mail->msgHTML("My message body");
    $mail->send();

    следует понимать, что отправка почты - это не просто копирование в свой скрипт каких-то определенных сочетаний символов, которые случайно сработали в прошлом веке у автора какой-либо допотопной статьи. Это гораздо более сложный процесс, который включает множество нюансов. И поэтому отправку почты надо не лепить вручную на ходу из навоза и палок, а доверить проверенному и отлаженному решению.
    Ответ написан
  • Как сделать вклад в развитие PHP?

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

    проверка на существование и пустоты массива $messages


    Под "проверкой", как я понимаю, тут имеется в виду заметание мусора под ковер? Любимый нубами подход, который заключается в том чтобы помешать РНР сообщить тебе о проблеме, когда ты пытаешься перебрать в цикле несуществующую переменную или не массив?

    И что имеется под пустотой? Если пустой массив - то зачем это проверять-то?

    То есть, Если обладать минимальными навыками программирования, и всегда иметь минимальное представление о том, что содержат твои переменные, то код получается

    <ul class="list">
      <?php foreach( $messages as $message ) : ?>
      <li class="list__item"><?= $message['content']; ?></li>
      <?php endforeach ?>
    </ul>

    что является прекрасным читабельным кодом, где разделены РНР и HTML.
    Вместо твоего монстра, где ты просто запихал зачем-то вперемешку html, РНР, оператор цикла, условного перехода, подавление ошибок, вывод HTML - и все это ради того чтобы сэкономить одну строчку кода в шаблоне.

    tag( 'ul class="list"', $messages as $message )

    которая непонятно - то ли РНР, то ли HTML, которую непонятно как расширять, непонятно как читать.

    Не говоря уже о том, что по синтаксису - это шаблонизатор, а не синтаксис РНР, а ты про них даже не слышал.
    Ответ написан
  • Значение @ в php?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Хороший вопрос, кстати. Сначала ответим на вопрос из заголовка

    file_put_contents($filemame, $somecontent, FILE_APPEND);


    ВСЁ. Это весь код, который нужен, чтобы записать в файл. Одна единственная строчка, без всех этих танцев с саблями.

    А по поводу кода из мануала - это чудовищный, идиотский рудимент из прошлого века, который остался в мануале по недосмотру. Так писать нельзя. Не нужно писать проверки на каждый чих - пхп сам прекрасно сообщит об ошибке. Не нужно заменять четкое и однозначное сообщение об ошибке изложением в свободной форме. И тем более не надо вываливать эти изложения на пользователя сайта. Ему совершенно не интересно читать что у тебя какой то файл не прочитался
    Ответ написан
  • Выгрузка картинки из базы mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Этот вопрос надо отлить в граните и поместить в палате мер и весов, в виде большой квадратной доски.
    И всех любителей хранить картинки в базе "это же так удобно!!!" заставлять биться об нее головой, пока вся эта дурь из головы не вылетит.
    Ответ написан
  • Как правильно прикрепить вложенный файл?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Три простых шага для решения данной проблемы:

    1. Посмотреть на календарь и уточнить, какой сейчас век на дворе.
    2. Аккуратно выделить этот код, и нажать клавишу Del
    3. Скачать phpmailer
    4. Забыть все эти кустарные ковыряния как страшный сон.

    В итоге код должен получиться примерно таким:

    require 'PHPMailerAutoload.php';
        $mail = new PHPMailer;
        $mail->setFrom('from@example.com', 'First Last');
        $mail->addAddress('whoto@example.com', 'John Doe');
        $mail->Subject = 'PHPMailer file sender';
        $mail->msgHTML("My message body");
            // Attach uploaded files
        $mail->addAttachment($filename1);
        $mail->addAttachment($filename2);
        $mail->send();

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

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Надо включить логику и использовать языковую поддержку для перевода, а не для вывода HTML, JS или canvas

    $lang['use_top_up_cards']       = 'Оплатить с препей карты';
    $lang['available_sum']       = 'Доступная сумма:';
    $lang['pre_deposit']        = 'Оплатить с депозита';
    return $lang;

    В шаблоне
    {$Think.lang.use_top_up_cards}<br><span class="fl ml30">{$Think.lang.available_sum}</span>
    {$Think.lang.pre_deposit}<br><span class="fl ml30">{$Think.lang.available_sum}</span>
    Ответ написан
  • Нужно ли обрабатывать фатальные ошибки в PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Ответ на этот вопрос очень простой.
    Сначала надо ответить себе на вопрос, что значит "обрабатывать". Что конкретно ты имеешь ввиду под этим словом. Какие конкретно действия, какой код.
    Как только ты себе на него ответишь - тут же станет очевидным и ответ на вопрос - нужно ли.

    ЗЫ: https://phpdelusions.net/articles/error_reporting#fatal
    Ответ написан
  • Как обработать ассоциативный массив PHP и внести изменение в БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    учить тут надо SQL, поскольку в РНР все стандартно

    $sql = "UPDATE `list` SET `count`=greatest(count-?,0)  WHERE `id`=?";
    $stmt = $conn->prepare($sql);
    foreach($cart as $value ) {
        $stmt->bind_param("ss", $value['id'], $value['count']);
        $stmt->execute();
    }
    Ответ написан
  • Как передать нужный путь к файлам на другую страницу?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Функция, конечно, ад.
    Как и ответы, которые здесь настрочат местные помогайки.

    Первое, о чем тебе надо позаботиться - это безопасность
    Чтбы не вываливать наружу содержимое любой папки на диске.
    Поэтому "как передать" зависит от того, какая структура папок
    Если совсем сложная, то ссылки на голереи хранить в БД, передавать id записи в таблице. а в cats.php доставать ссылку из базы.
    Если БД нету и это для тебя ну совсем неподъемно сложно, то передавать прямо ссылку и как-то её валидировать

    Например если главных категорий не очень много, и вложенность всегда 2

    $sections = ['tentacles','yaoi','yuri'];
    
    $parts = explode("/", $dir);
    $dir = "../img/$dir/"
    if (count($parts) <> 2 || !in_array($parts[0], $sections, true) || !is_dir($dir)) {
        return [];
    }
    и дальше уже лепить свой скандир

    в общем лучше по базе
    Ответ написан
  • Как правильно написать запрос в бд?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    В вордпрессе лучше использовать его собственную пепяку, wpdb
    Но если прям так хочется собстенное соединение с БД, то при коннекте надо сказать mysqli чтобы оно сообщало тебе об ошибках, вот этой строчкой
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    и после этого РНР тебе напишет, какая проблема у тебя в запросе.
    Ответ написан
  • Как вставить assembler код в программу на php?

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

    В общем вопрос из той серии что про FFI рассказывать явно ни малейшего смысла
    Ответ написан
  • Как в php 7.4 проверить является ли строка json?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Нет. Это занятие само по себе бессмысленное потому что нормальная программа всегда точно знает - с джейсоном она работает или нет, и поэтому никаких "специальных функций" нормальным программистам не нужно.
    Ответ написан
  • Почему php не может подключиться к БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Это очень забавная ошибка, в которой смешалась куча старого карго культ кода, который и сам по себе использовать не стоит, и вдобавок он здесь написан неправильно.

    Если разобраться, то код or die("Ошибка1 " . mysqli_error($link)); очень смешной (это не к тебе претензия, никто не ожидает от тебя понимания таких тонкостей, которые не то что новички, а половина здешних "кураторов" не понимают).
    Что тут происходит?
    слово or die (которое на самом деле вообще нельзя никогда писать) пишут тогда, когда ожидают что в переменной $link будет знаение false. Но если в $link будет false, то тогда её бессмысленно подставлять в mysqli_error. именно поэтому для получения ошибки соединения в мускули есть отдельная специальная функция.

    Но как я говорил выше, её применять не следует, как и or die.

    Что тебе нужно - это настроить пхп так чтобы он отображал ошибки, а mydsqli - чтобы оно бросало исключения.
    То есть код должен выглядеть вот так

    <?php
    // видеть все ошибки!
    ini_set('display_errors',1);
    error_reporting(E_ALL);
     // подключаем настройки
    require_once 'connect.php';
    
    // включаем режим информирования об ошибках
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    // подключаемся к серверу
    $link = mysqli_connect($host, $user, $password, $database);
       
    // выполняем операции с базой данных
    $query ="SELECT * FROM foo";
    $result = mysqli_query($link, $query);
    echo "Выполнение запроса прошло успешно";
    // в большинстве случаев закрывать подключение не надо


    ЗЫ. На боевом сервере ошибки на экран выводить конечно не стоит, а их надо писать в лог (собственно, именно поэтому все эти die - это ужас). И на боевом сервере display_errors надо отключать, а log_errors наоборот - подключать.
    Если совсем не можешь найти, где у сервера висит лог ошибок, можешь задать свой собственный, с помощью функции ini_set('error_log','/путь/к/файлу');. Но только размещать его надо разумеется в папке недоступной пользователям сайта
    Ответ написан
  • Чем отличается этот синаксис?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Хороший вопрос.

    Этот кот будет работать только в 5 версии.
    В 7 версии в РНР появился uniform variable syntax.
    Он унифицировал обращения к любым типам переменных - объектам, функциям, массивам - так что их стало возможно приписывать друг к другу в любом порядке, $foo()['bar']()->baz.
    Но при этом, очевидно, понадобилось ввести правило очередности исполнения. Самое простое - слева направо.

    То есть что в итоге мы получаем? Сначала пхп читает $post->$attrs_arr и ждет что в $attrs_arr будет строка. Но там получается массив, и РНР начинает орать тебе об этом. но ты зачем-то выключил отображение ошибок, и ничего не видишь. Так делать нельзя. Если бы ты увидел ошибку, то мог бы при некотором минимальном навыке гугления найти решение самостоятельно. Хотя конечно зумеры, в отличие от нас старых пердунов, родившихся когда интернета ещё не было, на удивление с трудом представляют себе что такое поиск в интернете.

    Ну а решение простое - заключить переменное свойство в фигурные скобки, чтобы ПХП сначала получил элемент массива, а потом уже поставлял его в качестве имени свойства
    Ответ написан
  • Почему не записывает значение в БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    ё моё, ну нормальный почти у тебя код был
    оставь все как было только запрос поменяй
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $pdo = new PDO($dsn, $user, $pass, $opt);
    
    $query = 'INSERT INTO `configs` (`CName`, `Username`, `Time`) VALUES (?,?,?)';
    $stmt->$pdo->prepare($query);
    $stmt->execute([$CName,$Username, $Time]);
    $id = $pdo->lastInsertId();
    Ответ написан