SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.10.2009 23:12:53

colonel
Участник
Зарегистрирован: 20.10.2009
Сообщений: 11

Хранимые процедуры + PHP

Всем привет, помогите разобраться с хп.

Простой пример:

CREATE PROCEDURE select_data (in id int, out result int)
BEGIN
SET @rs = concat('select name from names where id=', id);
PREPARE rs FROM @rs;
EXECUTE rs;
SET result = rs;
END

Правильно ли он написан?

Теперь я так понимаю, что из PHP мне нужно вызвать хп так: call select_data(1, @result); ?
А как теперь получить в PHP @result - чтобы дальше с ним работать?

Спасибо.

-----
Deadangel is falling ...


Deadangel is falling ...

Неактивен

 

#2 21.10.2009 00:17:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимые процедуры + PHP

colonel написал:

Правильно ли он написан?

Нет. Вы можете в этом убедиться, создав свою процедуру и запустив её в консольном клиенте, например.
Таким образом имеет смысл отлаживать работу всех процедур, которые вы создаете.

delimiter $$
CREATE PROCEDURE select_data (in id int, out result varchar(255))
BEGIN
SET @rs = concat('select name into @res from a where id=', id);
PREPARE rs FROM @rs;
EXECUTE rs;
SET result = @res;
END$$

Но в данном случае это масло маслянное. Следующий вариант по сути является тем же самым
delimiter $$
CREATE PROCEDURE select_data (in id int)
BEGIN
SET @rs = concat('select name into @result from a where id=', id);
PREPARE rs FROM @rs;
EXECUTE rs;
END$$

colonel написал:

А как теперь получить в PHP @result - чтобы дальше с ним работать?

SELECT @result;

Неактивен

 

#3 21.10.2009 01:40:12

colonel
Участник
Зарегистрирован: 20.10.2009
Сообщений: 11

Re: Хранимые процедуры + PHP

vasya написал:

colonel написал:

Правильно ли он написан?

Нет. Вы можете в этом убедиться, создав свою процедуру и запустив её в консольном клиенте, например.
Таким образом имеет смысл отлаживать работу всех процедур, которые вы создаете.

delimiter $$
CREATE PROCEDURE select_data (in id int, out result varchar(255))
BEGIN
SET @rs = concat('select name into @res from a where id=', id);
PREPARE rs FROM @rs;
EXECUTE rs;
SET result = @res;
END$$

Но в данном случае это масло маслянное. Следующий вариант по сути является тем же самым
delimiter $$
CREATE PROCEDURE select_data (in id int)
BEGIN
SET @rs = concat('select name into @result from a where id=', id);
PREPARE rs FROM @rs;
EXECUTE rs;
END$$

colonel написал:

А как теперь получить в PHP @result - чтобы дальше с ним работать?

SELECT @result;

Да, спасибо, уже разобрался с этим. Но теперь возникли другие вопросы:
Например, как избавиться от такой ошибки:

Display width out of range for column '' (max = 255)

возникает при попытке создать процедуру. Я так понимаю, что идет превышение по длине строки. А как можно сделать перенос?

Спасибо.


Deadangel is falling ...

Неактивен

 

#4 21.10.2009 03:49:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимые процедуры + PHP

colonel написал:

Например, как избавиться от такой ошибки:

Display width out of range for column '' (max = 255)

возникает при попытке создать процедуру.

rollА это чья ошибка - MySQL или вашего приложения?   
Вы хоть код процедуры приведите.

Неактивен

 

#5 21.10.2009 04:08:33

colonel
Участник
Зарегистрирован: 20.10.2009
Сообщений: 11

Re: Хранимые процедуры + PHP

vasya написал:

colonel написал:

Например, как избавиться от такой ошибки:

Display width out of range for column '' (max = 255)

возникает при попытке создать процедуру.

rollА это чья ошибка - MySQL или вашего приложения?   
Вы хоть код процедуры приведите.

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

Еще раз спасибо за помощь.


Deadangel is falling ...

Неактивен

 

#6 21.10.2009 04:13:37

colonel
Участник
Зарегистрирован: 20.10.2009
Сообщений: 11

Re: Хранимые процедуры + PHP

Раз уж Вы так активно помогаете, не подскажете можно ли в процедуре использовать пустые значения по дефолту - как в PHP - что-то типа

CREATE PROCEDURE select_data (in id=0 int, in name="" varchar(255)

или может быть в теле самой процедуры? Т.е смысл такой, что если я вызываю функцию

call select_data(1)

, то у меня в самой процедуре переменная id=1, а name="", если я вызываю

call select_data(1, 'Alex')

, то у меня в самой процедуре переменная id=1, а name="Alex".

Спасибо.


Deadangel is falling ...

Неактивен

 

#7 21.10.2009 04:23:05

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимые процедуры + PHP

Нет, так нельзя.
Если вы вызовете процедуру с числом параметров меньше, чем было определено при создании, то будет ошибка.

Неактивен

 

#8 21.10.2009 04:40:52

colonel
Участник
Зарегистрирован: 20.10.2009
Сообщений: 11

Re: Хранимые процедуры + PHP

vasya написал:

Нет, так нельзя.
Если вы вызовете процедуру с числом параметров меньше, чем было определено при создании, то будет ошибка.

Да, я уже попробовал разными способами.

Еще раз спасибо.


Deadangel is falling ...

Неактивен

 

#9 21.10.2009 05:09:30

colonel
Участник
Зарегистрирован: 20.10.2009
Сообщений: 11

Re: Хранимые процедуры + PHP

vasya, а не подскажите, как я могу сделать множественный выбор и сохранить его в глобальную переменную (получается что это должен быть массив тогда, а массивы вроде не поддерживаются в хп).
например вот это не работает:

BEGIN
DECLARE hp1_ SMALLINT DEFAULT 0;
DECLARE hp2_ TINYINT DEFAULT 0;
DECLARE hp3_ TINYINT DEFAULT 0;
DECLARE hp4_ TINYINT DEFAULT 0;
DECLARE hp5_ SMALLINT DEFAULT 0;
SELECT hp1 INTO hp1_,  hp2 INTO hp2_, hp3 INTO hp3_, hp4 INTO hp4_, hp5 INTO hp5_ FROM table WHERE login = login_;
SET @hp1 = hp1_;
SET @hp2 = hp2_;
SET @hp3 = hp3_;
SET @hp4 = hp4_;
SET @hp5 = hp5_;
END

Спасибо.


Deadangel is falling ...

Неактивен

 

#10 21.10.2009 06:31:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимые процедуры + PHP

Вы можете сохранить данные во временную таблицу. Чем не массивwink

P.S. @hp5 - называется не глобальная, а пользовательская переменная.
P.P.S А каков сакральный смысл в присвоении значения сначала локальной переменной, а затем локальной переменной пользовательской переменной roll
Ведь  SELECT hp1 INTO @hp1, ... будет тоже самое.

Неактивен

 

#11 21.10.2009 07:14:56

colonel
Участник
Зарегистрирован: 20.10.2009
Сообщений: 11

Re: Хранимые процедуры + PHP

Ну я то не знал об этом ...
Вот вроде тут нашел подсказки, что для множественного выбора нужно использовать mysqli. Вот только я уже почти 1.5 часа бьюсь и ничего не выходит ... У Вас нет мыслей по этому поводу?

Нашел пример даже: MySQL Multiple Result Procs in PHP да вот все никак по нему сделать не могу ... Не поможете разобраться?

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

Спасибо.

Отредактированно colonel (21.10.2009 07:17:31)


Deadangel is falling ...

Неактивен

 

#12 21.10.2009 20:14:03

colonel
Участник
Зарегистрирован: 20.10.2009
Сообщений: 11

Re: Хранимые процедуры + PHP

а можно склеить имя переменной в хп со строкой:

CREATE PROCEDURE sp_get_news(in news_id varchar(50))
DECLARE result INT DEFAULT 0;
SELECT COUNT(*) INTO result FROM news WHERE id = news_id;
SET @(и вот здесь должна получиться переменная news3, которая образуется из "news" и news_id)

Спасибо.


Deadangel is falling ...

Неактивен

 

#13 21.10.2009 23:31:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимые процедуры + PHP

Если я правильно понял вашу мысль:

set @news3 = concat('news',news_id);

Неактивен

 

#14 22.10.2009 11:47:41

colonel
Участник
Зарегистрирован: 20.10.2009
Сообщений: 11

Re: Хранимые процедуры + PHP

Мысль то правильно поняли абсолютно, только вот теперь правильно ли я Вас понимаю:

CREATE PROCEDURE sp_get_news(in news_id varchar(50))
DECLARE result INT DEFAULT 0;
SELECT COUNT(*) INTO result FROM news WHERE id = news_id and name = 'Test';
SET @(и вот здесь должна получиться переменная news3, которая образуется из "news" и news_id)

допустим news_id=1
результат

SELECT COUNT(*) INTO result FROM news WHERE id = news_id and name = 'Test';

вернет мне, скажем 3.
после вызова call sp_get_news(1) я должен получить переменную такую: @news1 = 3.
Следуя Вашему совету, я так понимаю, что я должен сделать так:

CREATE PROCEDURE sp_get_news(in news_id varchar(50))
set @news3 = concat('news',news_id); - но это уже по определению вернет мне @news3, а мне нужно @news1 - для id=1, для id=2 - @news2, для id=3 - @news3, ....
SELECT COUNT(*) INTO @news3 FROM news WHERE id = news_id and name = 'Test';

но разве когда я сделаю:

set @news3 = concat('news',news_id); - @news3

а потом

SELECT COUNT(*) INTO @news3 FROM news WHERE id = news_id and name = 'Test';

у меня @news3 не перезапишется? и, у меня тогда на выходе получится @news3, а мне нужно @news1.

Отредактированно colonel (22.10.2009 12:06:12)


Deadangel is falling ...

Неактивен

 

#15 22.10.2009 21:13:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимые процедуры + PHP

Оказывается я вас неправильно понял.
Если мы заранее не знаем имя переменной, то единственный вариант использовать подготовленные выражения.

set @q = concat('set @news',news_id,' = ',result);
prepare qq from @q;
execute qq;
 

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson