Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Добрый день.
Есть функция, возвращающая имя-отчество клиента (2 слова через пробел).
Она берет ФИО, ищет И и О и возвращает их, отсекая фамилию. Ничего особого.
Вопрос следующий:
при выполнении её напрямую на сервере (через ssh, скажем), она возвращает в result правильное значение (т.е. "Имя Отчество").
Когда выполняешь тот же запрос через связку php+mysql, и делаешь $db->sql_fetchrow(), в значении пропадает отчество, т.е. возвращается только "Имя" (видимо, строка до пробела). С другими подобными значениями проблем нет, всё возврщается как надо.
Никакие set charset/collation, cast(get_user_io() as char()) дела не меняют.
Подскажите, пожалуйста, в какую сторону можно смотреть в данном случае.
Неактивен
Видимо, все-таки, какие-то куски кода надо показать, потому как обычно
такого не бывает. Я бы рекомендовал попробовать сделать этот запрос
через обычный mysql_query и посмотреть, в связке ли дело. Очень большое
подозрение на Вашу обвязку PHP.
Неактивен
Код:
$rr=$db->sql_query("select get_user_io(532) as x,'Иван Иванович' as x2");
$r=$db->sql_fetchrow($rr);
print "<pre>"; print_r($r); print "</pre><br>";
unset($r);
$rr=mysql_query("select get_user_io(532) as x,'Иван Иванович' as x2");
$r=mysql_fetch_assoc($rr);
print "<pre>"; print_r($r); print "</pre>";
в классе $db sql_fetchrow - ничего особенного, обычный mysql_fetch_assoc внутри
---
результат:
Array
(
[x] => Валерий
[x2] => Иван Иванович
)
Array
(
[x] => Валерий
[x2] => Иван Иванович
)
--
в то же время, если делать тот же запрос при прямом подключении к mysql серверу, результат "Валерий Валерьевич", т.е. именно то, что функция и возвращает.
Вот я и не могу понять, почему после пробела съедается возвращаемое функцией значение
Отредактированно Валерий (20.05.2010 17:27:16)
Неактивен
Понятно, что можно в принципе поменять одну функцию на две, get_user_name() и get_user_otch(), и делать просто concat(), но интересен сам факт очень странного "прикола"
Неактивен
Хм. А код get_user_io?
Неактивен
Функция:
create definer=`database`@`%` function `get_user_io`(user_id int) returns varchar(255) charset cp1251
begin
call get_userio(user_id,@user_io);
return @user_io;
end$$
ХП:
create definer=`database`@`%` procedure `get_userio`(in user_id int, out user_io varchar(250) charset cp1251)
select if(t2.name is not null,concat(if(instr(substring(t1.name,instr(t1.name,' ')+1,200),t2.name)=1 and substring(reverse(substring(t1.name,instr(t1.name,' ')+1,100)),1,3) in ('анв','чив'),trim(substring(t1.name,instr(t1.name,' ')+1,100)),t2.name)),t1.name) into user_io from database_user t1
left join database_names_base t2 on t2.name=trim(substring(substring(t1.name,instr(t1.name,' ')+1,100),1,if(instr(substring(t1.name,instr(t1.name,' ')+1,100),' ')!=0,instr(substring(t1.name,instr(t1.name,' ')+1,100),' '),100)))
where t1.id=user_id$$
Неактивен
Ничего себе процедурка А почему не в функции сразу?
У пользователя 532, случаем, t2.name не NULL?
Неактивен
Нет, там значение "Иванов Валерий Валерьевич", простой varchar.
В процедуре ничего особого - просто много instr и substring, а по сути, берётся часть строки.
И Имя Отчество она возвращает исправно, но отчество куда-то теряется.
По-поводу функции - без ХП будет быстрее работать?
Можете написать любой пример функции, которая возвращает несколько значений прямо из запроса?
Неактивен
Ну, быстрее, наверное, нет, но просто странная последовательность.
Функция возвращает одно значение. Но в Вашем случае оно ведь одно?
Честно не знаю, почему так. Видимо, MySQL отрабатывает исправно, а
обрезается уже со стороны PHP. Но почему обрезается — ума не приложу.
Я бы попробовал:
1. Использовать какой-то другой клиент (perl, python, etc), чтобы определить,
что ошибка не в libmysqlclient, а точно в php.
2. В php попробовал бы использовать mysqli, если под $db лежит обычный
mysql_connect, или, соответственно, наоборот — возможно, другая реализация
отработает нормально.
Неактивен
Часть 1:
$res=$mysqli->query("select get_user_io(532) as x,'Иван Иванович' as x2");
while ($row = $res->fetch_assoc()) {
printf ("%s // %s\n", $row["x"], $row["x2"]);
}
$res->close();
результата не принесла, на выходе "Валерий // Иван Иванович"
Попробую, наверное, через perl.
Давно можно было решить вопрос какими угодно изменениями, но сейчас уже просто из принципе интересно, в чём именно прикол.
Неактивен
paulus написал:
Ну, быстрее, наверное, нет, но просто странная последовательность.
Функция возвращает одно значение. Но в Вашем случае оно ведь одно?
Да, у меня одно. Просто так как-то исторически повелось, что делаю ХП, её результат запрашивает функция, и уже через select отдаёт.
Если можете написать как напрямую можно вернуть из запроса в функции возвращаемое внутренним запросом значение - буду благодарен Я просто не в курсе такого синтаксиса, к сожалению.
Неактивен
[celestia] root test > create function test () returns int return (select 1); Query OK, 0 rows affected (0.00 sec) [celestia] root test > select test(); +--------+ | test() | +--------+ | 1 | +--------+ 1 row in set (0.00 sec)
Расскажите, работает ли в perl. Интересно, что случилось.
Неактивен
По функции - спасибо, ясно. Сделал без ХП, ничего от этого не изменилось.
Запустил ещё тот же скрипт на php на машине IIS - результат тот же, что и на Apache. Или библиотека у них одинаковая, либо дело вообще не в ней.
Чуть-чуть позже попробую через perl.
Неактивен
Страниц: 1