Ответы пользователя по тегу PHP
  • Как интегрировать gmail с CRM?

    mramor
    @mramor
    нечего о себе рассказывать.
    Перед тем, как мы будем тереть эту тему, я бы хотел уточнить - вы смотрели gmail api?
    Ответ написан
  • Почему не создается представление в yii2 через web-интерфейс gii?

    mramor
    @mramor Автор вопроса
    нечего о себе рассказывать.
    webinar Что вы имеете ввиду?
    Ответ написан
  • Централизованное обновление нескольких сайтов?

    mramor
    @mramor
    нечего о себе рассказывать.
    Была аналогичная проблема. Гит проблему не решал, ибо все на шаредах, на одном нам гит врубили, но хостов прорва, более 60 проектов. Кароче, на каждый клянчить гит не получилось. Пришлось писать приложение на пайтоне, который синхронизировал все остальные с мастер-хостом по сфтп. Также с БД, писал файл инструкций, который выполнялся на каждом хосте с ссш, также скриптами.
    Ну и докучи был написан пхп скрипт анализа баз данных после всех изменений, на случай если что-то пойдет не так, который брал базу мастер хоста, паковал ее структуру в массив и после проверялось на наличие\отсутствие полей\таблиц по всем бд. Весь скрипт выкладывать не буду, но сбор бд в массив делал так:

    function createStruct($shop){
        
        if(!isset($shop['db'])) return false;
        $tablesArray = array();
        
        $link = mysql_connect($shop['db']['host'], $shop['db']['user'], $shop['db']['password']);
        mysql_select_db($shop['db']['name'], $link);
        
        $resultTables = mysql_query("show tables", $link);
        if(mysql_affected_rows($link) > 0){
            while($table = mysql_fetch_array($resultTables)){
                    $tablesArray[$table[0]] = array();
            }        
        }
        
        if(empty($tablesArray)) return false;
        
        foreach($tablesArray as $tableName => $tmpval){
            $resultFields = mysql_query('DESCRIBE '.$tableName, $link); 
            if(mysql_affected_rows($link) > 0){
                while($rowField = mysql_fetch_assoc($resultFields)){
                    $tablesArray[$tableName][$rowField['Field']] = array(
                        'type'  => $rowField['Type'],
                        'null'  => $rowField['Null'],
                        'key'   => $rowField['Key'],
                        'default' => $rowField['Default'],
                        'extra' => $rowField['Extra']
                    
                    );
                }
            }       
        }
        
        mysql_close($link);
        return $tablesArray;    
    }

    Код не идеален, но за идеальностью и не гнался.

    Вот часть обработки сверки:
    $ideal = createStruct($shops[0]);
        
        $equal = createStruct($shops[$_SESSION['sc']]);
        
        if($equal === false || empty($equal)){
            $html = '<table><tr><td><h3>Проблемы с подключение к базе сайта <b>'.$s->shop_name.'</b>, возможно база не была создана, либо не верные коды доступа, либо прекратила свое существование.</h3></td></tr></table>';
        }else{
        
        $html = '<table>';
        $html .= '<tr><td><h3>'.$s->shop_name.'</h3></td></tr>';
        foreach($ideal as $table => $fields){
            if(!isset($equal[$table])){
                $html .= '<tr><td>Отсутствует таблица <b>'.$table.'</b></td></tr>';
            }else{
                $html .= '<tr><td>';
                    foreach($ideal[$table] as $key => $fieldRow){
                        if(!isset($equal[$table][$key])){
                            $html .= 'В таблице <b>'.$table.'</b> не хватает поля <b>'.$key.'</b><br>';
                        }else{
                            foreach($ideal[$table][$key] as $okey => $oval){
                                if($equal[$table][$key][$okey] !== $oval){
                                    
                                    $text = $equal[$table][$key][$okey];
                                    if($equal[$table][$key][$okey] === NULL){
                                        $text = 'NULL';
                                    }elseif($equal[$table][$key][$okey] === ''){
                                        $text = ' (ПУСТОТА) ';
                                    }elseif($equal[$table][$key][$okey] === TRUE){
                                        $text = 'TRUE';
                                    }elseif($equal[$table][$key][$okey] === FALSE){
                                        $text = 'FALSE';
                                    }
                                    
                                    $html .= 'Опции поля <b>'.$key.'</b> в таблице <b>'.$table.'</b> не идентичны. Идеал: '.$oval.' Исследуемый: '.$text.'<br>';
                                }
                            }
                        }
                    }
                
                $html .= '</td></tr>';
            }
            
            if(isset($equal[$table])){
                unset($equal[$table]);
                unset($ideal[$table]);
            }
        }
    Ответ написан
    5 комментариев
  • Контроллеры должны контролировать. Всегда всё?

    mramor
    @mramor
    нечего о себе рассказывать.
    $order->price = 'error here!'; // не число!
    $order->price = (float)'error here!';
    Уже число :) Контроль зависит чисто от программиста, вас никто не заставляет. Если вам не привычно, то в пхп можно жестко типизировать.

    Личное мое мнение - проверять нужно все, приводить к нужным типам перед сохранением в бд.
    Ответ написан
    Комментировать
  • Как отслеживать клик?

    mramor
    @mramor
    нечего о себе рассказывать.
    Так вот, пользователь выбирает нужного героя, потом нужную вещь и там будет кнопка " установить", после клика на нее идет загрузка файла в папку.
    Как отслеживать клик по герою, вещи и давать скачивать именно ту вещь?
    Думал через ID, но не могу собрать все в кучу(

    допустим пусть будут все герои с классом .heroes
    все вещи с классом .items
    пусть это будут дивы типа <div class="heroes" hero-id="ид героя">...</div>
    на кликнутого героя накручиваем класс active, на выбранную вещь накручиваем класс active
    дальше, ну например можно получить ид героя(который в атрибуте hero-id) захватывая классы .heroes.active, тем же макаром ид вещи, или вещей с перебором активных
    Написал упрощенно, но суть примерно такая.
    Ответ написан
    Комментировать
  • Как отменить require_once в родительском functions.php?

    mramor
    @mramor
    нечего о себе рассказывать.
    Никак. Но в дочернем можно переопределить родительские функции. Вариант переопределить заглушками, чтобы ничего не позвращали.
    Ответ написан
  • Как организовать хранение файлов в PHP проекте?

    mramor
    @mramor
    нечего о себе рассказывать.
    Всё сказали верно, но забыли еще одно - нужно фильтровать прилетающие на сервер переменные , ибо в имя файла можно запихать путь, в итоге как каталог не защищай, а сохранить файл можно в инном месте, например в корне. Именно так зачастую и заливаются на сайт через всякие fileuploader'ы, которые держат настройки на стороне клиента, например в js и конечно в таком случае никаких настроек не держать в фронтед скриптах.
    Ответ написан
    Комментировать
  • Где искать последствия атаки на сайт?

    mramor
    @mramor
    нечего о себе рассказывать.
    PHPIDS воткните, там есть правила на спам. И на всё остальное, впринципе, тоже.

    Последствия - не понятно что имеется ввиду? Вас взломали? Не уверены? Прогоните ai-bolit, посмотрите что покажет.
    Ответ написан
    Комментировать
  • Вывод pdf из MySQL?

    mramor
    @mramor
    нечего о себе рассказывать.
    Никогда таким не заморачивался, потому не уверен в своем ответе.
    получается файл pdf.pdf с размером 0 байт.

    попробуйте еще добавить хедер на размер:
    header('Content-Length: '.strlen($row['bill']));

    возьмите вручную из поля значение и сохраните в пдф, может лежащий там файл поврежден сам по себе.
    Ответ написан
    1 комментарий