Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: На локальном хосте работает, на реальном - нет. Почему?
 
 автор: coloboc66   (31.05.2007 в 10:43)   письмо автору
 
 

Имеются ввиду в основном проблемы с кодировками (на реальном хосте стоит русский апач.). Я думал, что решу их так: на локальном хосте (у меня денвер) отлажу скрипт, загружу его на хостинг и в .htaccess напишу:
CharsetDisable On
Но оказывается, что с помощью этой директивы проблема решается только частично. Например: на локальном хосте ввожу в сообщение в чате слеш \ и просматриваю введенный текст с помощью echo $_POST['text'] Все нормально - вижу один слеш. На реальном хосте в аналогичной ситуации вместо одного слеша вижу два. Вторая проблема: на локальном хосте функция разбиения длинной строки на кириллице работает, на реальном - нет.

   
 
 автор: kasmanaft   (31.05.2007 в 10:50)   письмо автору
 
   для: coloboc66   (31.05.2007 в 10:43)
 

> На реальном хосте в аналогичной ситуации вместо одного слеша вижу два.
Вот, это наверное, магические кавычки натворили.

> на локальном хосте функция работает, на реальном - нет.
Скорее всего на риальном выставлена неправильная локаль.
Поменять можно с помощью setlocale, узнать на что менять можно у техсупорта (нужна рус. локаль)

   
 
 автор: coloboc66   (31.05.2007 в 10:52)   письмо автору
 
   для: kasmanaft   (31.05.2007 в 10:50)
 

Что за магические кавычки, зачем они нужны и как с ними бороться в моей ситуации?
Что означает: "на реальном хосте выставлена неправильная локаль"?

   
 
 автор: cheops   (31.05.2007 в 11:05)   письмо автору
 
   для: coloboc66   (31.05.2007 в 10:52)
 

>Что за магические кавычки, зачем они нужны и как с ними бороться в моей ситуации?
<?php
  
if (get_magic_quotes_gpc())
  {
    
$_POST['text'] = stripslashes($_POST['text']);
  }
?>

   
 
 автор: Valick   (31.05.2007 в 11:14)   письмо автору
 
   для: cheops   (31.05.2007 в 11:05)
 

Или так:

function my_addslashes($string) 

return (get_magic_quotes_gpc()==1) ? $string : addslashes($string); 
}

   
 
 автор: coloboc66   (31.05.2007 в 11:21)   письмо автору
 
   для: cheops   (31.05.2007 в 11:05)
 

После установки кода хеопса, если ввожу один слэш, то все нормально, если больше одного - опять работа нарушается.

   
 
 автор: kasmanaft   (31.05.2007 в 11:13)   письмо автору
 
   для: coloboc66   (31.05.2007 в 10:52)
 

> Что означает: "на реальном хосте выставлена неправильная локаль"?
Я такого не говорил :D
Ну не знаю... отличная от той, что стоит на локальном.

В программировании, локаль (англ. locale) — это набор параметров, включая набор символов,
язык пользователя, страну, часовой пояс, а также другие предустановки, которые пользователь
ожидает видеть в пользовательском интерфейсе.


Магические кавычки нужны для экранирования обратных слешей и кавычек строк, полученных POST или GET методом. Предполагались как защита от SQL-инъекции.

Проверить включены они или нет можно с помощью ф-ии get_magic_quotes_gpc(). Если выключены, строку стоит обработать вручную.

Поискайте по форуму, если что не понятно.

   
 
 автор: Trianon   (31.05.2007 в 11:39)   письмо автору
 
   для: kasmanaft   (31.05.2007 в 11:13)
 

>Проверить включены они или нет можно с помощью ф-ии get_magic_quotes_gpc(). Если выключены, строку стоит обработать вручную.

вреднейшее заблуждение.

Если они включены - надо выключить.
На случай, если не получается выключить - при включенных кавычках - нужно обработать строку обратно (как показал cheops).
Обрабатывать же строки "вручную" при дальнейших манипуляциях, связанных со сменой языка, нужно в любом случае.

У colobok66 явно меняется язык... И он эту точку принятия решения упускает.
Но кто сказал, что следующий язык - это именно язык литеральных констант MySQL (JS)?

   
 
 автор: coloboc66   (31.05.2007 в 11:50)   письмо автору
 
   для: kasmanaft   (31.05.2007 в 11:13)
 

А в .htaccess можно магические кавычки выключить?

   
 
 автор: kasmanaft   (31.05.2007 в 18:56)   письмо автору
 
   для: coloboc66   (31.05.2007 в 11:50)
 

Попробуйте написать в него
php_flag magic_quotes_gpc off

   
 
 автор: Trianon   (31.05.2007 в 11:41)   письмо автору
 
   для: coloboc66   (31.05.2007 в 10:43)
 

А что Вы делаете с этой строкой дальше?
Просмотреть echo $_POST['text'] можно только при отладке. А истинная цель?

   
 
 автор: coloboc66   (31.05.2007 в 11:52)   письмо автору
 
   для: Trianon   (31.05.2007 в 11:41)
 

Дальше записываю её в файл. Принцип работы моего чата таков: с заданной периодичностью броузер отправляет на сервер самую свежую (последнюю ) строку из загруженных с сервера, а на сервере эта строка сравнивается со строками, находящимися в файле сообщений, и если есть строки, более свежие, чем эта, то сервер отправляет эти строки броузеру...

   
 
 автор: Trianon   (31.05.2007 в 12:38)   письмо автору
 
   для: coloboc66   (31.05.2007 в 11:52)
 

А дальше Вы её из файла читаете и отправляете с сервера - клиенту. .
Каким образом?

   
 
 автор: coloboc66   (31.05.2007 в 14:17)   письмо автору
 
   для: Trianon   (31.05.2007 в 12:38)
 

В файле index.php находится текстареа для вводимого сообщения. Кодировка файла: windows-1251. По причине использования аякса для отправки и приема данных для кроссбраузерности отсылаемую строку перед отправкой кодирую в encodeURIComponent(). В файле send.php с header("Content-type: text/plain; charset=UTF-8") записываю эту строку в файл:
Файл send.php

header("Content-type: text/plain; charset=UTF-8"); 
$text=$_POST['send'];
$text=htmlspecialchars(stripslashes($text));
$text = preg_replace_callback("|(\w{30,})|","split_text",$text);
$text=$_SESSION['user'].': '.$text."[".$today."]"."\r\n";
fwrite($fp,$text);
function split_text($matches) 
{
  return wordwrap($matches[1], 20, ' ',1);
}

Файле index.php с некоторой периодичностью отправляет файлу becom.php последнюю строку из загруженных в филдсет (или строку "null", если ни одного сообщения не загружено).
Файл becom.php

header("Content-type: text/plain; charset=UTF-8");
$a=$_POST['resp'];
for($i=0;$i<count($msg);$i++)
    {
       if(@strstr($msg[$i],$a)!==false) //если последнее сообщение, принятое от броузера, совпадает с одним из имеющихся в файле
       {
        searsh($i,$msg);//вызываем функцию поиска в файле сообщений, более свежих, чем принятое
       } 
function searsh($k;$msg)    
{     
for($i=0;$i<count($msg1);$i++)
{
$value=$msg1[$i];
 $value=nl2br($value);
 echo "<span>".$value."</span>";
}
}

В файле index.php сообщение, полученное от becom.php , обрабатывается с помощью decodeURIComponent() и записывается в филдсет.
На локальном хосте все работает, на реальном (с русским апачем) выявил две проблемы:
1. При вводе слеша \ он записывается в файл и выводится в филдсет, все последующие сообщения в файл записываются, но броузеру не отправляются.
echo get_magic_quotes_gpc(); на реальном хосте выдает 1, на локальном выдает 0.
Как можно её выключить?
2. Функция разбиения длинной строки в файле send.php на реальном хосте с кириллицей не работает.

   
 
 автор: Trianon   (31.05.2007 в 19:14)   письмо автору
 
   для: coloboc66   (31.05.2007 в 14:17)
 


$text=$_POST['send']; 
$text=htmlspecialchars(stripslashes($text)); 

htmlspecialchars(stripslashes зачем здесь?




echo "<span>".$value."</span>"; 

И почему htmlspecialchars() нет здесь?

   
 
 автор: mihdan   (31.05.2007 в 18:15)   письмо автору
 
   для: coloboc66   (31.05.2007 в 10:43)
 

setlocale(), stripslashes()

   
 
 автор: coloboc66   (01.06.2007 в 12:55)   письмо автору
 
   для: mihdan   (31.05.2007 в 18:15)
 

$text=htmlspecialchars(stripslashes($text)); - здесь stripslashes убрал
Проблему с магическими кавычками решил - их нужно было проверять (как говорил Хеопс) не в одном файле (send.php), а в двух (becom.php)
Осталась проблема с нарезкой длинной строки на кириллице. Вот эта функция на латинице работает, а на кириллице - нет:

$text=htmlspecialchars($_POST['text']);
$text = preg_replace_callback("|(\w{30,})|","split_text",$text);
function split_text($matches) 
{
  return wordwrap($matches[1], 20, ' ',1);

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования