Controle op record
In mijn tabel AUTO-EIG is auto_id, kleur_id de primaire key.
Ik wil controleren of dit record bestaat.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$sql = "SELECT * FROM AUTO-EIG WHERE auto_id = '$auto_id' and kleur_id = '$kleur_id' ";
$result = mysql_query ($sql);
if ($result)
{ echo "Kleur bestaat !";
}
else
{ echo "Onbekende kleur.";
}
$result = mysql_query ($sql);
if ($result)
{ echo "Kleur bestaat !";
}
else
{ echo "Onbekende kleur.";
}
Is bovenstaande al juist of niet ??
Of moet ik het volgende doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql = "SELECT * FROM AUTO-EIG WHERE auto_id = '$auto_id' and kleur_id = '$kleur_id' ";
$result = mysql_query ($sql);
if ($result)
{ $data = mysql_fetch_assoc($result);
if ($data ['auto_id'] == $auto_id) && $data ['kleur_id'] == $kleur_id)
{ echo "Kleur bestaat !";
}
else
{ echo "Onbekende kleur.";
}
}
else
{ echo "Onbekende kleur.";
}
$result = mysql_query ($sql);
if ($result)
{ $data = mysql_fetch_assoc($result);
if ($data ['auto_id'] == $auto_id) && $data ['kleur_id'] == $kleur_id)
{ echo "Kleur bestaat !";
}
else
{ echo "Onbekende kleur.";
}
}
else
{ echo "Onbekende kleur.";
}
Gewijzigd op 14/09/2013 21:23:52 door Paco de Wulp
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$sql = "SELECT * FROM AUTO-EIG WHERE auto_id = '$auto_id' and kleur_id = '$kleur_id' ";
$result = mysql_query ($sql);
if ($result)
{
$data = mysql_fetch_assoc($result);
if (mysql_num_rows($data) > 0)
{
echo "Kleur bestaat !";
}
else
{
echo "Onbekende kleur.";
}
}
else
{
echo "Er is iets fout gegaan: " . mysql_error();
}
?>
$sql = "SELECT * FROM AUTO-EIG WHERE auto_id = '$auto_id' and kleur_id = '$kleur_id' ";
$result = mysql_query ($sql);
if ($result)
{
$data = mysql_fetch_assoc($result);
if (mysql_num_rows($data) > 0)
{
echo "Kleur bestaat !";
}
else
{
echo "Onbekende kleur.";
}
}
else
{
echo "Er is iets fout gegaan: " . mysql_error();
}
?>
Toevoeging op 14/09/2013 21:12:39:
Onthoud goed dat mysql_query altijd een result terug geeft, zelfs als er nul records gevonden zijn.
Je krijgt ALLEEN een 'false' terug als er een fout optreedt. de meeste fouten komen door een query die niet klopt of omdat er geen connectie is met de database.
Gewijzigd op 14/09/2013 21:09:26 door Frank Nietbelangrijk
Ik ga als de sodemieter al mijn controles nakijken..
Hartelijk dank Frank !
Dat is zeker in dit soort situaties absolute onzin.
En dan nog veel belangrijker, dit zal ten alle tijden een SQL fout melding opleveren:
- is een operator, dus die kan je niet in tabelnamen gebruiken.
Je hebt twee mogelijkheden.
a)
Je zet een unique index op auto_id, kleur_id in auto_eig (of je maakt van beide een PK).
Je doet dan een insert op die tabel en als de combinatie bestaat krijg je een duplicate entry error in mysql
b)
Je voert eerst een query uit die controleert of de combinatie al bestaat:
Tot slot:
Gebruik kleine letters voor je tabel- en kolomnamen en hoofdletters voor sql, dit geeft je veel meer overzicht waar je mee bezig bent.
Gewijzigd op 14/09/2013 21:48:30 door Ger van Steenderen
Jouw antwoord bij a) is prima maar niet direct een antwoord op de vraag. een PK kan ook dan namelijk altijd nog één keer of géén keer voorkomen.
En bij b): dit is ook afhankelijk van de situatie. Indien je verder niets doet met de resultaten van een "SELECT * FROM ..." dan verdient jouw COUNT(*) de voorkeur omdat dat dan geen onnodige data oplevert. Als je echter het gevonden record WEL nodig hebt dan is mijn voorbeeld gewoon handiger omdat je dan met één query klaar bent.
En dan nog ga je geen 'SELECT *' gebruiken, maar selecteer je de kolommen die je nodig hebt.
Ik kan me voorstellen dat het onnodige geheugen in beslag neemt, maar we hebben toch allemaal geheugen zat tegenwoordig. Heeft het soms nog meer nadelen ?
Of is het een principe: Geen overbodige velden gebruiken die je niet nodig hebt..
Gewijzigd op 14/09/2013 23:59:04 door Paco de Wulp
Waarom zou je meer selecteren dan nodig is?
Is het niet handiger/makkelijker om te zien wat je selecteert?
Mij is verteld dat bij joins het gebruik van * tot problemen kan leiden (met name als velden dezelfde naam hebben (bv. id))
Waar komen de variabelen $auto_id en $kleur_id vandaan? Uit een formulier? Waarom gebruik je dan niet de $_POST (of $_GET) waarden?
Stap af van mysql -> This extension is deprecated as of PHP 5.5.0, and will be removed in the future. Instead, the MySQLi or PDO_MySQL extension should be used.
2) teveel geheugen gebruik inderdaad en het argument van 'dat is genoeg aanwezig' is onzin. Een server kost geld, geheugen op een server kost geld. Als jij een website hebt met 1 bezoeker per dag maakt het niets uit, maar als je site veel bezoekers genereert dan gaan dit soort fratsen je al snel geld kosten. Je server kan namelijk meerdere connecties tegelijk aan, maar dan wel als dat nog past binnen de resources. Past het niet meer dan krijg je problemen en zal je je server moeten uitbreiden. Beetje onnodig om geld uit te geven aan domme fouten als 'SELECT *', vind je niet?
3) als je 'SELECT *' doet kost het meer tijd voor je database server om de query op te stellen. Die moet dan namelijk eerst gaan uitzoeken welke velden je daar dan allemaal mee bedoelt. Zie dus ook weer punt 2.
4) als je je tabellen gaat aanpassen, nieuwe velden erbij, velden eraf, andere namen dan lijkt het alsof 'SELECT *' lekker handig is, je hoeft namelijk je query niet aan te passen. In werkelijkheid is het dan echter een bron van fouten. Je query loopt namelijk nog gewoon, maar de rest van je applicatie gaat mogelijk de mist in omdat je veldnamen ergens niet meer kloppen. Lekker dan om uit te gaan zoeken waar het allemaal fout gaat. Heb je de juiste velden geselecteerd krijg je een MySQL foutmelding bij die queries waar het mis gaat en weet je tenminste waar je moet beginnen (en waar je niet naar hoeft te kijken).
En dan, als jij op vakantie gaat, neem je dan ook de hele inhoud van je kledingkast mee?
Gewijzigd op 15/09/2013 10:11:39 door Erwin H
Frank Nietbelangrijk op 14/09/2013 22:35:24:
Jouw antwoord bij a) is prima maar niet direct een antwoord op de vraag. een PK kan ook dan namelijk altijd nog één keer of géén keer voorkomen.
Ik nam (en neem) aan dat TS die controle uit wil voeren om te voorkomen dat records dubbel in een tabel komen. Aangezien jij niet de TS bent kan jij ook niet weten of die aanname juist is.
Frank Nietbelangrijk op 14/09/2013 22:35:24:
En bij b): dit is ook afhankelijk van de situatie. Indien je verder niets doet met de resultaten van een "SELECT * FROM ..." dan verdient jouw COUNT(*) de voorkeur omdat dat dan geen onnodige data oplevert. Als je echter het gevonden record WEL nodig hebt dan is mijn voorbeeld gewoon handiger omdat je dan met één query klaar bent.
Als je controleert of een record met bepaalde gegevens voorkomt, lijkt het mij dat je die gegevens al hebt.
Beetje dit idee: "Welke kleur heeft die rode auto?"
Euh.... 'rood'?
Je kan dan beter vragen: is die auto rood? Ja == 1 == true óf 0 == false == nee.
Gewijzigd op 15/09/2013 14:34:18 door Eddy E
Toevoeging op 15/09/2013 12:41:34:
Ger van Steenderen op 15/09/2013 10:39:30:
Als je controleert of een record met bepaalde gegevens voorkomt, lijkt het mij dat je die gegevens al hebt.
Of alleen een deel van de gegevens.
en dan nog: een user wil zoeken naar een rode auto op de website.
query:
(het sterretje moet weg dat weten we nu zo onderhand wel)
goed ik weet nu enkel dat de gebruiker rood wil zien maar ik weet dus nog niet of en hoe vaak of dat deze kleur niet voorkomt in de database. Zo las ik dus ook TS zijn eerste post.
Gewijzigd op 15/09/2013 12:46:50 door Frank Nietbelangrijk
Paco:
In mijn tabel AUTO-EIG is auto_id, kleur_id de primaire key.
Ik wil controleren of dit record bestaat.
Ik wil controleren of dit record bestaat.