На хостинге не работает самописная PHP функция?

Есть функция, которая переводить некоторые блоки текста:

<?php
function translate($rus,$eng)
{
	$lang = $_GET['lang'];
	$cookie_fresh = mktime(23,59,59,12,31,date('Y')+1);
	
	if ($lang == 'eng')
	{
		setcookie('lang', 'eng', $cookie_fresh);
		header("Location: ./");
	}
	if (($lang == 'rus') or (!isset($_COOKIE['lang'])))
	{
		setcookie('lang', 'rus', $cookie_fresh);
		header("Location: ./");
	}
	
	if ($_COOKIE['lang'] == 'eng')
	{
		echo $eng;
	}
	if ($_COOKIE['lang'] == 'rus')
	{
		echo $rus;
	}
	return true;	
}
?>



Преобразование происходит так:

<?php translate('Русские буквы', 'English words'); ?>



На LAMP'e, на локалке, всё тип топ. Но, когда заливаю на виртуальный хостинг, никакой текст не отображается. В чем может быть проблема?
  • Вопрос задан
  • 4005 просмотров
Решения вопроса 1
alexxxst
@alexxxst
error_reporting(E_ALL);
ini_set('display_errors', true);
Ответ написан
Пригласить эксперта
Ответы на вопрос 9
Shvonder
@Shvonder
Мой вариантик для разминки ума:
function translate($rus, $eng)
{
	static $lang;
	if (isset($_GET['lang']))
	{
		$lang = $_GET['lang'] == 'eng' ? 'eng' : 'rus';
		setcookie('lang', $lang, time() + 3600 * 24 * 365, '/');
		unset($_GET['lang']);
	}
	elseif (empty($lang))
		$lang = $_COOKIE['lang'] == 'eng' ? 'eng' : 'rus';
	echo $$lang;	
}
Ответ написан
shushu
@shushu
Функции setcookie и header должны выполняться ДО любого вывода (echo, print, var_dump, print_r… etc)
А также советую обзавестись флагом, что бы куки ставились 1 раз.
Хотя лучше после header(«Location: ./»); выполнять exit();

как то так:
<?php
function translate($rus,$eng)
{
	$lang = $_GET['lang'];
	$cookie_fresh = mktime(23,59,59,12,31,date('Y')+1);
	
	$c_lang = isset( $_COOKIE['lang'] ) ? $_COOKIE['lang'] : 'ru';
	
	if ( $lang == 'eng' && $c_lang != $lang )
	{
		setcookie('lang', 'eng', $cookie_fresh);
		header("Location: ./");
		exit();
	}
	if ($c_lang != $lang && ($lang == 'rus' or !isset($_COOKIE['lang'])))
	{
		setcookie('lang', 'rus', $cookie_fresh);
		header("Location: ./");
		exit();
	}
	
	switch( $_COOKIE['lang'] ){
		case 'eng':
			echo $eng;
		break;
		case 'ru':
			echo $rus;
		break;
		
	}
	return true;	
}
?>
Ответ написан
@Horzerus
1) В самом начале скрипта напишите вызов функции:
ob_start();
чтобы весь вывод кешировался и возвращался браузеру в конце работы скрипта.
Это поможет избавиться от warning-ов «Cannot modify header information...», чтобы они пока не мешались…
Если всеравно такие warnings будут, то значит что-то все-таки выводится перед вызовом ob_start(). Например, что-то может быть перед первым "<?php" (это могут быть невидивые символы utf8)

2) Сама по себе функция «не работать» не может, если она объявлена и вызывается. Поэтому просто «дебажте код» — добавьте во все ключевые места (перед вызовом, в самой функции в начале вызова, в тело if которые должно выполниться и т.д.) echo «XX\n»;
XX — числа по порядку или слова. И проанализируйте, что будет выведено.

Если нету других способов дебага, то этот способ помогает быстро локализовать место, где код невыполняется как хотелось бы…

Также, может помочь вывод var_dump($_COOKIE); чтобы быть уверенным что кука пришла от браузера.

И еще, на всякий случай, в строке:
$lang = $_GET['lang'];
если атрибут «lang» не передан в URL, то в этом месте будет ошибчка — нет такого index в массиве.
Надо бы, по хорошему, что-то типа этого:
$lang = isset($_GET['lang'])? $_GET['lang']: '';
Ответ написан
disc
@disc
веб-разработчик
Наверное проблема в том, что не инклудится файл с фукнцией.
Ответ написан
Shvonder
@Shvonder
Проверьте, правильное ли время на сервере? Правильное ли на компьютере?
Ответ написан
@Bruteo
$lang = $_GET['lang'];
заменить на $_COOKIE['lang']
Ответ написан
taliban
@taliban
php программист
На сколько я знаю функция setcookie не изменяет массив $_COOKIE дальше в скрипте, лишь после перезагрузки, возможно в этом дело.
Ответ написан
Комментировать
@DileSoft
header(«Location: ./»); — вот это меня сильно пугает. Лучше используйте абсолютный путь.
Ответ написан
Комментировать
@MNX
Внесу свою лепту — возможно дело в UTF-8 BOM.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы