Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Php PDO database singleton. Какой вариант выбрать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    По первому варианту:
    1. Зачем здесь нужен класс Database?
    2. У тебя будет только один класс во всем приложении? или больше? А сколько будет коннектов после new myclass и new myclass2?

    По второму.
    Высоколобые не любят синглетон. Чем-то он им там с тестированием мешает. Плюс религиозная нетерпимость. Так что используй статический синглтон только если у тебя код организован в виде классического процедурногоговнокода.

    Если же у тебя все в виде кошерной иерархии классов, то, как замечено в другом ответе, передавай соединение в класс, а не создавай его каждый раз заного.
    function __construct($db)
        {
            $this->db = $db;
        }
    Ответ написан
  • Как сделать такой формат даты и времени?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    А этот код тебе кто делал?

    Во - нашел. Лет 10 назад писал :)

    echo rdate().'<br>';
    echo rdate(0,'d \p Y года').'<br>';
    $date = '2015-01-11 15:52:00';
    echo rdate($date,'d \p Yг., H:i');
    
    
    // \P (латиниская) - русское название месяца в именительном падеже
    // \p (латиниская) - русское название месяца в родительном падеже
    function rdate($date = 0, $format = '')
    {
      if (!$date) $date = time();
      
      if (!ctype_digit((string)$date))
      {
      	$date = strtotime($date);
      }
      
      if (!$format) $format='d.m.y H:i';
    
      $rmon = array('январь','февраль','март','апрель',
                    'май','июнь','июль','август','сентябрь',
                    'октябрь','ноябрь','декабрь');
      $format = str_replace('\P',$rmon[date('n',$date)-1],$format);
    
      $rmon = array('января','февраля','марта','апреля',
                    'мая','июня','июля','августа','сентября',
                    'октября','ноября','декабря');
      $format=str_replace('\p',$rmon[date('n',$date)-1],$format);
    
      return date($format, $date);
    }
    Ответ написан
    5 комментариев
  • Какая разница между @include и include?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Собака не имеет никакого отношения к include. Это не один оператор, а два совершенно разных оператора.
    2. Увидев @ в коде ты можешь почти со стопроцентной уверенностью сказать, что его писал неграмотный пользователь, и пользоваться этим кодом не стоит.
    3. Увидев в коде @include ты можешь смело считать его автора абсолютным лохом и нубом, а сам код надо выкидывать немедленно. Потому что @include глушит не только саму ошибку включения файла, но и все ошибки в этом файле - то есть, поступает стократ хуже. Это значит, что если автор допускает такие косяки в коде, то и все остальное у него тоже ад кромешный.
    4. Самое главное. Ошибки надо не подавлять. Ошибки надо исправлять. Но опять же, делать это с умом. Начинающие программисты считают сообщения об ошибках своими личными врагами, и борются с ними всеми доступными средствами - с помощью @, error_reporting(0) и др. Получив линейкой по рукам и запомнив на всю жизнь, что так делать не надо, ониначинают с не меньшим рвением писать всякие проверки - лишь бы не допустить, не дай бог, ненавистного сообщения об ошибке. Например:

    if (file_exists($inc))
    {
        include $inc;
    } else {
        echo "Файл не найден";
    }

    Так вот, это - еще хуже. Для начала, часть ошибок этот код все равно не отловит. Но это даже не самое главное. Главное - что вот это вот "Файл не найден" не имеет ни малейшего смысла. Пользователю оно ничего не скажет. А программист о нем не узнает. А если и узнает, то ничего не поймет! Какой файл? Где не найден? По какой причине? Системное сообщение об ошибке содержит массу бесценной информации помогающей идентифицировать ошибку, сообщая нам где она произошла, какой файл не найден, по какой причине не найден. Выдавать вместо этого огрызок "файл не найден" - это мазохизм.

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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ничего не могу ответить - при взгляде на этот код мои глаза стали кровоточить.

    Но похожий случай был на Оклахомщине
    Ты, я так понимаю, из операторов сравнения знаешь только "равно" и "не равно" ? Когда проходили "больше"-"меньше" ты болел?
    Ответ написан
    9 комментариев
  • Где хранятся задания cron?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    У тебя вопрос по панели управления для клиентов системы "Йа с понтом хостер-криворучко". Cpanel и вот это вот всё.

    К тегу unix оно не имеет ни малейшего отношения.
    потому что в юникс можно написать
    crontab список_заданий.txt
    и все загрузить.
    А куда грузить в твоей панели - надо спрашивать пользователей панели, а не юникса.

    Впрочем, в любом случае если у тебя там " много однотипных cron-задач", то ты все делаешь неправильно.
    Ответ написан
  • Форма отправки данных, В чем проблема?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Аналогичный случай был в Одессе
    Ответ написан
    Комментировать
  • Куда PDO пишет ошибки если нет try / catch?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никакой обработчик писать не надо.
    Порождается стандартная Fatal error, которая должна содержать текст ошибки.
    То есть, PDO дальше становится не при чем, и ошибка обрабатывается так же, как и все остальные. То есть, куда по умолчанию выводит ошибки РНР - туда и выведется.

    Проблема, как я понимаю, в отсутствии текста ошибки. Я бы грешил на xdebug и для начала попробовал бы без него.
    Ответ написан
    Комментировать
  • Как извлечь из MySQL данные по нескольким критериям силами PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Следует понимать, что EAV - не панацея, а несколько наоборот - постоянная боль пониже спины.
    Во-первых, если в реляционной модели за целостностью данных может следить СУБД, то здесь вся работа ложится на программиста.
    А уж получив в том же EAV хотя бы пару-тройку уровней вложенности, можно начинать заранее строить себе стену, об которую потом захочется убиться.

    А во-вторых, проблему поиска EAV не решает от слова "совсем". Искать надо другими средствами, например - сфинксом.
    И вот тут на первый план выходит не удобство хранения, а удобство построения RT индекса. От которого и надо плясать.
    Ответ написан
    Комментировать
  • Зачем нужны отдельные классы для работы с БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    На самом деле это интересный вопрос. А, точнее, два: зачем нужен такой класс, и зачем их пишут.
    Ответ на первый становится очевиден, когда начинаешь не смотреть на код, а писать его ;)
    Практически все библиотеки, представленные в РНР, представляют в пользование программиста довольно низкоуровневые функции, которые позволяют, с одной стороны, довольно гибко управлять процессом, но с другой - делают этот процесс ну очень многословным. Самый яркий пример - CURL. Никто, находясь в здравом уме, не будет писать все время эти бесконечные curlopt. Надо пилить библиотеку, которая реализует стандартные методы пост, гет за один вызов, и только для исключительных случаев позволяет задать кастомные параметры.

    То же самое касается и работы с БД. К примеру, очень часто нам бывает нужно получить из БД массив. Сколько строк нужно написать для этого? Классическим говнокодом - 5:
    $ret = array();
    $res = mysql_query();
    while ($row = mysql_fetch_assoc($res)) {
        $ret[] = $row;
    }

    И такой код надо написать раз 15-20 за приложение. У программиста сразу руки зачешутся уничтожить этот повторяющийся код и написать функцию, которой передаешь запрос, а получаешь массив. За 1 вызов. Вот для этого библиотеки и пишут.

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

    Возьмем для примера код примера из мануала. Даже выкинув из него очевидные глупости, мы получаем пол-дюжины строк кода. Это на ОДИН запрос.
    if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
        $stmt->bind_param("s", $city);
        $stmt->execute();
        $stmt->bind_result($district);
        $stmt->fetch();
    }

    И это все - чтобы получить единственную строчку!

    В то время как с помощью (нормальной) библиотеки вся работа с БД сведется к 1 (одной) строчке, а все необходимые телодвижения будут выполнены библиотекой автоматически:
    $distr = $db->getOne("SELECT District FROM City WHERE Name=?", $city);

    Теперь перейдем ко второму вопрос - зачем их пишут.
    Самый основной мотив - "шоб було!" "У всех есть - значит, и у меня будет!". При этом, подходя к написанию библиотеки, новички наступают на одни и те же грабли.
    Чаще всего, из-за недостатка опыта авторов, код сокращается только для самых примитивных запросов. Но при этом работа с нестандартными запросами превращается в ад. Но самое ужасное - практически никогда такие самописные библиотеки не поддерживают работу с подготовленными выражениями. А это должно быть их главной фичей, без которых ценность сразу стремится к нулю. А точнее, даже к минусу, потому что инъекции. Ну и по мелочи: к примеру, если в коде действительно написано $db->FetchArray(); - то это ужас, летящий на крыльях ночи, потраченной на отлов неочевидных ошибок .
    Ответ написан
  • Как подключить файл?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Что такое " базовое подключение файлов" и как конкретно оно "не работает"?
    Ответ написан
    Комментировать
  • Где ошибка в коде?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. ты пытаешься обратиться к несуществующей переменной.
    2. http_build_query()
    Ответ написан
    Комментировать
  • Можно ли подключить внешний файл?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    можно, если в file.php прописаны полные урлы к css и js
    и РНР позволяет читать урлы.
    урл, разумеется, должен быть полным, а вот include использовать нежелательно. лучше readfile().

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

    В любом случае, скорее всего ты просто выдумал от неграмотности какого-то монстра, и все делается гроаздо проще.
    Ответ написан
    2 комментария
  • Почему не работает энтер?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    - Алло!!! Полиция??? Срочно пришлите наряд. У меня украли!!!
    - Что украли? Говорите толком.
    - Из машины! Все украли! Руль, приборную доску, все рычаги и педали!!!
    ...через пять минут...
    - Алло! Полиция? Отмените пожалуйста вызов... Я на заднее сидение сел…
    Ответ написан
    1 комментарий
  • Как правильно принять информацию от сервера?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    У меня на ум приходит только написать пхп функцию, которая бы парсила ссылку:

    $year = file_get_contents('http://domain.com/text.php?n=1');

    Пиши-пиши, писатель.

    Ну или padded JSON сразу с клиента, если у тебя доступ к этому серверу есть.
    Ответ написан
    1 комментарий
  • Понять принцип работы обьектов в php на примере?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    "Вообщем" учить ООП надо года 2-3 чтобы начало получаться что-то стоящее.
    И в двух строчках тебе на тостере этого не расскажут.

    Покупай учебники, читай. Это единственный вариант, если профильного образования нету.
    Ответ написан
  • Как закрыть от просмотра ini файлы на сайте?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Апач стоит не везде.
    2. Всю внутреннюю кухню надо класть выше веб-рута.
    3. по поводу локализации и вовсе париться не нужно - она никому не нужна
    Ответ написан
    1 комментарий
  • В чем ошибка php кода?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Переписываем на PDO и выкидываем ненужный код.
    if (isset($_POST['edit'])) {
        db_connect();
        $query = "UPDATE `Processors` SET Price=?, Article=? WHERE ID=?";
        $data = array($_POST['price'], $_POST['article'], $_GET['edit_id']);
        $db->prepare($query)->execute($data);
        header("location: edit.php?edit_id=".$_GET['edit_id']);
    }

    Что писать в db_connect смотрим здесь

    2. проверяем, передаем ли из формы edit_id
    Ответ написан
    4 комментария
  • Error 1064 (DB1) ,что это значит?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это значит, что при работе с БД из РНР надо либо работать через ORM, либо добавлять данные в запрос только через плейсхолдеры, для чего использовать PDO.
    Ответ написан
    Комментировать
  • Как оптимизировать код?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    совершенно адский вопрос, я бы такие удалял.
    Один заголовок чего стоит. "Помогите оптимизировать расходы, дайте 5000 рублей!"

    Ну и код, конечно.
    while($line = fgets($stream)) {
        flush();
        $result = array(
            'console' => $line,
        );
        exit( json_encode($result) );
    }

    А попробуй-ка сам посмотреть на этот код, и сказать, что в нем неправильно. Не бойся, это не так сложно, как тебе кажется.
    Ответ написан
  • Как получить все значения из массива?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ты выводишь ключи не того массива.
    Запомни простое правило: если какая-то функция РНР работает неправильно, то бегом проверяй свои данные, которые ей подсовываешь.
    Ответ написан