Query uitleg, MYSQl-database voor een bibliotheek

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

11/06/2011 16:14:23
Quote Anchor link
Hallo allemaal,

Geheel ervaringloos met PHP ben ik gelukkig niet, maar toch kreeg ik op andere fora het idee dat ik nog flink achterloop op de rest, vandaar dat ik mijn vraag hier plaats.

Ik ben momenteel bezig met een MYSQl-database voor mijn bibliotheek die ik vanuit een php-bestand kan bezoeken. Vanuit het hoofdscherm kan met [1] een invoerveld en [2] een keuzelijst worden gezocht in de database. De keuzelijst bevat opties als "zoek in alles, auteur, titel, ISBN, uitgever" enzovoorts.
Ik wil echter dat er bij het zoeken op personen (auteur, uitgever, drukker, onderwerp) een andere query wordt uitgevoerd dan bij zaken als boeken of een algemene zoekterm.

Nu kreeg ik de volgende query-onderdelen van iemand als antwoord:

$sQuery = "SELECT foo FROM bar WHERE true ";
if ($_POST['keuze']) { $sQuery .= " AND .... LIKE '%....%' "};

Ik snap dat de regel met 'if' betekent dat er een ander soort query moet worden uitgevoerd als er een andere keuze (auteur, titel etc..) wordt gemaakt. Voor de rest snap ik eerlijk gezegd helemaal niets van deze codes. Hoe moet ik deze gebruiken? Wat heb ik er voor nodig?

Alvast bedankt,

Mark
Gewijzigd op 11/06/2011 16:32:54 door Niels K
 
PHP hulp

PHP hulp

21/11/2024 12:49:45
 
Erik van de Locht

Erik van de Locht

11/06/2011 16:33:11
Quote Anchor link
Je kunt in je PHP de afweging maken wat de WHERE condities zijn.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$query
= 'SELECT veld1, veld2 FROM foo ';
if ($var == 'auteur') {
  $query .= 'WHERE auteur LIKE "%naam%"';
elseif ($var == 'titel') {
  $query .= 'WHERE titel LIKE "%titel%"';
}

?>


Als de query exact hetzelfde is alleen het veldnaam per selectie anders is; en dan ook nog er van uitgaande dat de value van de select-box overeen komt met de kolomnaam in de database, kun je die rechtstreeks in je query plakken. Dat zou simpeler zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
/*
  Ga er van uit dat je selectbox de naam 'soort' draagt
*/

$query = 'SELECT veld1, veld2 FROM foo WHERE '.mysql_real_escape_string($_POST['soort']).' = "%zoekwaarde%"';
// Voer query uit
?>
 

11/06/2011 16:45:13
Quote Anchor link
Ok, ik snap de $query nu =). Dank je wel! Ik maak gebruik van je eerste stukje, dat snap ik het beste.

Alleen nu vraag ik me wel de volgende dingen af:
1. Waar precies moet ik dat stukje code zetten? Momenteel is het PHP-stuk dat de query behandelt als volgt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$zoekterm
= $_POST["zoekterm"];
$voorwaarde = $_POST["voorwaarde"];
$mysql = mysql_connect("localhost","vermeermark","vermeermark") or die("Fout: Er is geen verbinding met de server tot stand gebracht!");
mysql_select_db("bibliotheek") or die("Fout: Het openen is mislukt!");
$resultaat = mysql_query("SELECT ... FROM ... WHERE ...") or die("De query op de database is mislukt!");
mysql_close() or die("Het verbreken van de verbinding met de server is mislukt!");
?>


2. Bij de verschillende queries moeten verschillende resultaten worden weergegeven, én afgedrukt. Bepaalde queries geven 4 cellen met resultaten, andere maar 2 cellen. Hoe moet ik die verandering in tabelstructuur weer geven?
 
Jasper DS

Jasper DS

11/06/2011 17:24:47
Quote Anchor link
- ga niet onnodig $vars kopieren
- gebruik geen or die

wat wil je nu dat je query weergeeft?
Gewijzigd op 11/06/2011 17:25:34 door Jasper DS
 

11/06/2011 17:28:53
Quote Anchor link
Ik wil, zoals ik al zei, dat mijn query bij bepaalde keuzes de naam van de auteur, de titel, het jaar en de aantal exemplaren weergeeft. Bij keuzes als zoeken op auteur, zoeken op uitgever e.d., wil ik dat de query slechts de naam van de auteur/uitgever/etc. weer geeft en het aantal boeken.

Misschien is het niet het handigst om dingen meerdere malen te kopiëren, maar zoals ik al zei: dit is hoe ik het snap, en ik ga niets gebruiken dat ik niet snap.
Gewijzigd op 11/06/2011 17:32:00 door
 
Jasper DS

Jasper DS

11/06/2011 18:40:27
Quote Anchor link
Zoals je het nu doet is het niet correct. Verwijder zeker de or die al en vervang dit door een goede foutafhandeling.

Kijk ook even naar de post van Erik
 

11/06/2011 19:01:25
Quote Anchor link
Ik moet er misschien nog even bij zeggen dat deze database niet op internet verschijnt, en dus alleen door mij gebruikt wordt. Ik heb de 'or die'-code overigens op school geleerd en zonder enig probleem altijd gebruikt. Daarom vind ik het raar dat deze zo fout is. Maar ik zal er eens naar kijken. Als jij ook nog tips hebt voor mijn vraag hoe het met het printen van de gegevens moet, dan hoor ik dat graag.
Gewijzigd op 11/06/2011 19:03:26 door
 
Jasper DS

Jasper DS

11/06/2011 19:20:00
Quote Anchor link
dan zou ik toch eens zeggen tegen je leraar dat dit fout is, stel nu jij maakt een foutje. Dan hoef jij toch ook niet dood? Waarom zou je je script laten sterven als hij een foutje maakt?!

zo kan je gegevens uit de db halen:
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
<?php
    $sql
=    "SELECT veld1, veld2
             FROM tabel
            "
;

    # Check je query        
    if(($result = mysql_query($sql)) === false)
    {

        # de query is fout, weergeef in test-fase eventueel mysql_error()
        echo' Fout met database!';
    }

    elseif(mysql_num_rows($result) < 1)
    {

        echo 'Er zijn geen gegevens gevonden';
    }

    else
    {
        # De query is gelukt -> fetchen
        while($row = mysql_fetch_assoc($result))
        {

            echo $row['veld1'].'<br/>';    
            echo $row['veld2'].'<br/>';    
        }
    }

?>
 

11/06/2011 19:30:29
Quote Anchor link
Ok, dan ga ik dit eens proberen. Maar waar precies moet het stukje van Erik met de if's en elseif's?
 
Jasper DS

Jasper DS

11/06/2011 19:33:51
Quote Anchor link
dat moet je vervangen door lijn 2-4
 

11/06/2011 23:36:06
Quote Anchor link
Ik heb de code veranderd, zoals hier (gedeeltelijk) te lezen is. Ik krijg echter een foutmelding op de elseif-regel (regel 13, regel 5 in onderstaande code):

Parse error: syntax error, unexpected T_ELSEIF in V:\www\bibliotheekzoekvraag2.php on line 13


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
<?php
              $query
= 'SELECT ACHTERNAAM, KOMMA, VOORNAAM, TUSSENVOEGSELS, B.BOEKNR, TITEL, DUBBELPUNT, SUBTITEL, UITGAVE, AANTAL_EXEMPLAREN FROM AUTEURS AS A, BOEKEN AS B, EXEMPLAREN AS E, ISBN AS I ';
        if ($voorwaarde == 'alles') {
               $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND ALLES LIKE "%$zoekterm%" ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';        
        elseif ($voorwaarde == 'auteur') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND ACHTERNAAM LIKE "%$zoekterm%" ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';
        elseif ($voorwaarde == 'uitgever') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND UITNR IN (SELECT UITNR FROM UITGEVERS WHERE UITNAAM LIKE "%$zoekterm%"';    
        elseif ($voorwaarde == 'isbn') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND ISBN LIKE "%$zoekterm%" ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';    
        elseif ($voorwaarde == 'serie') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND SERIE LIKE "%$zoekterm%" ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';    
        elseif ($voorwaarde == 'onderwerp') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND OWNR IN (SELECT OWNR FROM ONDERWERPEN WHERE ACHTERNAAM LIKE "%$zoekterm%"';
        elseif ($voorwaarde == 'coauteurs') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND COAUTEURSNR IN (SELECT AUTEURNR FROM AUTEURS WHERE ACHTERNAAM LIKE "%$zoekterm%") OR COAUTEURSNR2 IN (SELECT AUTEURNR FROM AUTEURS WHERE ACHTERNAAM LIKE "%$zoekterm%") OR COAUTEURSNR3 IN (SELECT AUTEURNR FROM AUTEURS WHERE ACHTERNAAM LIKE "%$zoekterm%") OR COAUTEURSNR4 IN (SELECT AUTEURNR FROM AUTEURS WHERE ACHTERNAAM LIKE "%$zoekterm%") ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC"';    
        elseif ($voorwaarde == 'provnaam') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND PROVNR IN (SELECT PROVNR FROM PROVENANCE WHERE ACHTERNAAMP LIKE "%$zoekterm%") OR PROVNR2 IN (SELECT PROVNR FROM PROVENANCE WHERE ACHTERNAAMP LIKE "%$zoekterm%") OR PROVNR3 IN (SELECT PROVNR FROM PROVENANCE WHERE ACHTERNAAMP LIKE "%$zoekterm%") ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';
        elseif ($voorwaarde == 'drukker') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND DRUKKERNR IN (SELECT DRUKKERNR FROM DRUKKERS WHERE ACHTERNAAM LIKE "%$zoekterm%") OR DRUKKERNR2 IN (SELECT DRUKKERNR FROM DRUKKERS WHERE ACHTERNAAM LIKE "%$zoekterm%") OR DRUKKERNR3 IN (SELECT DRUKKERNR FROM DRUKKERS WHERE ACHTERNAAM LIKE "%$zoekterm%") ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';
}

?>
Gewijzigd op 11/06/2011 23:39:33 door
 
Gerhard l

gerhard l

11/06/2011 23:39:31
Quote Anchor link
je sluit nergens je if's af.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if( - statement - ){
   //hier je code
}
//en weer afsluiten
?>


in jou geval kan je hier beter gebruik maken van een switch

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
<?php
if(isset($voorwaarde)){
switch($voorwaarde){
   case:
alles:
       //je code bij alles
   break;
  
   case:
auteur:
       //je code voor auteur
   break;
}
}

else{
   //$voorwaarde bestaat niet
}
?>
 

11/06/2011 23:40:56
Quote Anchor link
Ik heb hem overgenomen zoals hierboven. Maar na de ; achter elke query moet er dus een } komen?
 
Gerhard l

gerhard l

11/06/2011 23:42:59
Quote Anchor link
ja ik zie het @Erik heeft het vergeten,
als je Erik's voorbeeld wil gebruiken:
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
<?php
$query
= 'SELECT veld1, veld2 FROM foo ';
if ($var == 'auteur') {
  $query .= 'WHERE auteur LIKE "%naam%"';
}
//afsluiten
elseif ($var == 'titel') {
  $query .= 'WHERE titel LIKE "%titel%"';
}

elseif ($var == 'titel') {
  $query .= 'WHERE titel LIKE "%titel%"';
}

elseif ($var == 'titel') {
  $query .= 'WHERE titel LIKE "%titel%"';
}

elseif ($var == 'titel') {
  $query .= 'WHERE titel LIKE "%titel%"';
}

elseif ($var == 'titel') {
  $query .= 'WHERE titel LIKE "%titel%"';
}

elseif ($var == 'titel') {
  $query .= 'WHERE titel LIKE "%titel%"';
}

?>
Gewijzigd op 11/06/2011 23:43:27 door gerhard l
 

11/06/2011 23:45:00
Quote Anchor link
Dank je: nu doet hij het wel, al zijn er weer andere dingen die fout gaan. Het blijft een hele taak zeg...
 
Gerhard l

gerhard l

11/06/2011 23:47:34
Quote Anchor link
Gewoon blijven oefenen/proberen leer je het meeste van, en als je er echt niet uit komt stel gerust je vraag hier
Gewijzigd op 11/06/2011 23:47:47 door gerhard l
 

11/06/2011 23:51:41
Quote Anchor link
Tot nu toe heb ik gelukkig de meeste problemen zelf kunnen oplossen, maar daarvoor heb ik nooit de 'hoofdstructuur' van het gegevensopvragen uit een database moeten omgooien. Anders dan eerst begeef ik me nu dus op glad ijs, met veel termen die mij niets zeggen. Nu heb ik een fout met de code mysql_fetch_row()

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in V:\www\bibliotheekzoekvraag2.php on line 35 (regel 27 hieronder)


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
28
29
30
31
32
<?php
              $query
= 'SELECT ACHTERNAAM, KOMMA, VOORNAAM, TUSSENVOEGSELS, B.BOEKNR, TITEL, DUBBELPUNT, SUBTITEL, UITGAVE, AANTAL_EXEMPLAREN FROM AUTEURS AS A, BOEKEN AS B, EXEMPLAREN AS E, ISBN AS I ';
        if ($voorwaarde == 'alles') {
               $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND ALLES LIKE "%$zoekterm%" ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';}        
        elseif ($voorwaarde == 'auteur') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND ACHTERNAAM LIKE "%$zoekterm%" ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';}
        elseif ($voorwaarde == 'uitgever') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND UITNR IN (SELECT UITNR FROM UITGEVERS WHERE UITNAAM LIKE "%$zoekterm%"';}
        elseif ($voorwaarde == 'isbn') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND ISBN LIKE "%$zoekterm%" ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';}    
        elseif ($voorwaarde == 'serie') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND SERIE LIKE "%$zoekterm%" ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';}    
        elseif ($voorwaarde == 'onderwerp') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND OWNR IN (SELECT OWNR FROM ONDERWERPEN WHERE ACHTERNAAM LIKE "%$zoekterm%"';}
        elseif ($voorwaarde == 'coauteurs') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND COAUTEURSNR IN (SELECT AUTEURNR FROM AUTEURS WHERE ACHTERNAAM LIKE "%$zoekterm%") OR COAUTEURSNR2 IN (SELECT AUTEURNR FROM AUTEURS WHERE ACHTERNAAM LIKE "%$zoekterm%") OR COAUTEURSNR3 IN (SELECT AUTEURNR FROM AUTEURS WHERE ACHTERNAAM LIKE "%$zoekterm%") OR COAUTEURSNR4 IN (SELECT AUTEURNR FROM AUTEURS WHERE ACHTERNAAM LIKE "%$zoekterm%") ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC"';}
        elseif ($voorwaarde == 'provnaam') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND PROVNR IN (SELECT PROVNR FROM PROVENANCE WHERE ACHTERNAAMP LIKE "%$zoekterm%") OR PROVNR2 IN (SELECT PROVNR FROM PROVENANCE WHERE ACHTERNAAMP LIKE "%$zoekterm%") OR PROVNR3 IN (SELECT PROVNR FROM PROVENANCE WHERE ACHTERNAAMP LIKE "%$zoekterm%") ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';}
        elseif ($voorwaarde == 'drukker') {
              $query .= 'WHERE A.AUTEURNR = B.AUTEURNR AND B.BOEKNR = E.BOEKNR AND B.BOEKNR = I.BOEKNR AND DRUKKERNR IN (SELECT DRUKKERNR FROM DRUKKERS WHERE ACHTERNAAM LIKE "%$zoekterm%") OR DRUKKERNR2 IN (SELECT DRUKKERNR FROM DRUKKERS WHERE ACHTERNAAM LIKE "%$zoekterm%") OR DRUKKERNR3 IN (SELECT DRUKKERNR FROM DRUKKERS WHERE ACHTERNAAM LIKE "%$zoekterm%") ORDER BY UITGAVE DESC, ACHTERNAAM ASC, TITEL ASC';
}

                echo ("</br></br>");
                echo ("<font face='verdana' size='2'><b>Resultaten voor:</b> $voorwaarde = $zoekterm");
                echo ("</br></br>");
                echo ("<table width='100%'>");
                echo ("<tr height='40'><td width='25%' class='tabel'><b>auteur</b></td><td width='60%' class='tabel'><b>titel</b></td><td width='7%' class='tabel'><b>jaar</b></td><td width='8%' class='tabel'><b>exemplaren</b></td></tr>");
        while($row = mysql_fetch_row($result))
        {

            echo ("<tr height='20'><td class='tabel'> $achternaam$komma $voornaam $tussenvoegsels </td><td class='tabel'> <a href='$boeknr.htm'>$titel $dubbelpunt $subtitel</a> </td><td class='tabel'> $uitgave </td><td class='tabel'> $aantal_exemplaren </td></tr>");
        }

                echo ("</tabel>");
?>
Gewijzigd op 11/06/2011 23:52:13 door
 
Jasper DS

Jasper DS

12/06/2011 10:28:41
Quote Anchor link
waar is je foutafhandeling?! Er loopt waarschijnlijk iets mis met je query.
De structuur van je code zou zo moeten zijn:
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
<?php
    $sql
=    "SELECT veld1, veld2
             FROM tabel
            "
;

    # Check je query        
    if(($result = mysql_query($sql)) === false)
    {

        # de query is fout, weergeef in test-fase eventueel mysql_error()
        echo' Fout met database!';
    }

    elseif(mysql_num_rows($result) < 1)
    {

        echo 'Er zijn geen gegevens gevonden';
    }

    else
    {
        # De query is gelukt -> fetchen
        while($row = mysql_fetch_assoc($result))
        {

            echo $row['veld1'].'<br/>';    
            echo $row['veld2'].'<br/>';    
        }
    }

?>


En dat is nu niet het geval.
 

12/06/2011 12:31:40
Quote Anchor link
Dat heb ik in eerste instantie gedaan. Maar toen gaf hij zodanig grote foutmeldingen, dat ik dat stukje heb weggehaald, en toen deed hij het beter. Ik heb jou structuur verder ook helemaal overgenomen. Maar verder kan ik "mysql_fetch_assoc" niet gebruiken om dezelfde foutmelding als mijn post hierboven.
De queries heb ik overigens stuk voor stuk getest, en die werken allemaal goed.
Gewijzigd op 12/06/2011 12:42:50 door
 
Jasper DS

Jasper DS

12/06/2011 12:42:38
Quote Anchor link
dat komt omdat je query waarschijnlijk fout is -> daarom, bouw een foutafhandeling in zoals ik getoond heb hierboven!
 

12/06/2011 12:46:46
Quote Anchor link
Maar ik zei net: ik kreeg foutmeldingen omtrent die foutafhandeling.
 

Pagina: 1 2 3 volgende »



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.