Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2011, 15:49   #1
N-Cat
Пользователь
 
Регистрация: 23.02.2011
Сообщений: 21
По умолчанию Проблемы с кодировкой и sql'ем

Добрый день!

Имеется php- скрипт, который принемает GET и POST параметры и соответствующим образом заносит их в БД.
В какой кодировке приходят данные - заранее неизвестно.
При попытке добавления данных с кириллицей sql возвращает ошибку 1366 Incorrect string value, соответственно не принимает(
Подскажите можно как-то решить проблему?
N-Cat вне форума Ответить с цитированием
Старый 13.07.2011, 15:54   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

покажите код .... экстрасенсов нет
ADSoft вне форума Ответить с цитированием
Старый 13.07.2011, 16:27   #3
N-Cat
Пользователь
 
Регистрация: 23.02.2011
Сообщений: 21
По умолчанию

Извините, не подумала
Вот самое простое:


Код:
$details = mysql_real_escape_string($_GET['details'], $db); 
if( strlen($details) == 0)
{
	$details = mysql_real_escape_string($_POST['details'], $db);
    
}
$sql = "REPLACE INTO tests(details) 
		VALUES('$details')";

if(!mysql_query($sql))
	{  
	    echo mysql_errno($db);
		echo '<br>';
		echo 'Error Replace!';
	}
	else 
	{
		echo 'Ok Replace!';
	}
N-Cat вне форума Ответить с цитированием
Старый 13.07.2011, 16:42   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

$sql = "REPLACE INTO tests(details) VALUES('$details')";
странно как то заносите... какая БД ? MySQL ?
обычно если добавляют - то пишут нечто вроде такого

Код:
insert into tests (details) values ($details)
при обновлении

Код:
update tests set details = $details where условие
ну необходимо позаботиться чтобы заносимая строка была уже экранирована от кавычек....
и перед выполнением запроса - сделайте echo $sql чтоб посмотреть какой запрос пытаетесь выполнить
ADSoft вне форума Ответить с цитированием
Старый 13.07.2011, 17:01   #5
N-Cat
Пользователь
 
Регистрация: 23.02.2011
Сообщений: 21
По умолчанию

Запросы обрабатываются корректно, это все проверено и действует.
Но если пробовать передать, например, русские буквы - не пускает.

если использовать перекодировку:
$details = iconv("UTF-8", "CP1251//IGNORE", $details);

то реплейсится без проблем. Но беда в том, что я заранее не знаю в какой кодировке придут данные

Пользуюсь MySql, да
N-Cat вне форума Ответить с цитированием
Старый 13.07.2011, 17:32   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от N-Cat Посмотреть сообщение
Но беда в том, что я заранее не знаю в какой кодировке придут данные
Данные приходят с других(разных) сайтов, что-ли?

UTF-8 должно быть везде - и на сайте, и в БД.

Только вот такими затыками и можно приучить программеров к Unicode - по-другому никак...
Попарятся дня 2-3 с конфликтами кодировок - и перескакивают на UTF как миленькие ( ну, по-крайней мере, кто поумней... )
Andkorol вне форума Ответить с цитированием
Старый 13.07.2011, 17:49   #7
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Теоретически - можно относительно успешно различать тот же ютф8/ютф16/вин1251. Словарём, языком, брутфорсом и божьим словом можно отличать даже кои8р от вин1521. Но это достаточно сложная задача, и первое, о чем задумываешься, когда начинаешь её решать - "а оно надо ?".
Если есть возможность редактировать страницы, отправляющие данные - всех в ютф8 и не мучаться.

PS:
А зачем вы так извращаетесь с постом и гетом ?

можно ж
PHP код:
$details = isset($_REQUEST['details'])?$_REQUEST['details']:'';
if (
$details=="") die("Сам дурак :)");
$details mysql_real_escape_string($details$db); 
UPD: Сорри, действительно пропустил ещё одно "=" в строке if ($details=="") должно быть if ($details==="")

Последний раз редактировалось graymaster; 14.07.2011 в 14:00. Причина: Апдейт
graymaster вне форума Ответить с цитированием
Старый 13.07.2011, 18:07   #8
Minus_yu
Чатланин!
Форумчанин
 
Аватар для Minus_yu
 
Регистрация: 20.11.2010
Сообщений: 140
По умолчанию

Цитата:
Сообщение от graymaster Посмотреть сообщение
PHP код:
if ($details==""
вот это круто!
Minus_yu вне форума Ответить с цитированием
Старый 14.07.2011, 07:03   #9
mrgrudge
Форумчанин
 
Аватар для mrgrudge
 
Регистрация: 20.02.2010
Сообщений: 229
По умолчанию

+1 про перевод все в UTF-8, это намного прощще чем извращаться с выяснениями кодировки входящих параметров.
+Проверьте в какой кодировке сами php и html файлы.(Желательно чтоб это была UTF-8 =) )
Офтопом, +1 про странность запроса, чем вам не угодил более удобный UPDATE и INSERT?))
думай как баг, действуй как баг, и ты найдешь баг )
mrgrudge вне форума Ответить с цитированием
Старый 14.07.2011, 11:32   #10
N-Cat
Пользователь
 
Регистрация: 23.02.2011
Сообщений: 21
По умолчанию

Апдейт и Инсерт не угодил особенностью запросов)
У меня не сайт, а система мониторинга) И реплейс удобен тем, что работает и как инсерт и как апдейт, в зависимости от данных

По поводу кодировки спасибо за советы) Вроде договорились что все в UTF-8 будут переводить перед посылкой. Это действительно целесообразнее)

graymaster спасибо за пример кода! Заменю $_REQUEST)
N-Cat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с кодировкой. Jakethefish PHP 2 14.04.2011 15:58
Проблемы с кодировкой! bookkc PHP 5 17.05.2009 22:25
Проблемы с кодировкой? [Smarik] БД в Delphi 35 15.02.2009 15:32
Проблемы с кодировкой LAGOX PHP 7 14.02.2009 15:13
Проблемы с кодировкой Levchik HTML и CSS 2 16.12.2008 16:12