2014-09-04 3 views
0

У меня есть таблица Users, и я получаю детали пользователя (обычный способ) с идентификатором.MySql quick user select

Вот как я получаю детали пользователей;

select id,kullaniciadi,FotoGet(K.Foto,K.Gender) from kullanicilar K where id=1; 

FotoGet функция всегда возвращая значение строки, как «Фотографии/ssss.jpg»

До сих пор я не проблема, чтобы использовать этот способ, но мне интересно, как я могу сделать это с помощью одной функции? Как

set @uid=1; 
Select UserGet(@uid); 

Я поставил id внутри круглых скобок и функция будет работать мой запрос на выборку и вернуть все столбцы детали пользователя. id,, FotoGet(K.id,K.Foto,K.Gender)

Могу ли я использовать этот способ для получения подробной информации?

+0

Почему -1? :(Это просто вопрос высокого уровня. Не то, что мы делаем? Задавая вопрос? Давай, ребята, пожалуйста, не судите по этому вопросу. – traBolics

+0

Не позволяйте нисходящим вас беспокоить. думает, что вопрос недействителен, но это отражается на нем или больше, чем на вас. Возможно, ему или ей просто не нравится MySQL в целом и не думает, что кто-то должен его использовать или спросить об этом. Кто знает? –

ответ

1

Хранимая функция MySQL не может возвращать несколько столбцов, она может возвращать только одно скалярное значение.

Но вы можете создать хранимую процедуру, которая возвращает набор результатов:

CREATE PROCEDURE UserGet(uid INT) 
    SELECT id, kullaniciadi, FotoGet(K.Foto,K.Gender) FROM kullanicilar K WHERE id=uid; 

Тогда называют его следующим образом:

CALL UserGet(1234); 

Она возвращает результирующий набор так же, как SELECT запрос будет.


DELIMITER // 

CREATE PROCEDURE UserGet(IN uid INT, IN column_name VARCHAR(64)) 
BEGIN 
    SET @sql = CONCAT('SELECT id, ', column_name, ' FROM kullanicilar K WHERE id=?'); 
    PREPARE stmt FROM @sql; 
    SET @uid = uid; 
    EXECUTE stmt USING @uid; 
END// 

DELIMITER ; 

Называйте это как так:

CALL UserGet(1234, 'kullaniciadi'); 

Помните, что это ваша ответственность, чтобы написать код, чтобы передать действительное имя столбца в качестве аргумента процедуры. Если вы разрешите передавать ненадежный контент, это может быть уязвимость SQL-инъекции.


Re ваш дополнительный комментарий:

Это должно работать нормально:

CALL UserGet(1234, 'FotoGet(Foto,Gender)'); 
+0

Это так:? (спасибо вам большое сэр. – traBolics

+0

Могу ли я получить имя строки в аргументе? Как CREATE PROCEDURE UserGet (uid INT, rows) SELECT rows FROM kullanicilar K WHERE id = uid; – traBolics

+0

Вы должны иметь название столбца «Да, но это сложнее: вам нужно будет использовать PREPARE и EXECUTE, а затем вам нужно научиться защищать свой код от SQL-инъекций. Я не хочу быть оскорбительным, но если вы не знаете разницы между «рядами» "и" column ", то вы, вероятно, еще не готовы к этому. Я рекомендую вам придерживаться фиксированного набора столбцов. –