[MySQL/PHP] Data uit settings tabel

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Exigence
  • Registratie: Juli 2001
  • Laatst online: 22:53
Ik heb dus een MySQL tabel met instellingen van mijn website:
code:
1
2
3
4
5
6
+----+---------+---------+
| ID | NAME    | VALUE   |
+----+---------+---------+
|  1 | bgcolor | ffffff  |
|  2 | font    | verdana |
+------------------------+


Hoe kan ik deze values nu eruit krijgen.
Ik bedoel op deze manier:
PHP:
1
2
$bgcolor = ;
$font = ;


Ik kan wel met een while lus per id de values eruit halen maar hoe krijg ik ze dan in een string die precies de naam heeft van de value die in NAME staat. En dat is erg omslachtig.

Ik deed eerst dit:
PHP:
1
2
3
4
5
$query = "SELECT * FROM ercn_settings ORDER BY id";
$resultaat = mysql_query($query);
$data = mysql_fetch_object($resultaat);
$bgcolor = $data->bgcolor;
$font = $data->font;


Maar dan zijn die values natuurlijk leeg. Kan hij er op de een of ander manier niet de value uit de derde kolom bijzoeken?


Misschien een beetje vaag... als jullie het niet snapen dan probeer ik het nog wel een keer beter uit te leggen.

[ Voor 4% gewijzigd door Exigence op 06-06-2003 20:41 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

of je doorloopt in een while alle kolomen en je zet je $font als name "font" is, of je doet een select where name=font ;)

erg basic als je het mij vraagt...

Acties:
  • 0 Henk 'm!

  • Exigence
  • Registratie: Juli 2001
  • Laatst online: 22:53
Erkens schreef op 06 June 2003 @ 20:42:
of je doorloopt in een while alle kolomen en je zet je $font als name "font" is, of je doet een select where name=font ;)

erg basic als je het mij vraagt...
Ja maar die dingen die in NAME staan zijn erg verschillend en het zijn er een stuk of 40.
Van font1_color tot max_messages_per_page.
Hoe kan ik dan bijvoorbeeld $[naamuitNAME] = [bijbehorendevalueuitVALUE]; doen.

Ik ben niet nieuw in PHP maar dit ben ik nooit tegengekomen eigenlijk.

Ik kan bijvoorbeeld wel doen:
PHP:
1
$query = "SELECT * FROM ercn_settings WHERE name='font'";
Maar dan moet ik voor die ander twintig values ook handmatig $resultaat en $data doen. Dat is 20*4 regels, en dat handmatig. Dat moet toch wel automagisch kunnen.

[ Voor 21% gewijzigd door Exigence op 06-06-2003 20:47 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
..
while $data = mysql_fetch_array($result){
  switch($data['name']){
    case "font":
      $font = $data['value'];
      break;
    case "font":
      $bgcolor = $data['bgcolor'];
      break;

   ..

  }
}
..

[ Voor 15% gewijzigd door Erkens op 06-06-2003 20:57 ]


Acties:
  • 0 Henk 'm!

  • Exigence
  • Registratie: Juli 2001
  • Laatst online: 22:53
Erkens schreef op 06 June 2003 @ 20:54:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
while $data = mysql_fetch_array($result){
  switch($data['name']){
    case "font":
      $font = $data['value'];
      break;
    case "font":
      $bgcolor = $data['bgcolor'];
      break;

   ..

  }
}
Bedankt! Ik heb nooit met switch enzo gewerkt. Ik werk nog maar een half jaar met PHP. Nog steeds halfautomatisch maar dit is in ieder geval heel wat.

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
PHP:
1
2
$a = "foo";
${$a} = "bar";
doet hetzelfde als
PHP:
1
$foo = "bar";
Zie voor meer info de manual.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

bigtree schreef op 07 June 2003 @ 13:07:
PHP:
1
2
$a = "foo";
${$a} = "bar";
doet hetzelfde als
PHP:
1
$foo = "bar";
Zie voor meer info de manual.
:X

regel 2: nooit variabele variabelen gebruiken, door dit NIET te doen wordt je code duidelijker en eigenlijk is het ook nooit nodig, daarnaast helpt het met het krijgen van leuke (security)bugs :)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

En wat leren wij van variabele variabelen? Juist, dat dat altijd op te lossen is door een associatieve array te gebruiken ;). Daarmee maak je ook die switch overbodig.


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$query = "
   SELECT
      name,
      value
   FROM
      settings
   WHERE
      theme_id=1  # ik neem aan dat je wel zoiets hebt? 
";
$res = mysql_query ( $query );

$settings = array ();
while ( $row = mysql_fetch_assoc ( $res ) ) {
   $settings [ $row [ 'name' ] ] = $row [ 'value' ];
}

// voila:
print_r ( $settings );



mocht je ze dan toch nog global hebben (wat ik afraad, daar word je code niet overzichtelijker van...) kun je de functie extract() gebruiken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Persoonlijk vind ik dit wat mooier:
PHP:
1
2
3
4
5
6
7
$settings_array = array();
while $data = mysql_fetch_array($result)
{
      $settings_array[$data['name']] = $data['value'];
}

// En dan dus overa $settings_array['font'] enzo gebruiken

Nadeel: meer tikwerk
Voordeel: veel flexibeler dan een switch/case-statement :)

edit:

GMTA, drm :P

[ Voor 5% gewijzigd door ACM op 07-06-2003 13:46 ]


Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Jullie hebben helemaal gelijk. Een associatieve array is beter dan variabele variabelen. Maar volgens mij had de topicstarter meer aan een oplossing van zijn probleem, namelijk:
Hoe kan ik deze values nu eruit krijgen.
Ik bedoel op deze manier:
PHP:
1
2
$bgcolor = ; 
$font = ;
Overigens geef ik persoonlijk weer de voorkeur aan een include met alle 'systeem'variabelen. Dat ontlast je database en is sowieso sneller.
offtopic:
De 'great minds' ACM en drm zijn allebei een DLA!

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

bigtree schreef op 07 juni 2003 @ 15:14:
Jullie hebben helemaal gelijk. Een associatieve array is beter dan variabele variabelen. Maar volgens mij had de topicstarter meer aan een oplossing van zijn probleem, namelijk:
[...]

Overigens geef ik persoonlijk weer de voorkeur aan een include met alle 'systeem'variabelen. Dat ontlast je database en is sowieso sneller.
offtopic:
De 'great minds' ACM en drm zijn allebei een DLA!
mja dit is toch een betere oplossing?
en dan doet hij maar $font=$setting['font'];
;)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Erkens:
mja dit is toch een betere oplossing?
en dan doet hij maar $font=$setting['font'];
;)
Zoals gezegd kun je daar de functie extract () voor gebruiken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

drm schreef op 07 June 2003 @ 16:24:
[...]
Zoals gezegd kun je daar de functie extract () voor gebruiken.
:X

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
bigtree schreef op 07 June 2003 @ 15:14:
Jullie hebben helemaal gelijk. Een associatieve array is beter dan variabele variabelen. Maar volgens mij had de topicstarter meer aan een oplossing van zijn probleem, namelijk.
Klopt, maar daar was al een stel antwoorden op gegeven ;)
offtopic:
De 'great minds' ACM en drm zijn allebei een DLA!
Wat is een DLA?

Acties:
  • 0 Henk 'm!

  • Exigence
  • Registratie: Juli 2001
  • Laatst online: 22:53
Ik denk dat ik dit maar ga gebruiken:
PHP:
1
2
3
4
5
6
$query = "SELECT * FROM settings ORDER BY id";
$resultaat = mysql_query($query) or die("Fout: " . mysql_error());
while($data = mysql_fetch_object($resultaat)){
      $var = "$data->name"; 
      ${$var} = "$data->value";
}

Ik wist niet hoe je variabele variabelen kon krijgen. Dit was eigenlijk mijn vraag maar ik wist het niet goed te formuleren.
Of hangen hier nog nadelige consequenties aan?
EDIT: Dit is beter:
Ik heb alles nu in een include (settings.php):
PHP:
1
2
3
4
5
$query = "SELECT * FROM settings ORDER BY id";
$resultaat = mysql_query($query);
while($data = mysql_fetch_object($resultaat)){
    $setting[$data->name] = $data->value;
}


move -> /opgelost

[ Voor 36% gewijzigd door Exigence op 07-06-2003 21:31 ]


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46

KompjoeFriek

Statsidioot

Ik werk nog maar een half jaar met PHP.
[IkVoelMeZoGoed >:) Mode]
Ik ben 2 maanden geleden begonnen met PHP, en heb dit toevallig ook al zelf gemaakt. Opgelost met een Array zoals hier boven is vermeld.
Komt waarschijnlijk omdat ik me met veel prog.talen bezig houdt, en dan snap je de basis al meteen...
[/IkVoelMeZoGoed >:) Mode]

btw, het is niet mijn bedoeling om je af te kraken of iets dergelijks, maar je hebt waarschijnlijk geen ervaring met een andere taal, zodat je dit zelf had kunnen verzinnen.
Verder wil ik je aanmoedigen de mogelijkheden van PHP te verkennen, en je de documentatie bekent te maken (je hoeft natuurlijk niet alles te gaan lezen of zo, maar kijk er gewoon eens naar...)
offtopic:
en ik vind je site best interressant, ben toevalling ook met zoiets dergelijks bezig, alleen dan verder de geschiedenis in :)

[ Voor 2% gewijzigd door KompjoeFriek op 07-06-2003 21:10 . Reden: typo ]

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • Exigence
  • Registratie: Juli 2001
  • Laatst online: 22:53
KompjoeFriek schreef op 07 juni 2003 @ 21:09:
[...]

[IkVoelMeZoGoed >:) Mode]
Ik ben 2 maanden geleden begonnen met PHP, en heb dit toevallig ook al zelf gemaakt. Opgelost met een Array zoals hier boven is vermeld.
Komt waarschijnlijk omdat ik me met veel prog.talen bezig houdt, en dan snap je de basis al meteen...
[/IkVoelMeZoGoed >:) Mode]

btw, het is niet mijn bedoeling om je af te kraken of iets dergelijks, maar je hebt waarschijnlijk geen ervaring met een andere taal, zodat je dit zelf had kunnen verzinnen.
Verder wil ik je aanmoedigen de mogelijkheden van PHP te verkennen, en je de documentatie bekent te maken (je hoeft natuurlijk niet alles te gaan lezen of zo, maar kijk er gewoon eens naar...)
offtopic:
en ik vind je site best interressant, ben toevalling ook met zoiets dergelijks bezig, alleen dan verder de geschiedenis in :)
PHP was/is mijn eerste taal die ik leer (na HTML, maar dat is niet programmeertaal). Dus ik moet helemaal vanaf de bodem starten. Ik ken nog maar relatief weinig functies. Ik besef gelukkig wel wat je er allemaal mee kunt. Ik heb dus onder andere ook plaatjes voor de mailadressen enzo gebruikt.
Array's ken ik ook wel. Waar het nog aan ontbreekt is databaseaanspreekkennis. Ik had er eigenlijk niet goed over nagedacht om een array te gebruiken.

offtopic:
Welke bedoel je. De site over die processoren of ModFreaks.com
Jij bent ook al 21, ik moet nog beginnen zeg maar ;)
Wat ook zo irritant is, is dat je nooit met iemand over computers (ik bouw ze) en PHP enzo kunt praten want niemand snapt je, daarom zit ik ook zoveel op internet, daar snapt men me wel. 56k sucks, 40 euro per maand.

[ Voor 31% gewijzigd door Exigence op 08-06-2003 13:01 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

erik9287nl schreef op 07 June 2003 @ 20:25:
Ik denk dat ik dit maar ga gebruiken:
PHP:
1
2
3
4
5
6
$query = "SELECT * FROM settings ORDER BY id";
$resultaat = mysql_query($query) or die("Fout: " . mysql_error());
while($data = mysql_fetch_object($resultaat)){
      $var = "$data->name"; 
      ${$var} = "$data->value";
}

Ik wist niet hoe je variabele variabelen kon krijgen. Dit was eigenlijk mijn vraag maar ik wist het niet goed te formuleren.
Of hangen hier nog nadelige consequenties aan?
er hangen veel consequenties aan, ten eerste weet je nooit 100% zeker welke variabele je hebt en wat erin zit ;) dus je moet telkens je variabelen checken of ze bestaan enzo.
En dan hebben we het nog niet eens over de veiligheid gehad :)
EDIT: Dit is beter:
Ik heb alles nu in een include (settings.php):
PHP:
1
2
3
4
5
$query = "SELECT * FROM settings ORDER BY id";
$resultaat = mysql_query($query);
while($data = mysql_fetch_object($resultaat)){
    $setting[$data->name] = $data->value;
}


move -> /opgelost
dat is idd beter ;)

Acties:
  • 0 Henk 'm!

  • Exigence
  • Registratie: Juli 2001
  • Laatst online: 22:53
Nu heb ik eigenlijk nog een vraagje:
Hoe kun je in een database het aantal verschillende rijen bekijken.
Dus bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
+-----+------+
| CAT | IETS |
+-----+------+
|  1  | a    |
|  1  | b    |
|  2  | c    |
|  1  | d    |
|  3  | e    |
+-----+------+


Dan moet hij mij dus "vertellen" dat er dus in totaal 3 verschillende CAT´s zijn. Een 1 een 2 en een 3. Dus hij kijkt niet naar het aantal rijen maar het aantal identieke rijen. (ofzoiets)
$aantalcategorien = 3; moet er dan uitkomen.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

erik9287nl schreef op 08 June 2003 @ 13:01:
Nu heb ik eigenlijk nog een vraagje:
Hoe kun je in een database het aantal verschillende rijen bekijken.
Dus bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
+-----+------+
| CAT | IETS |
+-----+------+
|  1  | a    |
|  1  | b    |
|  2  | c    |
|  1  | d    |
|  3  | e    |
+-----+------+


Dan moet hij mij dus "vertellen" dat er dus in totaal 3 verschillende CAT´s zijn. Een 1 een 2 en een 3. Dus hij kijkt niet naar het aantal rijen maar het aantal identieke rijen. (ofzoiets)
$aantalcategorien = 3; moet er dan uitkomen.
ehm
SELECT count(*) FROM tabel GROUP BY `CAT` ?

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Drie Letterige Afkorting

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Ah, die is nieuw voor me :P

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
ACM schreef op 08 June 2003 @ 14:43:
Ah, die is nieuw voor me :P
Een DLA is dus zelf ook een DLA (recursieve afkorting? :*))

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.

Pagina: 1