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

    shaks
    @shaks
    Дык, батенька) во первых.
    public function __destruct() {
          $this->log('Создался объект');


    не "создался", а уничтожился. раз, не $this->log а self::$log два. (у тебя ж статический метод то)
    И ты хоть 20 раз напиши в конце файла FileLogger::create('test', "file.log");, записей больше не увидишь. Объясняю почему:

    Деструктор класса срабатывает когда? правильно, когда разрушается объект. А объект у тебя разрушается когда? правильно, когда завершается работа скрипта. А разрушается он 1 раз а не 3 почему? потому что объект у тебя один.
    Взгляни внимательно на функцию create , особенно на эту запись
    if(isset(self::$loggers[$fname])) {
          
            return self::$loggers[$fname];
          }

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

    !! Для более глубокого понимания, советую поставить xdebug, и глянуть пошагово что происходит и как.

    P.S. Не вздумай даже этот логгер использовать гдето на практике. Автор видимо хотел чтото объяснить этим кодом, а не написать логгер. Ибо это дичь.
    Ответ написан
    Комментировать
  • Как правильно расставить ""?

    shaks
    @shaks
    <table>
        <?php foreach($a as $b):?>
            <tr>
                <td><?php echo $b?></td>
            </tr>
        <?php endforeach;?>
    </table>

    Этим примером я хочу сказать, что не нужно в пхп файле генерить хтмл, нужно в хтмл шаблоне делать вставки пхп. Иначе дрочится с кавычками будете постоянно. Да и подход ваш еще в духе пхп3, а щас какбы 2017й год на дворе
    Ответ написан
    5 комментариев
  • Почему выдает ошибку GET и как исправить?

    shaks
    @shaks
    Notice: Undefined index: num2 in
    Индекс num2 в переменной ($_GET) не определен..

    Вы делайте запрос на localhost/12.php?num=2 и не передаете num2, отсюда и notice ошибка.

    но после ошибки файл news2 всё же показан.

    а вот не врите.. показан файл news1
    $fir = $_GET['num']; # $fir  у вас берется из переменной $_GET['num']
    $sec = $_GET['num2']; # num2 не передан, он udnefined
    if(!isset($sec)) { # срабатывает этот иф, т.к $sec у вас undefined
      $text = file_get_contents("news/news$fir.txt"); # отображается переменная $fir
    Ответ написан
  • Почему не работает router из мануала php?

    shaks
    @shaks
    поменяйте картинку на небитую ;)
    Пример правильный. код правильный.

    Upd. гляньте в консоль браузера. Там ошибка отображаться должна, почему картинка не подгрузилась.
    Со стороны сервера все произошло правильно, как его и просили. Вы дали условие, сработал else и вывел строку.
    А почему хтмл тэг img не отобразил картинку - пхп никак не касается . Причина тут может быть только одна - битая картинка.
    Ответ написан
    Комментировать
  • Возможно ли выполнить несколько запросов к БД в одном mysqli_query?

    shaks
    @shaks
    буквально на днях уже подымался этот вопрос.
    php.net/manual/ru/mysqli.multi-query.php
    разделяйте строки через ; и используйте не mysqli_query а mysqli_multi_query

    PS. как вас только не тошнит пользоваться mysqli*
    Ответ написан
    Комментировать
  • PHP-скрипты выполняются последовательно?

    shaks
    @shaks
    Используйте транзакции баз данных. Они как раз для подобных случаев и созданы.
    Логика примерно следующая
    псевдокод:
    <транзакция>
    - удаляем что-то
    - апдейтим что-то гдето
    - записываем что-то кудато
    если всё ок:
         -- commit, все запросы в бд ушли, но не выполнились, команда commit выполняет их все сразу. 
    иначе
        -- rollback - откат всех запросов в бд, что выполнены в блоке транзакции. 
    </транзакция>
    Ответ написан
  • Кто поможет переписать SQL запрос?

    shaks
    @shaks
    Я не совсем понял что у вас где храниться, и зачем вам логин аккаунта, но подразумеваю что вы имели ввиду что баланс юзера хранится не в таблице users а в таблице lm_balance

    Эти таблицы объединяет только одно ИД аккаунта

    Во первых имя колонки с id аккаунта (ид юзера в вашем случае) должен называться user_id а не name (судя по вашему sql запросу).
    Во вторых, balance = balance +" . floor($_credits) . " - за это руки вырывать надо, с корнями.
    Баланс ведите в наименьшей величине, если баланс рублевый - в копейках, долларовый - в центах, биткоиновый - в сатоши, и тд, и ничего не округлять никогда, если хотите чтобы сводился дебит с кредитом. При работе с большими числами лучше использовать либу по работе с большими числами
    В третьих, ид юзера нужно просить не юзера ввести, а брать из сессии (если у вас сессионная авторизация).
    В четвертых, функции mysql_* уже давно устарели и помечены как деприкейтед. В пхп7, если я не ошибаюсь - драйвер mysql убрали.
    Ответ написан
    Комментировать
  • Какой раздел php отвечает за привязку к dom event?

    shaks
    @shaks
    никакой
    Ответ написан
    Комментировать
  • Как сформировать нестандартную строку из даты в php?

    shaks
    @shaks

    абв-гдеёж
    а - последняя цифра текущего года
    бв - месяц
    гд - день


    $string = "509-01001";
    $year = "201{$string[0]}";
    $month = $string[1].$string[2];
    $day = $string[4].$string[5];
    $incr = substr($string, -3);


    > к реализовать хранение порядкового номера заказа конкретно за текущий день
    этим занимается БД обычно.
    Ответ написан
    Комментировать
  • Защита скрипта от ajax запросов с других серверов, разумно ли решение?

    shaks
    @shaks
    всё что вы написали ерунда полная. Все заголовки легко выставляются любым скриптом, в том числе и REFERRER
    По поводу вопроса
    - нет, не ресурсоемко
    - есть альтернатива strpos substr и тд

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

    PS А зачем вам такая "защита" ? любопытно просто, я попытался придумать ситуацию когда это нужно и необходимо, но так и не смог придумать )
    Ответ написан
    Комментировать
  • PHP выводит только один товар в рейтинг, в чём проблема?

    shaks
    @shaks
    ну раз всё так как вы описали, то super_query ваше возвращает массив (вместо ассоциативного массива)
    Ответ написан
  • Как реализовать "единую точку входа" без домена?

    shaks
    @shaks
    > не знаю уже, куда смотреть. очень прошу помощи
    попробуй посмотреть внимательно на:
    DocumentRoot /var/www/site ( сайт находится в папке /var/www/site обращаться нужно -  %IP_ADDRESS%/ а не  %IP_ADDRESS%/site)
       ServerName site.com - стереть, вы же по ip обращаетесь,  причем тут site.com ?
       ServerAlias www.site.kg - стереть


    посмотреть в логи
    ErrorLog /var/log/apache2/site.com-error.log
       CustomLog /var/log/apache2/site.com-access.log combined


    убедится что по ип адресу не открывается какойто другой конфиг который подгружается первым в конфиг апача.

    > (главная страница запускается)
    а вы уверены что 404 идет от апача а не от скрипта?

    Проблема может быть в том, что используется REST запрос, а сайт лежит в папке, и роутинг скрипта вашего сайта выдает 404, т.к. site/ воспринимает за роут, который у него не настроен. (нужно гдето в скриптах указать base url, должно быть такое)
    Ответ написан
  • Запись в БД MySQL?

    shaks
    @shaks
    DevMan правильно написал. сначала надо собрать строку, а потом сделать за одни запрос в базу уже апдейт, т.е. так какбы логично и правильно.

    Если я правильно понял то вам нужна конкатенация строки (дозаписать):
    `column` = CONCAT(`column`,' addon string')

    Тут кусок кода, как собрать валидные мыла, и как их вставить через запятую в sql запрос твой.
    pastebin.com/rGdPqU51
    только вставку в mysql выведи за пределы твоего цикла foreach
    Ответ написан
    Комментировать
  • Как спарсить капчу, которая обновляется при каждом запросе?

    shaks
    @shaks
    Это стандартная капча и работа с ней - стандартная, как описал Александр Галанин
    Пойми логику работы таких капч:
    Скрипт сгенерил картинку, он должен гдето сохранить то что такому-то пациенту я выдал такойто текст капчи. Идентификатором "пациента" выступает кука или сессия.
    Алгоритм примерно следующий:
    - обращаешься на скрипт капчи
    - сохраняешь картинку и все куки в том числе и сессию
    - распознаешь капчу
    - с сохраненными куками сабмитишь нужную форму на сайте.
    Ответ написан
    Комментировать
  • Что такое "?action="?

    shaks
    @shaks
    if(isset($_GET['action']) && $_GET['action']=='sample')
    {
    echo "Меня зовут " . $_POST['name'] . ", мне " . $_POST['age'] . " годиков" ;
    }
    Ответ написан
    4 комментария
  • Как определить наличие файлов на удаленном сервере, с помощью распараллеливания?

    shaks
    @shaks
    Такие задачи нужно делать в фоне по какому-то расписанию или определённым событиям. И обязательно вести логи.
    Это сейчас у Вас 50 файлов (а в будущем может 500 будет, кто знает), и у вас все работает как должно работать. А случись что с ДЦ? фаза луны не та? у вас вобще всё повиснет, т.к. на каждый запрос будет уходить выставленный таймаут в курле (30 сек по умолчанию помоему).

    Ну и гляньте еще в сторону multicurl
    php.net/manual/ru/function.curl-multi-init.php
    Ответ написан
    5 комментариев
  • Как можно улучшить код?

    shaks
    @shaks
    Почитайте про паттерн проектирования MVC
    Суть паттерна заключается в изоляции моделей(Model) представлений (View) и контроллера (Controller) друг от друга.

    Ну а технически изоляция переменных контроллера от представления (ваш случай сейчас) выглядит примерно так:

    <?php
    #app/controllers/prices.php
    class PricesController extends BaseController // Контроллер.  Принимает запросы и работает с моделью и представлением. В примере моем только представление.
    {
        function action_index() 
        {
            $foo = 'foo';
            $bar = array('bar1', 'bar2');
            self::render('prices/index', array('foo'=>$foo, 'bar'=>$bar)); // метод реализован в базовом контроллере
        }
    }
    #  app/controllers/base.php 
    class BaseController {  // Главный контроллер, от которого унаследуются все остальные. В нем могут быть всякие настройки и тд итп. В данном случае только статический метод рендеринга страницы
        const VIEW_FOLDER = 'app/views';
    
        static function render($template, $data)
        {
            $view = VIEWS_PATH."/{$template}.html.php";
            if(file_exists($view))
            {
                extract($data); // Самая соль в этой функции, она создает переменные из полученного массива, именем переменной является ключ массива.
                                // В итоге шаблон у нас видит только эти переменные + те которые объявлены в самом методе render до инклуда, т.е. будет видна переменная $template и массив $data
                ob_start();
                include $view;
                $yield = ob_get_clean();
                include VIEWS_PATH . '/layouts/application.html.php'; // это главный лайут, содержащий хеадер и футер.
            }
        }
    }


    А вот и View:
    главный лайоут:
    # app/views/layouts/application.html.php
    <html>
    <body>
        <?php echo(isset($yield) ? $yield : '')?>
    </body>
    </html>


    шаблон вывода для нашего контроллера:
    # app/views/prices/index.html.php
    foo: <?php echo($foo)?><br>
    bar: <?php var_dump($bar)?>

    В итоге, в шаблоне prices/index.html.php будут видны переменные $foo и $bar объявленные и в нашем контроллере и переданные на рендер. (
    self::render('prices/index', array('foo'=>$foo, 'bar'=>$bar));
    )

    P.S. Я мог гдето ошибиться, т.к. писал быстро, буквально на коленке, ничего не проверял вообще. Я хотел показать саму концепцию на примере того, как делать изоляцию переменных чтобы они не могли вызываться "где угодно" как Вы выразились.

    P.S.S Работу с моделями я не писал, поэтому приведенный здесь код не является MVC, лишь VC.
    Ответ написан
  • Почему выскакивает ошибка #1064 при выполнении SQL запроса INSERT INTO?

    shaks
    @shaks
    во первых запрос должен иметь примерно такой формат:
    INSERT INTO `price` (`N`, `title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES  (1,'Poi',2,1000,1500,2000,4000)

    обрати внимание, что кол-во полей не то, кол-во данных которые вставляются не соответствует кол-ву полей
    во вторых у вас тип данных не правильный

    `localsum` char(100) not null,
    `regionsum` char(100) not null,
    `rfsum` char(100) not null,
    `intersum` char(100) not null,

    эти поля должны быть int а не char
    Если вы хотите именно строку, то цифры (при вставке) нужно оборачивать в кавычки

    в третьих, раз `N` int not null auto_increment, то значение N можно или игнорировать при вставке, или передавать NULL

    P.S. Строку вставки можно делать так:
    INSERT INTO `price` SET `field`=1, `field2`=2, `field3`=3

    так визуально понятней что куда вставляется

    ------
    UPD
    <?php
    // соединение с базой:
    chdir(dirname(__FILE__));
    $dsn = 'mysql:host=localhost'.
        ';dbname=temp_development'.
        ';port='.
        ';connect_timeout=15';
    
    $user = 'root';
    $password = '123qwe#';
    $db = new PDO($dsn, $user, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    
    
    $file = "./price.txt";# 'Poi',2,1000,1500,2000
    # в файле я убрал последнее значение, т.к. для него нет соответствующей колонки в ДБ
    if($fp = fopen($file, 'r'))
    {
        $sql = "INSERT INTO `price` (`title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES ";
        $prepare = array();
        $insert = array();
        while($line = fgets($fp))
        {
            $line = trim($line);
            if(!$line)
                continue;
            # Читаю файл построчно, чтоб память не загадилась если файл содержит оч много данных
    
            // валидацию данных я не делаю
            array_push($prepare, implode(",", array_fill(0, 5, "?")));
            $insert = array_merge($insert, explode(",", $line));
    
        }
        $pr = $db->prepare($sql."( ".implode("), (", $prepare)." )");
        $pr->execute($insert);
    }

    этот код сгенерирует такой вот запрос в бд:
    INSERT INTO `price` (`title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES ( '\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000' )
    Ответ написан
    3 комментария
  • Как сделать подмену запросов?

    shaks
    @shaks
    все просто. поиск должен выполнять один роут (в вашем случае файл) со всеми возможными фильтрами поиска.
    Ответ написан
    Комментировать