В пыхе отсутствует поддержка 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 }
Замените "***91;" на "[" и "***93;" на "]".
Для таких наркоманских случаев необходимости мэппинга существует тип поля ENUM.
У мускула (марии) есть кэш запросов. Если это не самый убитый шаред-хостинг со странными конфигами, то место в кэше для вас будет и повторяющиеся запросы закэшируются. Из ваших 300 человек реально выборка отработает только у одного, остальным вернётся готовая запись из оперативы.
Зачем? Один дополнительный SQL запрос к таблице с вопросами не даст заметной нагрузки.
Нет необходимости, в ответе 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 целиком на пастебин.
Судя по сорцу, выхлоп можно запихнуть в $reg_error в виде "$reg_error .= print_r($_REQUEST, true);". В данном случае вызов "die;" не нужен.