PHP: functie kan ik niet vaker dan 1 keer oproepen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste devschuur-tweakers,

Ik heb een probleempje met een functie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// adhv gewenste sectie, wordt css-kleur uit db gehaald
function getsk ($sk = s1k) {
  // db-connectie ($db) staat in cms/common.php
  require_once("cms/common.php");
  $Query               = "SELECT kid, sectie, htmlcode " .
                         "FROM tblKleuren " .
                         "WHERE sectie = '" . $sk . "'";
  $result              = mysql_query($Query, $db) or die(mysql_error());
  $row                 = mysql_fetch_assoc($result);
  $sk                  = $row["htmlcode"];
  return $sk;
}
$s1k = getsk(s1k); echo $s1k;
$s2k = getsk(s2k); echo $s2k;
?>


Ik heb een tabelltje aangemaakt in mysql die een sectie weergeeft (s1k, s2k, etc.) en de daarbij horende html-code. De bedoeling is het, dat ik een output krijg zoals in de onderste twee regels van de code hierboven staat: de html-kleur van een bepaalde sectie wordt gekoppeld aan een variabele ($s1k, $s2k, etc.). Die variabele kan ik vervolgens her en der gebruiken.

Nu zit het zo dat de functie op zich wel werkt, maar dat het me niet lukt om het resultaat van die functie vaker dan een keer op te roepen. Wanneer ik bovenstaande code in de browser uitvoer, krijg ik alleen maar het eerste resultaat te zien (de htmlcode van $s1k dus).

Wat vergeet ik, wat doe ik fout? Ik weet het niet :(

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Waarom include je iets binnen een functie? Dat lijkt me niet echt goed...

Acties:
  • 0 Henk 'm!

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 07-09 11:44

Bergen

Spellingscontroleur

Misschien doe je in require_once("cms/common.php"); iets wat maar 1x mag worden gedaan? Zet die regel eens boven de functie...

Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

require_once("cms/common.php"); <-- even _once weg halen dus

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

Verwijderd

Wat is s1k? Een variabele? Dan hoort er nog een $ voor. Een string? Dan horen er quotes omheen.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Iets binnen een functie includen kan ik nog begrijpen. Scheelt weer wat overhead voor het includen van bestanden die je toch niet gebruikt.
Maar hij required hem, wat dat voordeel opheft. Requier's worden altijd uitgeoverd, ookal staan ze tussen if(1 ==2) { }, in tegenstellen tot include's

Maar gooi je require inderdaad eens uit je functie.
Indien je maar 1 database-connectie gebruikt heb je de $db var niet nodig.Anders kun je hem binnen je functie aanspreken uit de superglobal $GLOBALS['db'];

Is 's1k' een string, of een constante? Ik zie namelijk geen aanhalingstekentjes, en constanten schrijf je over het algemeen in hoofdletters

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Bergen schreef op zaterdag 27 augustus 2005 @ 12:48:
Misschien doe je in require_once("cms/common.php"); iets wat maar 1x mag worden gedaan? Zet die regel eens boven de functie...
require_once zegt het al een beetje heh: once...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
  include("cms/common.php");
// adhv gewenste sectie, wordt css-kleur uit db gehaald
function getsk ($sk = "s1k") {
  global $db;
  $Query               = "SELECT kid, sectie, htmlcode " .
                         "FROM tblKleuren " .
                         "WHERE sectie = '" . $sk . "'";
  $result              = mysql_query($Query, $db) or die(mysql_error());
  $row                 = mysql_fetch_assoc($result);
  $sk                  = $row["htmlcode"];
  return $sk;
}
$s1k = getsk("s1k"); echo $s1k;
$s2k = getsk("s2k"); echo $s2k;
?>


zo werkt ie prima :)

groeten,

Acties:
  • 0 Henk 'm!

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 07-09 11:44

Bergen

Spellingscontroleur

Zoijar schreef op zaterdag 27 augustus 2005 @ 12:54:
[...]

require_once zegt het al een beetje heh: once...
Ja, dus bij de 2e aanroep zou hij die regel moeten negeren, maar de rest van de functie zou wel gewoon moeten worden uitgevoerd.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor de volledigheid nog een kleine toeveoging: de html-kleurtje smoeten vooraf gegaan worden door een hekje:
code:
1
2
3
4
5
6
$s1k = "#" . "" . getsk("s1k");
$s2k = "#" . "" . getsk("s2k");
$s3k = "#" . "" . getsk("s3k");
$s4k = "#" . "" . getsk("s4k");
$s5k = "#" . "" . getsk("s5k");
$background = "#" . "" . getsk("back");


Maar het werkt dus prima. Dank voor de snelle en juiste reacties :)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

CSS is cascading; dynamisch stylesecties maken is bij een beperkt aantal stylen meestal overbodige overhead, je kan net zo goed zoiets doen:
HTML:
1
2
<link rel="stylesheet" href="default.css" type="text/css">
<link rel="stylesheet" href="style1.css" type="text/css">

In style1.css hoef je vervolgens enkel rules op te nemen die afwijken van je default. Hiermee hou je ook in je serverside code je styling netjes apart van de rest van je code en hoef je niet telkens databasequeries te doen om een dynamische stylesheet samen te stellen.
Verder voordeel is dat statische css-files clientside gewoon gecached worden.

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Indeed, maar het geval wil dat de keuze van kleuren ook variabel moet zijn: degene die de site beheert heeft geen verstand van html/css, maar wil wel elke maand de kleuren van de achtergrond en elke sectie van de site aan kunnen passen vanuit een cms.
Ik zou dan natuurlijk vanuit die db ook een stylesheet kunnen genereren, maar da was me teveel gedoe :p Nu zijn het variabelen met een waarde die in een klein inline-stukje css boven de <head> geparst worden.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Nou... ik vind dit een heel apart verhaal. Die require_once kan nooit en te nimmer die functie breken, tenzij de include een error oplevert.

error_reporting(E_ALL) lijkt me een goed begin...

require_once gebruiken in de functie vond ik nog het netste van deze code :P

Je doet nu ook 'SELECT kid, sectie, htmlcode ' en gebruikt vervolgens alleen htmlcode. Een kortere schrijfwijze van dit

PHP:
1
2
 $row                 = mysql_fetch_assoc($result);
  $sk                  = $row["htmlcode"];


is overigens dit:

PHP:
1
$sk = mysql_result ($result, 0, 'htmlcode');


Dan hoef je niet eerst de hele resultrow op te halen waar je toch niks mee doet.

Maar goed.. waar ik dus voor reageerde was die require_once. De eerste 5 reacties ofzo melden gelijk dat dat fout was, terwijl er helemaal niks mis mee is.

[ Voor 75% gewijzigd door Bosmonster op 29-08-2005 09:42 ]


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Bosmonster schreef op maandag 29 augustus 2005 @ 09:38:
Nou... ik vind dit een heel apart verhaal. Die require_once kan nooit en te nimmer die functie breken, tenzij de include een error oplevert.

error_reporting(E_ALL) lijkt me een goed begin...

<snip>

Maar goed.. waar ik dus voor reageerde was die require_once. De eerste 5 reacties ofzo melden gelijk dat dat fout was, terwijl er helemaal niks mis mee is.
Helaas heb je het bij het verkeerde eind. Door de require_once word alles in die include alleen uitgevoerd tijdens de eerste call van de functie. Bij alle andere calls word de code in de require_once niet meer uitgevoerd en zullen variabelen die daarin gedefinieerd / gezet worden dus ook niet beschikbaar zijn.

En ja, error_reporting(E_ALL) was hier zeker een goed begin geweest, zoals altijd :)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ik denk dat het in eerste instantie niet werkte vanwege een scope probleem. De DB code werdt wel geinclude, maar de daarbinnen gedeclareerde variabelen waaren alleen geldig binnen de scope van die functie. Bij de volgende functie aanroep werd er niet meer geinclude en was daarnaast $db ook undefined.

Maar goed, de 'netheid' van php kennende zou het ook wel puur toeval kunnen zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

WormLord schreef op maandag 29 augustus 2005 @ 10:28:
[...]


Helaas heb je het bij het verkeerde eind. Door de require_once word alles in die include alleen uitgevoerd tijdens de eerste call van de functie. Bij alle andere calls word de code in de require_once niet meer uitgevoerd en zullen variabelen die daarin gedefinieerd / gezet worden dus ook niet beschikbaar zijn.

En ja, error_reporting(E_ALL) was hier zeker een goed begin geweest, zoals altijd :)
Dat zeg ik dus. In principe is er niks mis met require_once in een functie en dit kan ook gewoon. Het breekt de functie niet.

Wat natuurlijk wel kan is dat de inhoud van de include voor problemen zorgt, bijvoorbeeld door het declareren van variabelen die je vervolgens niet meer hebt.

Maar aangezien we de inhoud van de include niet weten...

Hij heeft wel in een comment staan dat $db gedeclareerd wordt in de include zie ik nu. Maar dan had van

$result = mysql_query($Query, $db)

$result = mysql_query($Query)

maken ook een oplossing geweest :P Aangezien de mysql functie zelf zoekt naar een actieve verbinding en deze los opgeven in principe niet nodig is.

[ Voor 16% gewijzigd door Bosmonster op 29-08-2005 10:38 ]

Pagina: 1