Class werkt niet juist
Ik ben bezig met een class en een database en ik wil een tekst actief en niet actief kunnen maken.
Wanneer ik hem aanpas en op niet actief zet blijft de radiobutton ook op niet actief staan alleen ergens in mijn class gaat er iets mis.
Nu toont hij helemaal niks meer... Ik weet haast zeker dat het in de class zit dus als iemand er even naar zou kunnen kijken want ik kom er even niet meer uit.
Alvast bedankt
Code (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
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
public function getTeksten($database, $actief = NULL, $taal, $bladzijde = NULL, $id = NULL)
{
$sql = "SELECT * FROM ".$database."_teksten WHERE tekst_taal=:taal";
if(!empty($id))
{
if(is_numeric($id))
{
$sql .= " AND tekst_ID=:id";
}
if(!empty($actief) && $actief == 1)
{
$sql .= " WHERE tekst_actief='1'";
}
}
else if(!empty($bladzijde))
{
if(is_numeric($bladzijde))
{
$sql .= " AND tekst_bladzijde=:bladzijde";
}
else
{
return NULL;
}
}
$sql .= " ORDER BY tekst_volgorde ASC";
try
{
$stmt = $this->db->prepare($sql);
$stmt->bindParam(":taal", $taal, PDO::PARAM_STR);
if(!empty($id) && is_numeric($id))
{
$stmt->bindParam(":id", $id, PDO::PARAM_INT);
}
else if(!empty($bladzijde) && is_numeric($bladzijde))
{
$stmt->bindParam(":bladzijde", $bladzijde, PDO::PARAM_INT);
}
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_OBJ);
$stmt->closeCursor();
return $result;
}
catch(Exception $e)
{
die($e->getMessage());
}
}
{
$sql = "SELECT * FROM ".$database."_teksten WHERE tekst_taal=:taal";
if(!empty($id))
{
if(is_numeric($id))
{
$sql .= " AND tekst_ID=:id";
}
if(!empty($actief) && $actief == 1)
{
$sql .= " WHERE tekst_actief='1'";
}
}
else if(!empty($bladzijde))
{
if(is_numeric($bladzijde))
{
$sql .= " AND tekst_bladzijde=:bladzijde";
}
else
{
return NULL;
}
}
$sql .= " ORDER BY tekst_volgorde ASC";
try
{
$stmt = $this->db->prepare($sql);
$stmt->bindParam(":taal", $taal, PDO::PARAM_STR);
if(!empty($id) && is_numeric($id))
{
$stmt->bindParam(":id", $id, PDO::PARAM_INT);
}
else if(!empty($bladzijde) && is_numeric($bladzijde))
{
$stmt->bindParam(":bladzijde", $bladzijde, PDO::PARAM_INT);
}
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_OBJ);
$stmt->closeCursor();
return $result;
}
catch(Exception $e)
{
die($e->getMessage());
}
}
Gewijzigd op 22/05/2012 09:37:39 door Joep van Dongen
Code (php)
1
2
3
2
3
<?php
public function getTeksten($database, $actief = NULL, $taal, $bladzijde = NULL, $id = NULL)
?>
public function getTeksten($database, $actief = NULL, $taal, $bladzijde = NULL, $id = NULL)
?>
Als je een parameter van een functie een default waarde meegeeft, dan moeten alle parameters die erachter komen ook default waardes hebben. Waarom? Omdat je een parameter met een default waarde weg kan laten uit je functie aanroep, maar zou je dan de volgende parameter wel moeten meegeven dan kan php nooit weten welke je nu wel meegeeft en welke niet.
Aangezien jij dus $actief een default geeft, moet $taal dat ook hebben. Ik weet eerlijk gezegd niet of php hierop een foutmelding geeft, maar dat zou wel moeten.
Gewijzigd op 22/05/2012 09:56:18 door Erwin H
Ik heb een zelfde class gemaakt voor vacatures en deze werkt wel gewoon alleen de class is kleiner. Ergens gaat het gruwelijk mis maar ik kom er niet achter waar en krijg ook geen foutmeldingen terug.
Code (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
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
public function getVacatures($database, $online = NULL, $id = NULL)
{
$sql = "SELECT * FROM ".$database."_vacatures";
if(!empty($id))
{
$sql .= " WHERE vacature_ID=:id";
}
if(!empty($online) && $online == 1)
{
$sql .= " WHERE vacature_actief='1'";
}
try
{
$stmt = $this->db->prepare($sql);
if(!empty($id)) { $stmt->bindParam(":id", $id, PDO::PARAM_INT); }
$stmt->execute();
$this->vacatureitems = $stmt->fetchAll(PDO::FETCH_OBJ);
$stmt->closeCursor();
return $this->vacatureitems;
}
catch(Exception $e)
{
die ( $e->getMessage() );
}
}
{
$sql = "SELECT * FROM ".$database."_vacatures";
if(!empty($id))
{
$sql .= " WHERE vacature_ID=:id";
}
if(!empty($online) && $online == 1)
{
$sql .= " WHERE vacature_actief='1'";
}
try
{
$stmt = $this->db->prepare($sql);
if(!empty($id)) { $stmt->bindParam(":id", $id, PDO::PARAM_INT); }
$stmt->execute();
$this->vacatureitems = $stmt->fetchAll(PDO::FETCH_OBJ);
$stmt->closeCursor();
return $this->vacatureitems;
}
catch(Exception $e)
{
die ( $e->getMessage() );
}
}
Dit is de class van vacatures en deze werkt perfect...
Wat ik me nu alleen afvraag is wat er precies mis gaat. Je zegt dat een radiobutton op actief blijft staan, maar dit is een class die zo te zien alleen een query opbouwt en execute. Dat heeft op zich niets met die radiobutton te maken. Dus ofwel je kan ons nu vertellen dat je niet de juiste output uit de query krijgt (en het dus in bovenstaande stuk zit), ofwel je kan ons vertellen dat je wel de juiste output krijgt en je dus de verkeerde code hebt getoond....
Met die radio button bedoel ik in het CMS. Daar kan je teksten aanpassen en op actief of niet actief zetten. Als ik deze aanpas en POST blijft hij wel op niet actief staan dus daar gaat het niet mis en in de database staat hij dan ook op 0. Dat schijnt dus allemaal goed te werken. Ik heb nu al verschillende dingen geprobeerd en wat er gebeurd is of hij toont alle 2 de teksten nog of hij toont nergens iets meer. En ik heb geen idee waar het nu aan ligt. Misschien mijn SQL printen?
Ik zou eerst kijken of je de juiste output krijgt uit je query. Dus print_r de $result voor je die returned uit de functie. Krijg je output die je verwacht?
Echter laat hij wel zien dat de tekst die ik niet actief heb gezet ook op 0 staat en dus niet actief is en de teksten die wel actief zijn staan op 1. ([tekst_actief] => 0)
Maar hij laat hem dus nog steeds zien. Hij plakt nu gewoon al mijn teksten die bestaan achter elkaar op 1 pagina. Zucht... Ben volgens mij zo dichtbij alleen ik zie de oplossing gewoon niet... of het probleem
Maar je beantwoord mijn vraag niet, krijg je de output die je verwacht?
Ja de output die ik krijg daar is niks vreemds aan te zien en klopt ook gewoon naar mijn idee
Dan hoef je dus niet verder te kijken naar de code hierboven en zit de fout heel ergens anders.
Toevoeging op 22/05/2012 13:08:52:
Ik heb nu $actief = NULL achter $bladzijde gezet en het probleem dat hij al mijn teksten op 1 pagina toont is nu weg. Echter de 2 teksten waarvan ik er 1 inactief heb gezet zijn beide nog steeds zichtbaar terwijl dit niet zou moeten...
Dit is mijn Class:
Code (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
51
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
51
<?php
public function getTeksten($database, $taal, $bladzijde = NULL, $actief = NULL, $id = NULL)
{
$sql = "SELECT * FROM ".$database."_teksten WHERE tekst_taal=:taal";
if(!empty($id))
{
if(is_numeric($id))
{
$sql .= " WHERE tekst_ID=:id";
}
if(!empty($actief) && $actief == 1)
{
$sql .= " AND tekst_actief='1'";
}
}
else if(!empty($bladzijde))
{
if(is_numeric($bladzijde))
{
$sql .= " AND tekst_bladzijde=:bladzijde";
}
else
{
return NULL;
}
}
$sql .= " ORDER BY tekst_volgorde ASC";
try
{
$stmt = $this->db->prepare($sql);
$stmt->bindParam(":taal", $taal, PDO::PARAM_STR);
if(!empty($id) && is_numeric($id))
{
$stmt->bindParam(":id", $id, PDO::PARAM_INT);
}
else if(!empty($bladzijde) && is_numeric($bladzijde))
{
$stmt->bindParam(":bladzijde", $bladzijde, PDO::PARAM_INT);
}
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_OBJ);
$stmt->closeCursor();
return $result;
}
catch(Exception $e)
{
die($e->getMessage());
}
}
?>
public function getTeksten($database, $taal, $bladzijde = NULL, $actief = NULL, $id = NULL)
{
$sql = "SELECT * FROM ".$database."_teksten WHERE tekst_taal=:taal";
if(!empty($id))
{
if(is_numeric($id))
{
$sql .= " WHERE tekst_ID=:id";
}
if(!empty($actief) && $actief == 1)
{
$sql .= " AND tekst_actief='1'";
}
}
else if(!empty($bladzijde))
{
if(is_numeric($bladzijde))
{
$sql .= " AND tekst_bladzijde=:bladzijde";
}
else
{
return NULL;
}
}
$sql .= " ORDER BY tekst_volgorde ASC";
try
{
$stmt = $this->db->prepare($sql);
$stmt->bindParam(":taal", $taal, PDO::PARAM_STR);
if(!empty($id) && is_numeric($id))
{
$stmt->bindParam(":id", $id, PDO::PARAM_INT);
}
else if(!empty($bladzijde) && is_numeric($bladzijde))
{
$stmt->bindParam(":bladzijde", $bladzijde, PDO::PARAM_INT);
}
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_OBJ);
$stmt->closeCursor();
return $result;
}
catch(Exception $e)
{
die($e->getMessage());
}
}
?>
Wat gaat er nu nog fout? Ik heb alles nagelopen en het aanpassen van actief naar niet actief in de database gaat goed. Het tonen in het CMS van of een tekst niet actief is of wel actief gaat ook goed. Mijn Class hierboven geeft geen errors dus of ik vergeet ergens iets of ik maak in mijn Class een fout
Er alleen naar kijken lost niets op.
SELECT * FROM auz_teksten WHERE tekst_taal=:taal AND tekst_bladzijde=:bladzijde ORDER BY tekst_volgorde ASC
Wat ik verwacht is dat AND tekst_actief=:actief er ook bij zou zitten alleen deze lijkt hij compleet over te slaan.
Je wil toch alleen de actieve berichten zien? Dan kun je toch gewoon altijd AND tekst_actief='1'doen. Als het 0/NULL is zal hij de records niet meepakken alleen waar hij 1 is.
Wanneer moet ik deze dan oproepen?
Nee idd, dit zet je toch gewoon rechtreeks in je SELECT statement.
Ik ben nog niet zo heel lang actief met PHP en heb dit samen met een vriend in elkaar gezet. Soms maak ik dus nog van deze stomme fouten omdat ik na een tijd helemaal de logica niet meer zie. Het was dus een hele simpele oplossing alleen zag ik deze totaal niet. Heb het nu zo gedaan zoals jij het deed en het werkt prima. Liep ergens anders nog tegen een probleem aan maar dat is ook al verholpen.
In ieder geval bedankt voor de moeite. Soms is het even nodig dat iemand anders er een frisse blik op werpt en me op het rechte pad zet.
Bedankt.
Graag gedaan.
Er bestaan geen domme fouten, daar leren we van. En idd hoe groter je scripts zijn hoe meer bomen in het bos, en je kent de uitdrukking he ;).
Succes!
Code (php)
Afgezien van de actief (die je alleen test als id niet empty is, dus je krijgt actief niet altijd mee), heb je ook mogelijk een dubbel where statement. In de basis SQL staat namelijk al 'WHERE tekst_taal=:taal' en als er een id gegeven is dan wordt er nog eens achter geplakt 'WHERE tekst_ID=:id'. Twee keer WHERE kan niet.