Wat doe ik fout?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bertus Wikkerink

Bertus Wikkerink

28/05/2011 20:03:41
Quote Anchor link
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
<?php
         $rubriek_id
=(int)$_GET['rubriek_id'];
         echo $rubriek_id;

    // Even los van die verkeerd gebruikte OR die methode.
    $db = mysql_connect("server","naam","wachtwoord") OR die ("Verbinding mislukt");
    mysql_select_db("naam onderdeel",$db);

         $object_SQL="SELECT * FROM objecten,objectcategorien,objectfoto
                    WHERE objectcategorien.rubriek_id="
. (INT)$_GET['rubriek_id'] .
                    " AND objectcategorien.ocat_id=objecten.ocat_id AND objectfoto.
                    object_id=objecten.object_id AND objectfoto.beginbeeld='y' ORDER
                    BY object_naam ASC LIMIT $pos,$count"
;;

         $object_result=mysql_query($object_SQL);

while($object=mysql_fetch_array($object_result)){
          echo $object['ocat_naam'];
}


Ik krijg hier keurig de waarde die (int)$_GET['rubriek_id'] behoort te hebben.
nl de rubriek categorie die doorgegeven is door andere pagina.
Maar de zin achter WHERE wil niet goed reageren. Hij wordt niet herkend zoals zou moeten.
Wat doe ik hier fout?!!!

Want als het wel goed zou gaan, zou ik ook keurig $object['ocat_naam'] moeten krijgen.
Alle namen zijn geschecked met de namen in de databases.
 
PHP hulp

PHP hulp

08/05/2021 06:59:15
 
Erik van de Locht

Erik van de Locht

28/05/2011 20:18:55
Quote Anchor link
Hoi Bertus,

Even een paar opmerkingen:
Je cast op regel 2 de variabele $rubriek_id naar int, om hem op regel 10 in je query opnieuw te casten heeft weinig toegevoegde waarde ;-)

Kijk eens een keer wat tutorials op internet door over JOIN expressies in MySQL, je query haalt nu namelijk een heleboel data binnen omdat je een select doet over meerdere tabellen.

Controleer of je een database connectie hebt met een IF statement:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$connectie
= mysql_connect('..','..','..');
if ($connectie == false) {
  /*
    Foutafhandeling, connectie mislukt.
  */

} ?>

De functie mysql_connect() returnt namelijk false als de connectie mislukt en een connection link als de verbinding lukt.

Regel 13, haal de variabelen buiten de quotes. Ook sluit je de query af met 2 keer een ;

Doe in plaats van de while loop eens:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php var_dump(mysql_fetch_array($object_result)); ?>


Je ziet dan exact wat er in je array staat. Werk van daar uit verder.

Wat je nu doet, is ALLES uit alle 3 de tabellen selecteren. Kolomnamen komen wellicht vaker voor in die 3 tabellen. Vandaar is het verstandig om met var_dump() even te kijken wat je terug krijgt.
Gewijzigd op 28/05/2011 20:23:26 door Erik van de Locht
 
Bertus Wikkerink

Bertus Wikkerink

28/05/2011 20:42:31
Quote Anchor link
Beste Erik,
dank voor je snelle reactie.
Ik heb op regel drie even getest of de variabele wel een waarde had.
Regel drie en vier komen in het script niet voor.

Moet ik bij de var_dump nog echoën met alle kolomnamen of krijg ik de waarden van de hele array te zien?

Groetjes Bertus
 
Erik van de Locht

Erik van de Locht

28/05/2011 21:05:17
Quote Anchor link
http://nl.php.net/var_dump

Kijk naar de voorbeelden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$a
= array(1, 2, array("a", "b", "c"));
var_dump($a);
?>


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
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  array(3) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    string(1) "c"
  }
}


Gewoon even in plaats van dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
while($object=mysql_fetch_array($object_result)){
          echo $object['ocat_naam'];
}
?>


Dit neer zetten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
var_dump(mysql_fetch_array($object_result));
?>


Dan krijg je alle data die je geselecteerd hebt met je query te zien. Kolomnamen o.i.d. hoeft niet. mysql_fetch_array() heeft een array met de gegevens als return waarde. var_dump() weergeeft de inhoud van de variabele op het scherm.

Nog een opmerking: Je herhaalt jezelf nu in je code. Eerst declareer je de variabele $rubriek_id en cast je deze waarde naar int. Later in je code gebruik je de _GET variabele. Je kunt hier net zo goed de $rubriek_id gebruiken, die heb je immers al gecast.
Gewijzigd op 28/05/2011 21:12:30 door Erik van de Locht
 
Bertus Wikkerink

Bertus Wikkerink

29/05/2011 13:02:15
Quote Anchor link
Beste Erik,
met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
var_dump(mysql_fetch_array($object_result));
?>


Krijg ik:
boolean false
als antwoord.

Ik denk dat de syntaxis van de SQL niet fout is.
Dus zit er waarschijnlijk in de structuur of wel join iets fout.

Nu alleen nog uitzoeken wat!

Groetjes,

Bertus


Toevoeging op 29/05/2011 13:07:34:


PS:
De tabel objectcategorien bevat de kolommen:
ocat_id ocat_naam ocat_beschrijving rubriek_id

De tabel objecten bevat de kolommen:
object_id object_nummer object_naam objectt_beschrijving rubriek_id ocat_id

De tabel objectfoto bevat de kolommen:
object_object_afbeelding_id object_id object_afbeelding_klein
object_afbeelding_groot beginbeeld
 
Erik van de Locht

Erik van de Locht

29/05/2011 13:17:10
Quote Anchor link
Oke, mysql_fetch_array() returnt dus false.
Neem een kijkje in de PHP documentatie:
http://nl3.php.net/mysql_fetch_array

Quote:
Returns an array of strings that corresponds to the fetched row, or FALSE if there are no more rows.


Er zijn dus geen rijen waar hij doorheen kan lopen. Dat zou betekenen dat je:
a) geen resultaten krijgt met je query
b) query een syntaxfout heeft

Dan gaan we eens verder uitpuzzelen wat het probleem kan zijn.
Doe in plaats van dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$object_SQL
="SELECT * FROM objecten,objectcategorien,objectfoto
                    WHERE objectcategorien.rubriek_id="
. (INT)$_GET['rubriek_id'] .
                    " AND objectcategorien.ocat_id=objecten.ocat_id AND objectfoto.
                    object_id=objecten.object_id AND objectfoto.beginbeeld='y' ORDER
                    BY object_naam ASC LIMIT $pos,$count"
;

         $object_result=mysql_query($object_SQL);
?>


Eens dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$object_SQL
='SELECT * FROM objecten,objectcategorien,objectfoto
                    WHERE objectcategorien.rubriek_id='
. (INT)$_GET['rubriek_id'] .
                    ' AND objectcategorien.ocat_id=objecten.ocat_id AND objectfoto.
                    object_id=objecten.object_id AND objectfoto.beginbeeld="y" ORDER
                    BY object_naam ASC LIMIT '
.$pos.','.$count;
if ($result = mysql_query($object_SQL) == false) {
  // mysql_query returnt false als de query mislukt. Dan komen we dus hier in.
  // mysql_error() returnt de error van de laatst uitgevoerde query

  echo 'Error: ' . mysql_error();
}
else {
  echo 'Query geslaagd, aantal results: ' . mysql_num_rows($result);
}
?>


Dan krijg je nu de fout van de query te zien, MITS er een fout optreed. Zo niet, dan krijg je het aantal records te zien wat er geselecteerd is (schijnbaar dan dus 0).
Gewijzigd op 29/05/2011 13:17:52 door Erik van de Locht
 
Bertus Wikkerink

Bertus Wikkerink

29/05/2011 14:12:56
Quote Anchor link
Dit is het antwoord:

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Schijfletter\wamp\www\sitenaam\catalogus\rubriek_list.php on line 57
Call Stack
# Time Memory Function Location
1 0.0054 407472 {main}( ) ..\rubriek_list.php:0
2 0.0301 415760 mysql_num_rows ( ) ..\rubriek_list.php:57
Query geslaagd, aantal results:
( ! ) Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Schijfletter\wamp\www\Sitenaam\catalogus\rubriek_list.php on line 63
Call Stack
# Time Memory Function Location
1 0.0054 407472 {main}( ) ..\rubriek_list.php:0
2 0.0306 415928 mysql_fetch_array ( ) ..\rubriek_list.php:63

null
Gewijzigd op 29/05/2011 14:14:31 door Bertus Wikkerink
 
Erik van de Locht

Erik van de Locht

29/05/2011 14:43:06
Quote Anchor link
Oh wacht, volgensmij ging er iets mis in het IF statement wat ik geschreven had. Er werd namelijk een vergelijking gedaan met het resultaat van de query en 'false'. Dat resultaat is een boolean en dat werd in $result gezet.

Hier heb ik het net iets anders opgebouwd. Probeer dit eens:
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
<?php
$object_SQL
='SELECT * FROM objecten,objectcategorien,objectfoto
                    WHERE objectcategorien.rubriek_id='
. (INT)$_GET['rubriek_id'] .
                    ' AND objectcategorien.ocat_id=objecten.ocat_id AND objectfoto.
                    object_id=objecten.object_id AND objectfoto.beginbeeld="y" ORDER
                    BY object_naam ASC LIMIT '
.$pos.','.$count;
$result = mysql_query($object_SQL);
if ($result == false) {
  // mysql_query returnt false als de query mislukt. Dan komen we dus hier in.
  // mysql_error() returnt de error van de laatst uitgevoerde query

  echo 'Error: ' . mysql_error();
}
else {
  echo 'Query geslaagd, aantal results: ' . mysql_num_rows($result);
}
?>
 
Bertus Wikkerink

Bertus Wikkerink

29/05/2011 15:19:13
Quote Anchor link
Nu krijg ik dit:
Query geslaagd, aantal results: 0

Dit zou dus inhouden dat er geen waarden in de velden zouden zitten.
Of bedoelt ie nou dat er geen databases zijn gevonden?

Immers de Qeury (vraag aan databases) is geslaagd.
En toch zegt ie dat er geen resultaten zijn.
Dan blijft volgens mij over dat de join niet goed is. Toch?
 
Erik van de Locht

Erik van de Locht

29/05/2011 16:18:15
Quote Anchor link
Als de query wel slaagt maar je krijgt geen resultaten, dan is de query dus wel correct maar zijn er gewoon geen resultaten in de database die aan je query voldoen.

Je hebt het over een join, maar je gebruikt geen join ;-) Je selecteert uit meerdere tabellen.

Ik heb een poging gedaan om te selecteren wat je (volgens mij) wil.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
$object_SQL = 'SELECT
    o.object_nummer,
    o.object_naam,
    o.object_beschrijving,
    of.object_afbeelding_klein,
    of.object_afbeelding_groot,
    oc.ocat_naam
FROM objecten o
INNER JOIN objectcategorien oc ON o.ocat_id = oc.ocat_id
INNER JOIN objectfoto of ON o.object_id = of.object_id
WHERE of.beginbeeld = "y"
ORDER BY o.object_naam ASC LIMIT '.$pos.','.$count;


Je zult aan moeten geven wat je allemaal wil selecteren, dus wellicht staat nog niet alles er in. Onthoud: Onnodige selects = minder performance.

Met deze query zul je alle objecten krijgen waarvan de waarde 'beginbeeld' van 'foto' op 'y' staat. Ook krijg je de categorienaam en de afbeelding-adressen er bij.

Mocht dit niet voldoen aan wat je wil; geef dan even een bondige uitleg van wat je wel graag wil.

De naamgeving in de tabel is trouwens niet al te best, 'object_object_afbeelding_id' is niet bepaald "helder" :p

Uit je ontwerp kan ik opmaken dat een object tot 1 categorie behoort en een object meerdere foto's kan hebben?
 
Bertus Wikkerink

Bertus Wikkerink

29/05/2011 16:24:14
Quote Anchor link
Beste Erik,
ik heb de SQL even voor het gemak veranderd in:
$object_SQL="SELECT * FROM objecten,objectcategorien,objectfoto
WHERE objectcategorien.rubriek_id=" . (INT)$_GET['rubriek_id'] .
" AND objectcategorien.ocat_id=objecten.ocat_id LIMIT $pos,$count";
$result = mysql_query($object_SQL);
if ($result == false) {
// mysql_query returnt false als de query mislukt. Dan komen we dus hier in.
// mysql_error() returnt de error van de laatst uitgevoerde query
echo 'Error: ' . mysql_error();
} else {
echo 'Query geslaagd, aantal results: ' . mysql_num_rows($result);
}

En ik krijg volgend resultaat:
Query geslaagd, aantal results: 5
array
0 => string '25' (length=2)
'object_id' => string '0019' (length=4)
1 => string '1199' (length=4)
'object_nummer' => string '1199' (length=4)
2 => string 'Draagtas katoen met korte hengsels' (length=34)
'object_naam' => string 'Draagtas katoen met korte hengsels' (length=34)
3 => string '42x38cm' (length=7)
'object_beschrijving' => string '42x38cm' (length=7)
4 => string '12' (length=2)
'object_materiaal_id' => string '12' (length=2)
5 => string '1' (length=1)
'object_kleur_id' => string '1' (length=1)
6 => string '25' (length=2)
'object_prijs_id' => string '25' (length=2)
7 => string '1199_list.jpg' (length=13)
'object_afbeelding_klein' => string '0019_list.jpg' (length=13)
8 => string '1199_zoom.jpg' (length=13)
'object_afbeelding_groot' => string '0019_zoom.jpg' (length=13)
9 => string '1' (length=1)
'rubriek_id' => string '1' (length=1)
10 => string '1' (length=1)
'ocat_id' => string '1' (length=1)
11 => string '1' (length=1)
12 => string 'Textiel' (length=7)
'ocat_naam' => string 'Textiel' (length=7)
13 => string 'Textiel' (length=7)
'ocat_beschrijving' => string 'Textiel' (length=7)
14 => string '1' (length=1)
15 => string '1' (length=1)
'objectobject_afbeelding_id' => string '1' (length=1)
16 => string '0019' (length=4)
17 => string '0019_list.jpg' (length=13)
18 => string '0019_zoom.jpg' (length=13)
19 => string 'y' (length=1)
'beginbeeld' => string 'y' (length=1)

Textiel
1
1
1199
Draagtas katoen met korte hengsels
0117
Textiel
1
1
1199
Draagtas katoen met korte hengsels
0129
Textiel
1
1
1199
Draagtas katoen met korte hengsels
0200
Textiel
1
1
1199
Draagtas katoen met korte hengsels
0228

<< Begin Volgende >>

Het klopt dat er nog maar 1 artikel in de rubriek TEXTIEL staat.

Dus schiet het al op:
De fout moet dus in het oproepen van de afbeelding zitten.(in de tabel objectfoto zitten geen afbeeldingen alleen maar de namen van de foto's. De foto's zelf staan in een aparte map in de map Catalogus)

Groetjes,

Bertus
 
Erik van de Locht

Erik van de Locht

29/05/2011 16:26:58
Quote Anchor link
Bertus,

Mooi dat er vordering in zit. Voor het geval mijn vorige post je niet opgevallen is, kijk daar even naar (maar zet de query die je nu hebt wel voor de zekerheid even in comment; mocht mijn query niet doen wat je wil!).

Erik
 
Bertus Wikkerink

Bertus Wikkerink

25/06/2011 18:43:53
Quote Anchor link
Aan Allen,

ik ben een weekje weg geweest naar de kust en heb eens goed kunnen nadenken.
Ik kwam er al gauw achter dat ik in verschillende tabellen dezelfde kolomnamen gebruikte:
bv bij de tabel artikelen ART_NR en bij de tabel kleur ook een kolom ART_NR.
hierdoor werd bij var_dump (En dus bij de query) niet alles getoond.
Vandaar dat ik bv namen als object.object_nummer of objectcategorie.object_nummer gebruik.
Inmiddels werkt alles zoals ik het wil en wel met een herhaling van de query's en met een if statement.
Als ik bv in een tabel (waar ik verschillende tabellen mee koppel) twee of drie kleuren voor een artikel heb verdeeld in verschillende rijen, dan kan ik met het if statement meermalen rijen doorlopen met behulp van mysql_num_rows.
Hierbij kan ik de data vergelijken en indien bv het artikelnummer in de volgende rij het zelfde artikelnummer is, kan ik dan de data en/of waarde die in die rij bij hetzelfde artikelnummer staat ook op de pagina plaatsen.
In de query die ik heb gebruikt en waar jullie op gereageerd hebben, werd maar 1 rij opgevraagd en dus ook maar 1 kleur afgedrukt.(Dat bleek het probleem)
Het is echter niet netjes van mij om dit item niet af te sluiten.
Dus bij deze:
Voor mij is dit item gesloten.
En ik dank jullie allemaal die gereageerd hebben voor jullie inbreng. Het heeft mij geholpen om uiteindelijk de juiste oplossing te vinden en ik heb er ook weer iets van opgestoken.(NB var_dump bv)

Dus nogmaals dank.

Groeten,

Bertus
 

25/06/2011 18:52:17
Quote Anchor link
Bertus Wikkerink op 25/06/2011 18:43:53:
Aan Allen,

ik ben een weekje weg geweest naar de kust en heb eens goed kunnen nadenken.
Ik kwam er al gauw achter dat ik in verschillende tabellen dezelfde kolomnamen gebruikte:(...)


Daarom roep ik altijd: "Selecteer wat je wilt hebben, gebruik geen *".
Als je selecteert wat je wilt hebben weet je wat je ophaalt, er kan dan ook geen verwarring ontstaan bij de database over wat je nu precies wilt.
 
Noppes Homeland

Noppes Homeland

25/06/2011 18:52:31
Quote Anchor link
Dan wil ik er toch noch nadrukkelijk op wijzen:
dat:
1. als je doet
if ($result = mysql_query(sql) == false)
je in feite niet goed bezig bent.

als een functie false kan terug geven dan moet je een exacte (type) controle doen.
if (($result = mysql_query(sql)) === false)
en het is dan ook overzichtelijker extra () toe te voegen zodat je kan zien waar het een en ander op slaat

2. het gebruik van mysql_fetch_array zonder het opgeven van de 2de parameter af te leren, dan wel altijd mysql_fetch_assoc te gebruiken

3. type je queries netjes uit, houd het overzichtelijk

4. als je waarden van buitenaf in je queries gebruikt dan moet je je beschermen tegen sql injectie!! een cast heeft geen nut
Gewijzigd op 25/06/2011 19:12:19 door Noppes Homeland
 



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.