Ответы пользователя по тегу PHP
  • Почему драйвер ODBC (SQL Server 2012) возвращает данные в неверной кодировке?

    @f_u_s_s Автор вопроса
    Любопытный кодер
    В общем проблема оказалась в неверной кодировке на стороне SQL Server, как выяснилось отдавал он все же cp1251. Но сами "хвосты" все же отдавал драйвер, потому пришлось при подключении прописать
    'AutoTranslate' => 'no'
    И все ответы от базы прогонять через свою функцию (оставлю тут, может кому пригодится)
    function fixCharset($data, $from = 'cp1251', $to = 'utf8'){
        if(is_scalar($data)){
            return mb_convert_encoding($data, $to, $from);
        }
        else {
            if ($to_object = is_object($data))
                $data = (array)$data;
    
            array_walk_recursive($data, function (&$item, $key) use ($from, $to) {
                $item = mb_convert_encoding($item, $to, $from);
            });
    
            return $to_object ? (object)$data : $data;
        }
    }


    Т.к. приложение только на чтение работает, этого достаточно. Для ускорения, все перекодированные результаты кешируются в redis, но, скорее всего это экономия на спичках.
    Ответ написан
    Комментировать
  • Как правильно переписать функцию mysqli_fetch_array($result) в PHP 7?

    @f_u_s_s
    Любопытный кодер
    Попробуйте так:
    while ($row = mysqli_fetch_array($result, MYSQLI_NUM)){ //если дальше идет обработка индексного массива
    ...
    }
    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){ //если обработка как ассоциативного
    ...
    }


    UPD: а вообще, проверьте сам запрос, кажется у вас mysqli_query() возвращает false
    Ответ написан
  • Как из конструктора класса вернуть массив?

    @f_u_s_s
    Любопытный кодер
    Не уверен, но попробуйте вот так:
    class class1 {
        private $res;
        public function __construct() {
            $this->res[] = '1';
            $this->res[] = '2';
            return($this->res);
        }
    }


    а во втором файле:
    $result = new class1();
    print_r($result);


    А ошибки у вас во втором случае возникают из-за конструкции:
    $this->$res - замените ее как в моем примере выше на $this->res
    Ответ написан
    3 комментария
  • Почему ошибка при отсутствии необязательного модификатора доступа в классе PHP?

    @f_u_s_s
    Любопытный кодер
    Могу ошибаться, но документация говорит лишь о методах класса, а свойства в них не входят.
    Потому, если вы укажете
    class A {
    function foo(){
    // код метода
    }
    }

    То он будет определен как public, а для свойств надо явно указывать, т.е.
    class A {
    public $foo;
    
    }
    Ответ написан
    1 комментарий
  • Как организовать вывод из БД данных указанных через запятую?

    @f_u_s_s
    Любопытный кодер
    Я бы сделал отдельную таблицу, например images_to_category и в ней 2 колонки: image_id, category_id и прописывал каждую связь картинки с категорией отдельно в строку, т.е. если допустим изображение file.jpg имеет id 3 и находится в 3х категориях с id 7, 20 и 45 то в этой таблице были бы записи:

    image_id | category_id
    3 | 7
    3 | 20
    3 | 45

    а при выборке по нужной категории использовал бы JOIN. Например если я просматриваю категорию с id 7, то запрос должен уйти в базу примерно такой:

    SELECT i.id FROM images i
    JOIN images_to_category i2c ON i.id=i2c.image_id
    WHERE i2c = 7;


    И результатом были бы все id изображений, находящихся в категории с id 7. Как-то так.

    А вариант с LIKE слишком много подводных камней имеет, например: у вас куча категорий и вы открыли категорию с id 2. Запрос будет LIKE %2% и тогда вы получите изображения и из категорий с id 20, 12, 42, 102 и т.д.
    Ответ написан
    1 комментарий
  • Как сделать вывод meta-данных в opencart?

    @f_u_s_s
    Любопытный кодер
    Получение данных из БД в опенкарте производится в моделях. Посмотрите в контроллере какую модель он загружает и ищите ее в папке models.

    Все данные, которые выводятся в шаблонах, должны быть прописаны в контроллере в массив $data . Для мета данных, например, должно быть что-то типа
    $data['meta_description'] = ....;
    а в шаблоне в нужном месте код:
    <?php echo $meta_descriptrion; ?>
    Ответ написан
    Комментировать
  • Почему при изменении файла не меняется сайт?

    @f_u_s_s
    Любопытный кодер
    Для "хромовских" браузеров можно выключить кеширвоание - откройте консоль и перейдите в ней на вкладку "Network" и поставьте там галочку "Disable cache"
    Ответ написан
    Комментировать
  • Не отправляется письмо mail()?

    @f_u_s_s
    Любопытный кодер
    Лучше используйте SMTP-отправку, письма, отправленные через функцию mail() без должной настройки и ключа DKIM с большой вероятностью падают в спам, SMTP-отправка такой проблемы не имеет.
    Ответ написан
  • Wall.post в паблик вк на php?

    @f_u_s_s
    Любопытный кодер
    Нужно запрашивать токен с правами wall и groups, по схеме Implicit flow - т.е. в параметре redirect_uri указывать адрес https://oauth.vk.com/blank.html , либо не указывать вовсе. Я использовал такой подход: получал токен по такой схеме, а потом JS парсил адрес до символа # и записывал токен в бд, получал я его с правами group,wall,offline. Потом просто проверял его перед каждым постом, и если токен оказывался мертвым - проводил авторизацию снова. Единственное неудобство - приходилось просить пользователя копировать адрес из открывающегося окна авторизации, в кортором был токен. Иначе права на стену просто игнорируются. Такой подход вполне приемлем при варианте, когда один админ хочет делать кросспост при добавлении новостей на сайте. В остальных случаях - как-то надо выкручиваться иначе.
    Ответ написан
  • Send.php Почему не отправляются письма на ящик с сайта?

    @f_u_s_s
    Любопытный кодер
    попробуйте
    if((isset($_POST['phone'])&&$_POST['phone']!=""))
    заменить на
    if(!empty($_POST['phone']))

    а строчку
    mail($to, $subject, $message, $headers); //Отправка письма с помощью функции mail


    на что-то вроде такого:
    $send = mail($to, $subject, $message, $headers); 
    var_dump($send);


    И попробуйте отправить - если на странице появится строчка, что-то вроде
    bool(true)


    то письмо ушло и проблема не в скрипте, следует искать выше - настройки почтового сервера и т.д.
    Ответ написан
    Комментировать
  • Как обработать ответ от бд?

    @f_u_s_s
    Любопытный кодер
    if (mysqli_num_rows($res)>0)
       echo 'ДА';
    else 
       echo 'НЕТ';
    Ответ написан
    Комментировать
  • Как добавлять описания к загружаемым фотографиям в альбом VK?

    @f_u_s_s Автор вопроса
    Любопытный кодер
    В общем при загрузке пачкой - никак. Реализовал примерно так:
    при выборе изображений каждое добавляется в массив JS, затем по клику начинает работать рекурсивный таймер, который отправляет ajax запрос на PHP скрипт. После ответа от PHP, если все успешно - из массива удаляется это изображение и посылается следующее. И так, пока массив не кончится. Накладываются ограничения VK API на количество обращений в секунду, но ничего другого на ум не пришло.
    Код JS:
    function sendForm(items, group_id, album_id)
    	{
    
    			function ajaxQuery()
    			{
    				$.ajax({ 
    				            type: 'POST',   
    				            url: 'loader.php',    
    				            data: 'action=loadPhoto&group_id='+group_id+'&album_id='+album_id+'&items='+items.splice(0, qps),
    				            success: function(result){   
    				            	if (result == 'ok') {
    				              		item_selected = items.length;
    				              		checked.html(item_selected);
    				              		alert(result+" : "+loaded);
    				              	}
    				              	else
    				              		alert(result);
    				            }
    				    	});
    			}
    
    		$('body').append('<div class="loading">');
    		//осторожно - РЕКУРСИЯ
    		var timerId = setTimeout(function tick() {
    			if(items.length>0){
    				$.when(ajaxQuery()).done(function(){timerId = setTimeout(tick, 1200);});	//вот тут
    			}
    			else
    			{
    				clearTimeout(timerId);
    				alert("Выбранные товары загружены!");
    				loadItems(1);
    				loadPagesCount();
    				$('div.loading').remove();
    			}
    		}, 0);
    	}


    код файла loader.php
    require_once './functions.php';
    $func = new functions;
    
    if($_POST['action'] == 'loadPhoto' && !empty($_POST['group_id']) && !empty($_POST['album_id']) && !empty($_POST['items']))
    {
    	$images = explode(",", $_POST['items']);
    	for ($i=0; $i < count($images); $i++) { 
    		$photo_load = $func->uploadImages($images[$i], $_POST['group_id'], $_POST['album_id']);
    		if($photo_load)
    			$result = true;
    		else
    			$result = false;
    	}
    
    	if($result)
    		echo "ok";
    	else
    	{
    		echo "ERROR:";
    		print_r($photo_load);
    	}
    }


    функция uploadImages в классе functions.php:
    public static function uploadImages($file, $group_id, $album_id)
        {
    
            //Получаем сервер для загрузки изображения
            $params = array(
                'group_id'  =>   $group_id,
                'album_id'  =>   $album_id
                );
            $api_res = self::queryApi("photos.getUploadServer", $params);
    
            try
            {
                if($api_res)
                {
                    $server = $api_res->response->upload_url;
                    $post = array();
    
                        $query = self::$connection->query("SELECT * FROM `product`, `product_price` WHERE `product`.`product_id`='".$file."' AND `product_price`.`product_id`='".$file."';");
                        if($query)
                        {
                            while($row = $query->fetch_assoc())
                            {
                                if(!empty($row['product_full_image'])){
                                    if(file_exists(config::$full_path.'images/shop/product/'.$row['product_full_image'])){
                                        $img = $row['product_full_image'];
                                    }else{
                                        $img = 'no-image.jpg';
                                    }
                                }else if(!empty($row['product_thumb_image']))
                                {
                                    if(file_exists(config::$full_path.'images/shop/product/'.$row['product_thumb_image'])){
                                        $img = $row['product_thumb_image'];
                                    }else{
                                        $img = 'no-image.jpg';
                                    }
                                }else{
                                    $img = 'no-image.jpg'; 
                                }
    
                                $product_desc = $row['product_desc'];
                                $product_price = $row['product_price'];
    
                                //PHP 5.5+ use 'new CURLFile()' PHP 5.4- use @file_path
                                //$post['file1'] = new CURLFile(config::$full_path.'images/shop/product/'.$img);
                                $post['file1'] = '@'.config::$full_path.'images/shop/product/'.$img;
                            }
                        }else
                            throw new Exception("Ошибка при запросе в базу данных. Error: ".self::$connection->error, 1);
    
    
                    if($ch = curl_init($server))
                    {
                        curl_setopt($ch, CURLOPT_POST, true);
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                        curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
                        $json = json_decode(curl_exec($ch));
                        curl_close($ch);
    
                        $params_save = array(
                                'server'    =>  $json->server,
                                'photos_list'   =>  $json->photos_list,
                                'album_id'  =>  $album_id,
                                'hash'  =>  $json->hash,
                                'group_id'   =>  $group_id,
                                'caption'   =>  $product_desc.' Цена: '. $product_price . 'руб.'
                            );
    
                        $photo_save = self::queryApi('photos.save', $params_save);
    
                        if($photo_save)
                        {
                            return $photo_save;
                        }
                        else throw new Exception("При сохранении фотографий в альбом произошла ошибка.", 1);
                    }
                    else throw new Exception("Ошибка инициализации cURL", 1);
                }
                else throw new Exception("При обращении к API photos.getUploadServer произошла ошибка.", 1);
            }catch(Exception $e){
                echo $e->getMessage();
                return false;
            }
        }


    Надеюсь, что мой способ поможет кому-нибудь )

    ЗЫ: в моем случае передавались ID товаров в БД, по которым затем вытаскивалось изображение.
    Ответ написан
    Комментировать
  • Обязательно ли указывать адрес отправителя в php скрипте отправки на почту?

    @f_u_s_s
    Любопытный кодер
    Лучше использовать SMTP-отправку. Письма отправленные функция PHP mail() с большой вероятностью попадут в спам, либо вообще не дойдут, т.к. почтовый сервис может их отлавливать. К тому же не все хостеры вообще включают эту функцию на своих серверах.

    Самый распространенный и действенный способ (да и проверенный) - PHPMailer. Вот тут можете посмотреть как работать с этой штукой
    Ответ написан
    Комментировать
  • Как добавить строку в массив?

    @f_u_s_s
    Любопытный кодер
    если несколько элементов - то
    array_push($array, 'string1', 'string2', ... , 'stringN');

    Если элемент один - то лучше использовать конструкцию
    array[] = 'string';
    пошустрее работать будет
    Ответ написан
    Комментировать