gegevens uit mysql database halen

Status
Niet open voor verdere reacties.

kareltje1

Gebruiker
Lid geworden
19 aug 2009
Berichten
26
Hoi allemaal,

Ik heb het volgende idee maar weet niet goed hoe ik dit moet uitvoeren daar nog een amateur ben op dit gebied..... :(

Ik wil een website maken waarop de gebruiker verschillende hoofdgroepen te zien krijgt en bij iedere hoofdgroep een keuze kunnen selecteren.
Vb: Hoofdgroepen: merk, kleur, bouwjaar
Vb: Onder hoofdgroep Merk: opel, audi, bmw
Vb: Onder hoofdgroep Kleur: rood, groen, blauw
Vb: Onder hoofdgroep Bouwjaar: 1990, 1991, 1992

Als de gebruiker dan zijn selctie gemaakt heeft bijvoorbeeld
Opel - groen - 1992
Dan moet hij op een balk "zoeken" drukken waarna een lijst verschijnt met een foto en beschrijving van alle groene Opels uit 1992.

Klinkt heel simpel maar is volgens mij erg ingewikkelt om voor elkaar te krijgen. Ik heb het volgende op mn computer geinstalleerd: Apache, Mysql, PHP, phpmyadmin.

Met phpmyadmin heb ik een database aangemaakt: CATALOG met daarin de tabel catalog_tabel met daarin de hoofdgroepen "ID", "MERK", "KLEUR" en "BOUWJAAR"

Een 2e tabel heeft de naam FOTO met daarin de groepen "ID" en "FOTO"

Een 3e tabel heeft de naam BESCHRIJVING met daarin de groepen "ID" en "BESCHRIJVING"

Dus als de gebruiker op `ZOEKEN` klikt moet er dus op de een of andere manier in de database CATALOG gezocht worden op de selectie van de gebruiker en hij/zij moet dan de foto’s en beschrijvingen van de bij zijn/haar selectie passende auto’s.

Kan iemand mij misschien uitleggen hoe ik dit voor elkaar kan krijgen? Bijvoorbaat heeeeeeel erg veel dank.
 
Twee vraagjes:

Waarom de losse tabellen? Ik denk dat het, als ik je verhaal lees, niet echt nodig is om alles in losse tabellen te zetten (foto en beschrijving kunnen in de catalog tabel) tenzij er bijvoorbeeld meerdere foto's bij één auto kunnen staan.

Wat betreft de zoekopdracht: is de gebruiker verplicht om de drie zoektermen op te geven of mag de gebruiker ook zoeken op één of twee zoektermen (bijvoorbeeld om alleen rode auto's te bekijken of alleen auto's van merk X uit jaar Y).
 
Laatst bewerkt:
Ik heb jouw voorlaatste zin nogmaals doorgelezen, dus mijn eerste vraag is daarmee beantwoord: je wilt meerdere beschrijvingen en foto's per auto :)

Ok, uitgaande van de structuur die jij hebt aangegeven, ofwel
Code:
CREATE TABLE `catalog_tabel` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `MERK` varchar(20) NOT NULL,
  `KLEUR` varchar(20) NOT NULL,
  `BOUWJAAR` int(4) NOT NULL,
  PRIMARY KEY (`ID`)
);
CREATE TABLE `beschrijving` (
  `ID` int(11) NOT NULL,
  `BESCHRIJVING` text NOT NULL
);
CREATE TABLE `foto` (
  `ID` int(11) NOT NULL,
  `FOTO` text NOT NULL
);
kun je iets maken als
PHP:
<?php
	$merken = array("audi","bmw","opel");
	$kleuren = array("blauw","groen","rood",);
    mysql_connect("localhost" , "root" , ""); 
    mysql_select_db("CATALOG");
    if($_SERVER['REQUEST_METHOD'] == 'POST' ) {
		$where = array();
		if (isset($_POST["merk"]) && in_array($_POST["merk"],$merken)) {
			$where[] = "MERK='".$_POST["merk"]."'";
		}
		if (isset($_POST["kleur"]) && in_array($_POST["kleur"],$kleuren)) {
			$where[] = "KLEUR='".$_POST["kleur"]."'";
		}
		if (isset($_POST["bouwjaar"]) && preg_match("/^(19|20)\d\d$/i", $_POST["bouwjaar"])) {
			$where[] = "BOUWJAAR='".$_POST["bouwjaar"]."'";
		}
		if (count($where)==0) {
			echo "Geen zoektermen bekend. Opdracht geannuleerd.";
		} else {
			$query = "select ID, MERK, KLEUR, BOUWJAAR from catalog_tabel WHERE ".implode(" AND ",$where);
			if ($result = mysql_query($query)) {
				if (mysql_num_rows($result)<>0) {
					while ( $row = mysql_fetch_assoc ( $result ) ) {
						echo $row["MERK"]." - ".$row["KLEUR"]." - ".$row["BOUWJAAR"]."<br />";
						$beschrijvingquery = "select BESCHRIJVING from beschrijving where ID=".$row["ID"];
						if ($beschrijvingresult = mysql_query($beschrijvingquery)) {
							if (mysql_num_rows($beschrijvingresult)<>0) {
								while ( $beschrijvingrow = mysql_fetch_assoc ( $beschrijvingresult ) ) {
									echo $beschrijvingrow["BESCHRIJVING"]."<br />";
								}
							} else {
								echo "geen beschrijving<br />";
							}
						}
						$fotoquery = "select FOTO from foto where ID=".$row["ID"];
						if ($fotoresult = mysql_query($fotoquery)) {
							if (mysql_num_rows($fotoresult)<>0) {
								while ( $fotorow = mysql_fetch_assoc ( $fotoresult ) ) {
									echo "<img src='".$fotorow["FOTO"]."' alt='".$row["MERK"]." - ".$row["KLEUR"]." - ".$row["BOUWJAAR"]."' /><br />";
								}
							} else {
								echo "<img src='geenfoto.jpg' alt='geen foto' /><br />";
							}
						}
					}
				} else {
					echo "Geen auto's gevonden die voldoen aan uw zoekopdracht.";
				}
			}
		}
    }

?>
<hr />
<form method="post" action="index.php">
	<select name="merk">
		<option selected="selected">Merk</option>
		<option><?php echo implode("</option><option>",$merken); ?></option>
	</select>
	<select name="kleur">
		<option selected="selected">Kleur</option>
		<option><?php echo implode("</option><option>",$kleuren); ?></option>
	</select>
	<select name="bouwjaar">
		<option selected="selected">Bouwjaar</option>
		<option>1990</option>
		<option>1991</option>
		<option>1992</option>
	</select>
	<input type="submit" value="zoeken" />
</form>
Ik ga er vanuit dat je alle data ook op een handige manier wilt beheren en daarom raad ik je aan om een besluit te nemen over het ID in elke tabel. Om data uit meerdere tabellen bij elkaar te zoeken heb je een stukje data nodig die in beide tabellen gelijk is. In mijn voorbeeld heb ik daarvoor het id veld misbruikt. Er is nu geen goede manier om de beschrijvingen en foto tabellen te beheren.

Ik zou zelf in elk van die twee tabellen een extra kolom maken met de naam catalog_id zodat je daarnaar kunt verwijzen. Van de bestaande ID kolommen kun je dan auto_increment velden maken zodat je die IDs kunt gebruiken voor het beheer van de tabellen (toevoegen, wijzigen en verwijderen van records).

Verder is het misschien handig om kleuren en merken ook in de database te zetten zodat je ze makkelijker kunt beheren en sorteren.
 
Heel erg bedankt voor je antwoord!!!! :)

De bezoeker moet idd kunnen zoeken zoals hij wilt, dus op 1 zoekterm of alle 3. Dus hij kan bijvoorbeeld alleen de kleur rood aanklikken en dan op de zoekbalk, waarop er in de database wordt gezocht op de kleur rood en alle rode auto´s ongeacht merk of bouwjaar, worden getoond. Maar de zoeker kan ook heel specifiek zoeken op bv rood, audi, 1980 waarop dus alleen de rode audi´s uit 1980 worden getoond. Er moeten idd meerdere foto´s van dezelfde auto kunnen worden getoond.

Ik begrijp niet helemaal wat je bedoeld met het toevoegen van een kolom catalog_id aan de foto en beschrijving tabel. Bedoel je het volgende:

Fototabel
ID Foto Catalog_ID

Beschrijvingtabel
ID Beschrijving Catalog_ID

Hoe kan ik de Catalog tabel dan koppelen met de andere 2? de kolom ID in de catalog tabel is de primary key. Moet ik dan de catalog_ID kolommen foreign_key maken?

Mijn excusses voor al mijn domme vragen hoor. Ik heb een hoop biginnerstutorials gelezen maar kom er ondanks dat niet zo uit. (Waarschijnlijk omdat datgene wat ik wil ver voorbij het beginnersniveau ligt, gezien jou php-code weet ik dat eigenlijk wel zeker)


Super bedankt zover hoor, met jou hulp gaat het me zeker lukken :)
 
Bedoel je het volgende:

Fototabel
ID Foto Catalog_ID

Beschrijvingtabel
ID Beschrijving Catalog_ID
Ja, dat is precies wat ik bedoel. Catalog_ID kan dan verwijzen naar de oorspronkelijke tabel (catalog_tabel) en de ID velden kun je dan wijzigen naar het type auto_increment en primary key.

De tabellen onderling koppelen heeft, in dit geval, geen zin dus dat hoef je niet te doen. Wat je wel moet doen is de queries op regels 25 en 35 wijzigen:
Code:
where ID
Code:
where Catalog_ID
Uiteindelijk hou je dan zoiets over:

autovb.gif


Als je later nog een admin/beheer pagina maakt, kun je met eenvoudige queries de foto's of beschrijvingen aanpassen of wissen
Code:
update beschrijving set BESCHRIJVING='nieuwe tekst' where ID=1
delete from foto where ID=1
en als je een auto helemaal wilt wissen kun je dat nog steeds doen aan de hand van het oorspronkelijke id
Code:
delete from catalog_tabel where ID=2
delete from beschrijving where Catalog_ID=2
delete from foto where Catalog_ID=2
. Kortom, het maakt het maken van een beheer pagina een stuk makkelijker.
 
Hoi allemaal,

Ik heb de bovenstaande code gebruikt maar krijg als ik op de zoekbalk klik geen resultaten in mn index.php pagina.

Doe ik dan iets fout of moet ik een ophaal code schrijven in de index.php pagina?
 
Ik heb de code lokaal getest en dat werkte. Je zegt dat er geen resultaten zijn - staat er wel data in de database die zou moeten matchen?

En heb je error_reporting aan staan? Zodat errors worden weergegeven? anders even
PHP:
error_reporting(-1);
toevoegen, bovenaan de php code.
 
Het is vaak wel handig als je error_reporting aanzet, dat je display_errors in ieder geval ook aan hebt staan :p

PHP:
<?php

  error_reporting ( E_ALL );
  ini_set ( 'display_errors', 1 );

?>
 
bedankt voor de hulp zo ver. Sorry voor mijn late reactie maar ben paar weken op vakantie geweest, was :thumb: en :love:

Als ik de volledige code zoals bovenstaand gebruik en op zoeken klik nadat ik de database heb ikgevuld, krijg ik nogsteeds een leeg scherm te zien.

Wat doe ik verkeerd?

Hieronder de code (iets minder keuze mogelijkheden dan in mijn database maar dit om het overzichtelijk te houden, zoals ik die gebruik:

PHP:
<?php
error_reporting ( E_ALL );
  ini_set ( 'display_errors', 1 );
    $merken = array("audi","bmw","opel");
    $kleuren = array("blauw","groen","rood",);
    mysql_connect("localhost" , "********" , "*******"); 
    mysql_select_db("CATALOG");
    if($_SERVER['REQUEST_METHOD'] == 'POST' ) {
        $where = array();
        if (isset($_POST["merk"]) && in_array($_POST["merk"],$merken)) {
            $where[] = "MERK='".$_POST["merk"]."'";
        }
        if (isset($_POST["kleur"]) && in_array($_POST["kleur"],$kleuren)) {
            $where[] = "KLEUR='".$_POST["kleur"]."'";
        }
        if (isset($_POST["bouwjaar"]) && preg_match("/^(19|20)\d\d$/i", $_POST["bouwjaar"])) {
            $where[] = "BOUWJAAR='".$_POST["bouwjaar"]."'";
        }
        if (count($where)==0) {
            echo "Geen zoektermen bekend. Opdracht geannuleerd.";
        } else {
            $query = "select ID, MERK, KLEUR, BOUWJAAR from catalog_tabel WHERE ".implode(" AND ",$where);
            if ($result = mysql_query($query)) {
                if (mysql_num_rows($result)<>0) {
                    while ( $row = mysql_fetch_assoc ( $result ) ) {
                        echo $row["MERK"]." - ".$row["KLEUR"]." - ".$row["BOUWJAAR"]."<br />";
                        $beschrijvingquery = "select BESCHRIJVING from beschrijving where ID=".$row["ID"];
                        if ($beschrijvingresult = mysql_query($beschrijvingquery)) {
                            if (mysql_num_rows($beschrijvingresult)<>0) {
                                while ( $beschrijvingrow = mysql_fetch_assoc ( $beschrijvingresult ) ) {
                                    echo $beschrijvingrow["BESCHRIJVING"]."<br />";
                                }
                            } else {
                                echo "geen beschrijving<br />";
                            }
                        }
                        $fotoquery = "select FOTO from foto where ID=".$row["ID"];
                        if ($fotoresult = mysql_query($fotoquery)) {
                            if (mysql_num_rows($fotoresult)<>0) {
                                while ( $fotorow = mysql_fetch_assoc ( $fotoresult ) ) {
                                    echo "<img src='".$fotorow["FOTO"]."' alt='".$row["MERK"]." - ".$row["KLEUR"]." - ".$row["BOUWJAAR"]."' /><br />";
                                }
                            } else {
                                echo "<img src='geenfoto.jpg' alt='geen foto' /><br />";
                            }
                        }
                    }
                } else {
                    echo "Geen auto's gevonden die voldoen aan uw zoekopdracht.";
                }
            }
        }
    }
 
?>
<hr />
<form method="post" action="results.php">
    <select name="merk">
        <option selected="selected">Merk</option>
        <option><?php echo implode("</option><option>",$merken); ?></option>
    </select>
    <select name="kleur">
        <option selected="selected">Kleur</option>
        <option><?php echo implode("</option><option>",$kleuren); ?></option>
    </select>
    <select name="bouwjaar">
        <option selected="selected">Bouwjaar</option>
        <option>1990</option>
        <option>1991</option>
        <option>1992</option>
    </select>
    <input type="submit" value="zoeken" />
</form>


- de database ziet er zoals flitsflitsflits beschreven heeft uit echter nu ingevuld.
- Ik krijg dus geen resultaten te zien op mijn results.php pagina.
- ook krijg ik als ik niks in vul, niet het bericht "Geen auto's gevonden die voldoen aan uw zoekopdracht."

Ik hoop dat jullie me kunnen helpen? Het lijkt wel alsof mijn php script als ik op zoeken druk in mijn database gaat zoeken.
Kan het er bijvoorbeeld aan liggen dat ik phpmyadmin beveiligd heb met een gebruikersnaam en wachtwoord voordat je in phpmyadmin kan?

Super bedankt voor het meedenken!!!!!
 
checklist:
  • Heeft het bestand de naam results.php? (vanwege het doel in "action")
  • Je zegt dat de database is gevult. Komen die waarden overeen met de voorbeelddata? ($merken, $kleuren)
Beveiliging van phpmyadmin heeft hier niets mee te maken.

Ik zie ook dat je de queries niet hebt aangepast aan de wijziging van het id op regels 27 en 37.
Code:
where ID=
moet worden
Code:
where Catalog_ID=
Om te laten zien dat de code verder wel werkt heb ik het online gezet, zie: http://helpmij.someserver.net/auto/results.php

Daarin heb ik, naast de Catalog_ID wijziging en een verbinding met mijn eigen database, niets veranderd. De broncode kun je bekijken via http://helpmij.someserver.net/auto/results.php?s=plop

(opel - rood - 1992 is de enige met een echte foto en een beschrijving, ik ben te lui om de rest te vullen ;))
 
Laatst bewerkt door een moderator:
Ik heb jouw code gecopieerd en in een eigen php file gezet. Daarbij gebruik ik mijn eigen script om contact met de database te maken. Tot zo ver geen problemen.

Toch als ik wat in de database zet en via de menu's op de php pagina een zoekopdracht samen stel, vb alleen opel, en op zoeken klik krijg ik een lege pagina te zien.
Ook als ik geen keuze maak en op zoeken klik krijg ik een lege pagina en niet het bericht "Geen auto's gevonden die voldoen aan uw zoekopdracht".

Heb je misschien nog meer ideeën waar het aan kan liggen. Het lijkt alsof de gegevens niet herkend worden in de database ofzo terwijl die wel overeen komen met wat ik in het php script heb staan. Geen hoofdletters en kleine letters verwisselt enzo.
Kan het aan een instelling in phpmyadmin liggen? Als ik gegevens in de database zet moet ik dan nog iets extra's doen in phpmyadmin (op exporteren ofzo klikken) om de gegevens voor het php script leesbaar te maken?

In phpmyadmin staat bij mij onderaan het volgende bericht: Extra opties om met tabellen te werken, die gelinkt zijn, zijn uitgeschakeld. Om te weten te komen waarom klik hier.
Als ik op klik hier druk krijg ik het volgende:

Server: localhost Database: catalog
$cfg['Servers'][$i]['pmadb'] ... Correct
$cfg['Servers'][$i]['relation'] ... Niet Goed [ Documentatie ]
Basis relatie opties: Uitgeschakeld

$cfg['Servers'][$i]['table_info'] ... Niet Goed [ Documentatie ]
Toon Opties: Uitgeschakeld

$cfg['Servers'][$i]['table_coords'] ... Niet Goed [ Documentatie ]
$cfg['Servers'][$i]['pdf_pages'] ... Niet Goed [ Documentatie ]
Aanmaken van PDF bestanden: Uitgeschakeld

$cfg['Servers'][$i]['column_info'] ... Niet Goed [ Documentatie ]
Toon kolom commentaar: Uitgeschakeld
Opgeslagen SQL-query: Uitgeschakeld
Browser transformaties: Uitgeschakeld

$cfg['Servers'][$i]['history'] ... Niet Goed [ Documentatie ]
SQL-geschiedenis: Uitgeschakeld

$cfg['Servers'][$i]['designer_coords'] ... Niet Goed [ Documentatie ]
Designer: Uitgeschakeld

Ligt hier misschien de oorzaak ergens voor het niet werken van mijn database?
Thanks voor alle hulp!!!!
 
Laatst bewerkt:
phpmyadmin zelf staat hier los van, ik ga er uiteraard wel vanuit dat de mysql gegevens die je gebruikt bij het verbinden juist zijn (zelfde gebruikersnaam/wachtwoord als je voor phpmyadmin gebruikt of een andere gebruiker met de juiste rechten).

Maar het werkt blijkbaar niet, dus zit er weinig anders op dan te gaan bughunten. Ik begin zelf meestal bij de queries - zet een "echo $query;" (of hoe de query ook heet) op de juiste plaatsen en test de queries uit in phpmyadmin.

Als de queries gewoon werken zul je echt stap voor stap te werk moeten gaan, bijvoorbeeld door bovenaan in elke if/while constructie een "echo n;" zetten waarbij je n vervangt door een nummer. Op die manier kun je zien welke code wel en niet wordt doorlopen.
 
Het is me gelukt alles zo te krijgen dat het werkt.

De action werkte niet dus ik heb die regel verwijderd uit het formulier. Het gevolg was dat de resultaten nu wel getoond werden maar op mn index pagina

Dit heb ik opgelost door de code op mn result pagina te zetten en het formulier op mn index pagina. De gedefineerde variabelen "copy past " ook op mn index pagina en YES!!!! het werkte. Nu kan ik een selectie maken op mn index pagina en worden de resultaten op mn result.php pagina getoond.

Eind goed al goed, met alle lof voor de mensen op dit forum zonder wie het mij niet gelukt was.

Thanks
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan