Select bepaalde columns dynamisch

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bastiaan

Bastiaan

16/03/2009 12:51:00
Quote Anchor link
Ik vroeg me af of het mogelijk was om een select query te draaien waarbij alleen columns getoond worden die aan bepaalde criteria voldoen, in mijn geval beginnen met c$

De volgende query werkt goed;
show columns from table1 where (substr(field,1,2)='c$')

Nu wil ik de resultaten verwerken in een query en de daadwerkelijke data alleen uit die columns halen. Ik wil dus eigenlijk naar de volgende query toe;

select show columns from table1 where (substr(field,1,2)='c$') from table1

Is zoiets mogelijk in mysql?
 
PHP hulp

PHP hulp

12/12/2024 14:17:22
 
- SanThe -

- SanThe -

16/03/2009 12:54:00
Quote Anchor link
Waarom heb je dynamische kolomnamen?
Is je datamodel wel in orde en genormaliseerd?
 
Bastiaan

Bastiaan

16/03/2009 12:57:00
Quote Anchor link
het is een database waarbij de gebruiker kolommen moet kunnen toevoegen. Deze custom kolommen beginnen altijd met c$ .

De query moet dus altijd een lijst geven met alle data in de custom kolommen, als de gebruiker een nieuwe toevoegd moet deze ook dynamisch in de query meegenomen worden
 
- SanThe -

- SanThe -

16/03/2009 13:13:00
Quote Anchor link
Lijkt mij geen goed datamodel. Je laat een gebruiker toch nooit, maar dan ook nooit, de structuur van de database aanpassen.
 
Kees Schepers

kees Schepers

16/03/2009 13:34:00
Quote Anchor link
Najah, ik ken applicaties zat waarbij gebruikers 'vrije velden' kunnen toevoegen, dat is hetzelfde idee als hij heeft denk ik..

Het is wel riskant / gevoelig.. maar als je het goed afschermt dan is het wel te doen denk ik :)

Haha, dit wou ik zelf ook weleens in een tool! Alleen ik denk dat het vrij lastig is..

Wat je eventueel we zou kunnen proberen is het in een stored procedure te doen? Die kan alle kolommen fetchen en dat schrijf je dan in een nieuwe query die je uiteindelijk uitvoert :)

Even een grof schetsje, zitten zeker weten nog fouten in :p

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE PROCEDURE naamVanJeFunctie()
BEGIN
    DECLARE column VARCHAR(50);
    DECLARE thequery TEXT
    DECLARE columns TEXT
  DECLARE cur1 CURSOR FOR SELECT columnname FROM INFORMATIONSCHEMA.TABLES WHERE tablename = 'table1' AND SCHEMA = 'db';
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET noresultsleft=1;
  
  SET noresultsleft = 0;
  SET thequery = 'SELECT ';  
    OPEN cur1;    
    
    WHILE noresultsleft=0 DO
        FETCH cur1 INTO column;
            SET columns = CONCAT(column,', ');
    END WHILE
    
    SET thequery = CONCAT(thequery,columns,' FROM sometable');
    SET noresultsleft = 0;
    
    CLOSE cur1;
    
    PREPARE stmt FROM @thequery;
    EXECUTE stmt;
    DEALLOCATE stmt;
    
END;
Gewijzigd op 01/01/1970 01:00:00 door kees Schepers
 
Jens V

Jens V

16/03/2009 14:27:00
Quote Anchor link
kees schreef op 16.03.2009 13:34:
Najah, ik ken applicaties zat waarbij gebruikers 'vrije velden' kunnen toevoegen, dat is hetzelfde idee als hij heeft denk ik..


Dat geloof ik nooit... Alé, ze kunnen wel eigen veld toevoegen, maar dan niet op deze manier... Kijk eens naar de manier hoe een phpBB2 (ik weet niet op ze het in 3 ook zo doen) zijn configuration tabel opslaat in de database....

Jens

edit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE TABLE `phpbb_config` (
  `config_name` varchar(255) NOT NULL,
  `config_value` varchar(255) NOT NULL,
  PRIMARY KEY  (`config_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Gegevens worden uitgevoerd voor tabel `phpbb_config`
--

INSERT INTO `phpbb_config` (`config_name`, `config_value`) VALUES ('config_id', '1'),
('board_disable', '1'),
('sitename', 'sitenaam'),
('site_desc', 'site description'),
('cookie_name', 'phpbb2mysql'),
('cookie_path', '/'),
('cookie_domain', ''),
('cookie_secure', '0'),
('session_length', '3600'),
('allow_html', '1'),
('allow_html_tags', 'b,i,u,pre,object,param,embed'),
('allow_bbcode', '1'),
('allow_smilies', '1'),
('allow_sig', '1'),
enzoverder
Gewijzigd op 01/01/1970 01:00:00 door Jens V
 
Kees Schepers

kees Schepers

16/03/2009 14:45:00
Quote Anchor link
Zo werkte ik ook bij ScooterBase, werkt opzich prima alleen zit je met datatypes, standaard waarden etc.

Maargoed ik wou de gebruiker alleen maar helpen :) Dat het onveilig/geen is al verteld door andere users.
 
Willem Jan Z

Willem Jan Z

16/03/2009 14:52:00
Quote Anchor link
Een ander voorbeeld waar dit erg ver uitgewerkt is, is Magento. Webshop systeem, met producten die tot in het oneindige custom worden gemaakt zo ongeveer.
 
Bastiaan

Bastiaan

16/03/2009 15:00:00
Quote Anchor link
velden aanmaken is een volledig veilige methode waarbij de gebruiker datatypes kan kiezen en het systeem op het meest rustige moment de velden toevoegd. Dit is tevens iets waar ik geen invloed op heb dus ook niks aan kan doen.

@KEes; dat ziet er erg chique uit. Is dit allemaal MySQL, dit is volledig nieuw voor mij.. :( Is er ergens een goede tutorial te vinden over het uitvoeren van Stored Procedures?
 
Jens V

Jens V

16/03/2009 15:02:00
Quote Anchor link
Bastiaan schreef op 16.03.2009 15:00:
velden aanmaken is een volledig veilige methode waarbij de gebruiker datatypes kan kiezen en het systeem op het meest rustige moment de velden toevoegd.


Dream on boy, dream on....

Al eens gedacht aan wat er gebeurt als de gebruiker velden gaat veranderen en of verwijderen en dan plots systeemvelden tegen komt? Veel plezier om dat op te lossen!
Mij niet gezien....
Gewijzigd op 01/01/1970 01:00:00 door Jens V
 
Bastiaan

Bastiaan

16/03/2009 16:49:00
Quote Anchor link
heb ik nu al niet eerder gezegd dat dit iets is wat ik niet in de hand heb? En iets minder denigrerend mag wel met je "dream on..."

Maargoed als er nog mensen zijn die wat info hebben over stored procedures, graag!
 
Kees Schepers

kees Schepers

16/03/2009 17:00:00
Quote Anchor link
Ik had een hele reactie gepost daarstraks, maar toen was ik alles kwijt omdat ik ineens niet meer ingelogd was.

Maar reactie(s) van Jens zijn niet al te vriendelijk ben ik het met je eens.

Het is niet de mooiste oplossing dat ben ik met de rest eens, maar ik zelf zat ook weleens in dezelfde situatie waar een oplossing als deze mij een uitkomst had geboden.

Daarnaast is een site die slecht beveiligd is tegen MySQL injection etc net zo onveilig als jij schetst Jens. Dus je moet met dit 'systeem' net zo voorzichtig zijn als anders en dan kan er weinig gebeuren naar mijn idee.

Betreft de stored procedure;
Ja dit is MySQL. In MySQL 5.1 kun je ook stored routines maken en uitvoeren. Je hebt functies en procedures, en een procedure is hetgene wat jij zoekt in dit geval. Ik zelf heb het geleerd tijdens het voorbereiden van mijn MySQL examen uit het MySQL Study Guide boek, maar er is denk ook wel genoeg op internet te vinden. Google eens op 'Stored Routines MySQL'.

Ben benieuwd of je eruit komt!
 
Jurgen assaasas

Jurgen assaasas

16/03/2009 17:16:00
Quote Anchor link
Vrije velden wel, maar niet een kolom dat gaat meestal zoiets:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
users
-----------------
id
...
...
...

custom_fields
-----------------
user_id
fieldname
value
 
Jens V

Jens V

16/03/2009 17:29:00
Quote Anchor link
Bastiaan schreef op 16.03.2009 16:49:
heb ik nu al niet eerder gezegd dat dit iets is wat ik niet in de hand heb? En iets minder denigrerend mag wel met je "dream on..."


Ik zeg het alleen maar voor je eigen goed... Je database model is waarschijnlijk niet in orde als je het zo gaat doen... Maar ja, jouw database, niet de mijne...

kees schreef op 16.03.2009 17:00:
Maar reactie(s) van Jens zijn niet al te vriendelijk ben ik het met je eens.


Geef eens een voorbeeldje, buiten die hierboven dan?

kees schreef op 16.03.2009 17:00:
Daarnaast is een site die slecht beveiligd is tegen MySQL injection etc net zo onveilig als jij schetst Jens. Dus je moet met dit 'systeem' net zo voorzichtig zijn als anders en dan kan er weinig gebeuren naar mijn idee.


Als je je website slecht beveiligt tegen SQLInjection is dat wederom niet het probleem van het datamodel, maar van je scripting kunsten... Een datamodel waar je gebruikers kolommen van tabellen laat aanmaken en wijzigen is bijna nooit een goed datamodel...

Mvg,
Jens
Gewijzigd op 01/01/1970 01:00:00 door Jens V
 
Frank -

Frank -

16/03/2009 18:15:00
Quote Anchor link
kees schreef op 16.03.2009 17:00:
Ja dit is MySQL. In MySQL 5.1 kun je ook stored routines maken en uitvoeren. Je hebt functies en procedures, en een procedure is hetgene wat jij zoekt in dit geval. Ik zelf heb het geleerd tijdens het voorbereiden van mijn MySQL examen uit het MySQL Study Guide boek, maar er is denk ook wel genoeg op internet te vinden. Google eens op 'Stored Routines MySQL'.

Toch iets beter opletten tijdens de les, stored procedures staan sinds versie 5.0 in MySQL. En wanneer je toch beter aan het opletten bent, dynamische datamodellen zijn hét recept voor dramatische performance, er kunnen geen indexen worden gebruikt.

Ik heb MySQL toch al niet zo hoog zitten, maar wat je hier voorschotelt, lijkt ook nog eens aan te tonen dat veel te dure examens ook weggegooid geld zijn.

Ga normaliseren en gooi jouw "dynamische" kolommen in een tabelletje met value-content, dan is er nog iets van te maken. Kun je ook een index gebruiken, dat scheelt weer een slok op een borrel.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
CREATE TABLE
  tabelnaam(
    id INT auto_increment primary key,
    kolomnaam VARCHAR(255) NOT NULL,
    waarde TEXT
);
CREATE INDEX i_kolom ON tabelnaam (kolomnaam);

Dit is al een beroerde "oplossing", maar fysiek dynamische kolommen... Performance wordt om te janken.

Maar goed, MySQL is toch al om te janken. (sorry, moest even)
 
Kees Schepers

kees Schepers

17/03/2009 14:37:00
Quote Anchor link
Goeiendag wat een forum dit. Sorry jongens maar vriendelijker kan wel lijkt me.

Ten eerste, ik raad nergens Bastiaan aan om dit te gaan gebruiken, maar aangezien hij toch al heeft besloten om het te gaan doen. Daarom help ik hem graag met een oplossing.

En Frank als jou MySQL niet lekker ligt, prima maar moet dit in al je posts blijken? Lijkt me een beetje overbodig. Als je zo graag haat uitzaait, zou ik zeggen word lid van Ajax en ga Feynoord aanhangers uitschelden ofzo, we hebben het over verschillende database platform die ieder zijn eigenschappen hebben.

En ik ben ook niet perfect net zoals iedereen dus mijn excuus dat ik niet (meer) wist in welke versie dit gekomen was.

Ik zou allemaal eens teurg naar de les normen en waarden gaan, waar je leert anderen mensen te respecteren. En realiseer jezelf wat je toegevoegde waarde is aan dit forum en wat de bedoeling is. (O.a. het helpen van mensen?). Tuurlijk doe je dat wel door iemand te adviseren iets niet te gaan gebruiken, maar aan bijdehand doen hebben we niets aan.

Misschien reageer ik wat overdreven, maar bekijk het eens vanuit de user die dit topic opent.
 
Frank -

Frank -

17/03/2009 18:14:00
Quote Anchor link
Kees, je helpt hier iemand willens en wetens met een fout datamodel van de wal in de sloot. Dat zou jij moeten weten, jij hebt tenslotte een MySQL-examen gedaan. Dan zou je ook moeten weten dat het achteraf een gruwelijke klus is om een fout datamodel met bijbehorende applicatie om te bouwen naar een goed datamodel. Wanneer het datamodel dynamisch moet zijn, heb je al een probleem, maar zorg er dan wel voor dat het een overzichtelijk en te hanteren probleem blijft.

Ook op het gebied van veiligheid heb je probleem met het door jou voorgestelde model, iedereen heeft rechten nodig op ALTER TABLE. En als er iets onveilig is, dan is dat het wel. Voor je het weet ben je data kwijt, heeft MySQL toch al een handje van, of laat iemand de boel met opzet onderuit gaan door teveel kolommen toe te voegen. Dit wordt echt een hackersfeestje, maak je daar geen zorgen over.

Ik ben geen liefhebber van MySQL omdat deze database onbetrouwbaar is. Zelfs een goed geconfigureerde database kan door iedere database user weer naar de bliksem worden geholpen, ze kunnen allemaal runtime de instelingen aanpassen. Heb jij net je best gedaan om er voor te zorgen dat datums ook echte datums zijn, maakt een gek jouw instellingen weer ongedaan. Zit jij weer opgescheept met de bekende 0000-00-00 datums.... En dat is nog maar een voorbeeldje, laat ik het daar ook maar even bij houden.

Wanneer jij foute oplossingen ook hulp vindt, prima, maar ik denk daar heel anders over. Ik probeer zoveel mogelijk fouten te voorkomen, dat werkt een stuk sneller en veiliger.

Ontopic: Zorg voor een goed datamodel, een zo goed mogelijk datamodel. Gebruikers hebben nooit rechten nodig om kolommen toe te voegen, te veranderen of te verwijderen, die richting kun je dus niet opgaan.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.