Toon posts:

[SQL] Kolomnamen ophalen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goedemiddag heren,

Ik ben bezig met het ontwikkelen van een CMS voor ons eigen reisbureau.
Mijn doel hierbij is om het zo simpel mogelijk te houden.

Nu bieden wij verschillende landen aan, en deze landen hebben verschillende, laat ik zeggen, eigenschappen.
Ik wil al deze eigenschappen apart in een SQL tabel zetten, deze noem ik 'cmsextrainfo'.
Met het doel voor ogen om alles simpel te laten dacht ik voor alle mogelijke eigenschappen een kolom aan te maken, voor alle kolommen standaardwaarde 0 in te stellen, en kolommen waarvan de waarde 0 is over te slaan. Nu kom ik echter toch weer op een probleem uit. Hetvolgende:

Stel ik heb de volgende gegevens in mijn cmsextrainfo staan (werkelijke tabel heeft ongeveer 15 kolommen):

IDparent_IDresortkindvriendelijkAutoverhuurDuiken
05PlazaJaJa0
18OceanicJa0Ja
28LakeviewNee0Nee


Hoe kan ik nu de juiste kolommen laten zien. Als ik bijvoorbeeld alle rijen van parent_ID 8 wil hebben, dan zie ik dat voor alle resultaten met parent_ID 8, kolomnaam 'autoverhuur' een waarde 0 heeft. Hoe geef ik MySQL door dat deze kolom dan voor dit land niet van toepassing is, en daarom voor deze query overgeslagen moet worden.

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

* LuCarD begint maar aan zijn mantra.... Ik moet meer lezen....en niet alleen de titel....

[ Voor 97% gewijzigd door LuCarD op 17-12-2008 12:39 ]

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 00:08
Je datamodel zo aanpassen dat dit soort constructies niet nodig zijn :)

Een tabel met landen, een tabel met opties, een koppeltabel om landen aan opties te koppelen en een tabel om de waardes van de opties in op te slaan lijkt mij veel beter.

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • ThunderNet
  • Registratie: Juni 2004
  • Nu online

ThunderNet

Flits!

Ik zou het alleen niet zo doen :)
Als je 2 extra tabellen maakt.

tabel extra:
IDname
0Duiken
1Kindvriendelijk


en:

koppeltabel:
IDbestemming.IDextra.IDvalue
081False
180True

etc.

:) hierdoor blijft je systeem uitbreidbaar (je hoeft de tabel niet aan te passen, als je nieuwe dingen hebt). Ook is het hierdoor makkelijker om bepaalde query's uit te voeren.

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Zoiezo is het niet correct om 0 als default te gebruiken voor "Geen waarde", wat nu als je een property "AantalMedailles" gaat krijgen en je wilt daar de waarde 0 aan geven?

Er is niet voor niks een NULL value.

Verder zou ik idd Morax zijn suggestie gebruiken

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 16-08 21:48

TheLunatic

Ouwe boxen.

Inderdaad. Basiskennis normalisatie, toch?

Mother, will they like this song?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor de schop in de juiste richting, zo zie je maar weer dat je helemaal de verkeerde richting in kunt lopen. Toch zit ik eventjes het complete systeem uit te denken, en iets zegt dat dit ook weer lastig gaat worden.

De kolom-tabel, en de koppel-tabel zijn duidelijk. Nu de gegevens-tabel, elke rij representeert dus één kolom van één rij. En hier zit mijn volgende denk-probleem, om het zo te omschrijven. Hoe laat ik mijn systeem weten welke gegevens allemaal in dezelfde rij komen.
Een aparte row_ID maken? Ik voorzie een grotere complexiteit door dit systeem.

edit:

Heb het opgelost, hoewel het mij niet erg netjes lijkt. Ik zal het stukje PHP inclusief queries even posten, inclusief mijn template.

PHP:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
$tpl->gotoBlock( "_ROOT" );


$QUERY =    "SELECT info.ID AS header_ID,
            info.name AS columnname,
            define.ID AS column_ID
            FROM cms_info_columns AS info, cms_define_columns AS define
            WHERE define.parent_ID = " . $HTTP_GET_VARS['s_id'] . " 
            AND define.info_ID = info.ID
            AND define.value = 'True'
            ORDER BY info.ID ASC";  
        

$EXEC =     mysql_query( $QUERY ) or die( mysql_error() . $QUERY);
while($DATA =       mysql_fetch_array( $EXEC )){
        
        $tpl->newBlock( 'header' );
        $tpl->assign( 'HEADER_NAME', $DATA['columnname'] );
        
        
        
                 
}
$QUERY3 =   "SELECT data.ID
            FROM cms_data_columns AS data
            WHERE data.parent_ID= " . $HTTP_GET_VARS['s_id'] . "
            GROUP BY row_ID";
$EXEC3  =   mysql_num_rows(mysql_query($QUERY3)) or die(mysql_error());

$ROW  =     1;
while($ROW <= $EXEC3){
    
    $tpl->newBlock( 'row' );
    
    $QUERY2 =   "SELECT data.value AS value
                FROM cms_data_columns AS data
                WHERE data.parent_ID = " . $HTTP_GET_VARS['s_id'] . "
                AND data.row_ID = " . $ROW;
                        
    $EXEC2 = mysql_query($QUERY2) or die(mysql_error() . $QUERY2);
            
        while($DATA2 = mysql_fetch_array($EXEC2)){
                
            $tpl->newBlock( 'column' );
            $tpl->assign( 'COLUMN_VALUE', $DATA2[ 'value' ]);
                    
                
        }
    $ROW++;
}


Template-gedeelte:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 <table border="1">
                        <tr>
                        <!-- START BLOCK : header -->
                            <th> {HEADER_NAME} </th>                        
                        <!-- END BLOCK : header -->
                        </tr>
                        <!-- START BLOCK : row -->
                        <tr>
                        <!-- START BLOCK : column -->
                            <td>{COLUMN_VALUE}</td>
                        <!-- END BLOCK : column -->
                        </tr>
                        <!-- END BLOCK : row -->
                    </table>

[ Voor 64% gewijzigd door Verwijderd op 17-12-2008 16:52 ]


  • Alain
  • Registratie: Oktober 2002
  • Niet online
Volgens mij is de weking van je script niet gegarandeerd. Met name query 3 en query 2 vind ik erg wazig. Ik vermoed dat als je wat met row id's gaat rommelen dat je script een ongewenst resultaat geeft. ;)

Een paar tips:
  • Laat (het relevante deel van) je datamodel zien, dat praat een stuk makkelijker.
  • Geef je tabellen duidelijke namen. cms_data_colums bijvoorbeeld vind ik een typisch voorbeeld van een nikszeggende naam. Als je (bijvoorbeeld) een tabel hebt met informatie over faciliteiten, dan zou ik deze Facility noemen.
  • Ook voor kolomnamen kun je beter wat minder cryptische termen verzinnen. Een naam als parent_id zegt niet zoveel over wat die parent nu is. Als het om een id van een land gaat zou ik voor countryId kiezen.
  • Let op SQL-injectie. Nooit informatie van de gebruiker vertrouwen.
  • $HTTP_GET_VARS is oud. Je kunt beter $_GET gebruiken om te zorgen dat je script op meerdere servers werkt.

You don't have to be crazy to do this job, but it helps ....


  • ThunderNet
  • Registratie: Juni 2004
  • Nu online

ThunderNet

Flits!

En dan nog wat dingetjes... Maak een Database Wrapper klasse, zodat je niet van mysql extentie afhankelijk bent in de rest van je code... Ik kan me voorstellen dat je namelijk op korte termijn over wilt op mysqli, of wat als je later op een andere database wilt overstappen? :)

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?

Pagina: 1