Mad_Man

Mad_Man
Рейтинг
162
Регистрация
10.11.2008
Интересы
Рыбалка
Born USSR

В пыхе отсутствует поддержка UTF-8 по дефолту, все стандартные обращения к строкам идут как к однобайтовой кодировке. Ниже куски кода с примерами из моей либы, можете организовать доступ по аналогии, вызывая метод `char`.


/**
* @en Return specific character from the string
* @ru Возвращает указанный символ из строки
*
* $string_ASCII = 'ASCII string example'; # string(20) "ASCII string example"
* $string_UTF8 = 'UTF-8 string πράδειγμα'; # string(31) "UTF-8 string πράδειγμα"
*
* $char = string::char($string_ASCII, 14); # string(1) "e"
* $char = string::char($string_ASCII, 15); # string(1) "x"
* $char = string::char($string_ASCII, 16); # string(1) "a"
*
* $char = string::char($string_UTF8, 14); # string(2) "π"
* $char = string::char($string_UTF8, 15); # string(2) "ρ"
* $char = string::char($string_UTF8, 16); # string(2) "ά"
*
* @param string $string Any string
* @param int $number Character number in the range from 1 to n (string length)
*
* @return string
*/
public static function char($string, $number)
{
return string::read($string, 1, $number - 1);
}


/**
* @en Return part of a string with a specific length in characters
* @ru Возвращает часть строки с указанной длиной и смещением
*
* $string_ASCII = 'ASCII string example'; # string(20) "ASCII string example"
* $string_UTF8 = 'UTF-8 string πράδειγμα'; # string(31) "UTF-8 string πράδειγμα"
*
* $result = string::read($string_ASCII, 5, 13); # string(5) "examp"
* $result = string::read($string_UTF8, 5, 13); # string(10) "πράδε"
*
* @param string $string Any string
* @param int $length Substring length to read
* @param int $offset String offset
*
* @return string
*/
public static function read($string, $length = null, $offset = 0)
{
if (string::is_utf8($string))
{
return mb_substr($string, $offset, $length, 'UTF-8');
}

return substr($string, $offset, $length);
}


/**
* @en Detect charset of string
* @ru Определяет кодировку строки
*
* $is_utf8 = string::is_utf8('ABCDEFАБВГДЕ'); # bool(true)
*
* @param $string
*
* @return bool
*/
public static function is_utf8($string)
{
########################################################################################
# 1. Any UTF8 string is a valid 8-bit encoding string (even if it produces gibberish); #
# 2. On the other hand, most 8-bit encoded strings with extended (128+) characters are #
# not valid UTF8, but, as any other random byte sequence, they might happen to be; #
# 3. Of course, any ASCII text is valid UTF8; #
# 4. Native mb_detect_encoding() is slow. #
########################################################################################

if (preg_match('//u', $string))
{
return true; # it's UTF-8
}

return false; # it's something else
}
yawell:
получила ошибку

Parse error: syntax error, unexpected '*', expecting ',' or ')'

Замените "***91;" на "[" и "***93;" на "]".

imaxwell:
надо прировнять верхнее женское белье к 1, а нижнее женское белье к 2 и занести в базу цифрами

Для таких наркоманских случаев необходимости мэппинга существует тип поля ENUM.

MusicJam:
У меня всплывающая форма регистрации на всех страницах, а теперь представьте если будет одновременно 300 человек находиться на сайте, и на каждой странице будет SQL запрос...

У мускула (марии) есть кэш запросов. Если это не самый убитый шаред-хостинг со странными конфигами, то место в кэше для вас будет и повторяющиеся запросы закэшируются. Из ваших 300 человек реально выборка отработает только у одного, остальным вернётся готовая запись из оперативы.

MusicJam:
ой... для меня это дебри... придётся наверное убрать и вовсе этот вопрос-ответ

Зачем? Один дополнительный SQL запрос к таблице с вопросами не даст заметной нагрузки.

MusicJam:
Mad_Man, сейчас сделаю

Нет необходимости, в ответе LovelAss'а указан отсутствующий кусок логики из-за которого валидация "if ( intval($_SESSION['question']) ) {" не проходит. Избавиться от SQL запроса для всплывашки, которая и так планируется на каждой странице, вы сможете либо хардкодом (как вам советовали здесь, но сие есть неправильно) с указанием id вопроса руками, либо через AJAX запросы при вызове формы через .php-прослойку.

burunduk, мой айпишник 93.85.170.4, ОСь ArchLinux. Жду кражи века.

"Неверный ответ на контрольный вопрос" соответствует "reg_err_25", который относится к куску кода


if( $config['reg_question'] ) {

if ( intval($_SESSION['question']) ) {

$answer = $db->super_query("SELECT id, answer FROM " . PREFIX . "_question WHERE id='".intval($_SESSION['question'])."'");

$answers = explode( "\n", $answer['answer'] );

$pass_answer = false;

if( function_exists('mb_strtolower') ) {
$question_answer = trim(mb_strtolower($_POST['question_answer'], $config['charset']));
} else {
$question_answer = trim(strtolower($_POST['question_answer']));
}

if( count($answers) AND $question_answer ) {
foreach( $answers as $answer ){

if( function_exists('mb_strtolower') ) {
$answer = trim(mb_strtolower($answer, $config['charset']));
} else {
$answer = trim(strtolower($answer));
}

if( $answer AND $answer == $question_answer ) {
$pass_answer = true;
break;
}
}
}

if( !$pass_answer ) $reg_error .= $lang['reg_err_25'];

} else $reg_error .= $lang['reg_err_25'];

}

Перед строкой "if ( intval($_SESSION['question']) ) {" вставьте "$reg_error .= 'question value = ' . print_r($_SESSION['question'], true);", после чего сюда скиньте результат, повторив процедуру регистрации.

MusicJam, залейте register.php целиком на пастебин.

MusicJam:
Добавил в шапку файла, никакой инфо о переменной не увидел, ни в исходном коде страницы, ни наглядно :(

Судя по сорцу, выхлоп можно запихнуть в $reg_error в виде "$reg_error .= print_r($_REQUEST, true);". В данном случае вызов "die;" не нужен.

Всего: 4397