Controle op record

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior DevOps-ontwikkelaar eIDAS

Functie­omschrijving Burgers en bedrijven veilig en betrouwbaar digitaal toegang geven tot diensten en producten van het ministerie van Economische Zaken en Klimaat. Als senior DevOps-ontwikkelaar bouw je daar letterlijk aan mee. En dat doe je bij DICTU: een van de grootste en meest vooruitstrevende ICT-dienstverleners van de Rijksoverheid. Jij werkt mee aan de doorontwikkeling van eIDAS, dat staat voor Electronic IDentification Authentication and trust Services. Deze koppeling maakt de grensoverschrijdende authenticatie op overheidswebsites binnen de Europese Unie mogelijk. Het ministerie van Economische Zaken en Klimaat heeft één moderne toegangspoort voor zijn diensten en inspecties. Enkele daarvan zijn dankzij eIDAS inmiddels

Bekijk vacature »

Paco de Wulp

Paco de Wulp

14/09/2013 20:53:20
Quote Anchor link
Een hele stomme vraag (daar ben ik goed in), maar ik moet het nu toch even zeker weten.......

In mijn tabel AUTO-EIG is auto_id, kleur_id de primaire key.
Ik wil controleren of dit record bestaat.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.";
}


Is bovenstaande al juist of niet ??
Of moet ik het volgende doen:

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
$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.";
}
    
Gewijzigd op 14/09/2013 21:23:52 door Paco de Wulp
 
PHP hulp

PHP hulp

25/10/2020 08:53:35
 
Frank Nietbelangrijk

Frank Nietbelangrijk

14/09/2013 21:09:01
Quote Anchor link
ik zou het zo doen Paco:
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
<?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();
}

?>


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
 
Paco de Wulp

Paco de Wulp

14/09/2013 21:21:34
Quote Anchor link
24/7 altijd snel een antwoord. Geweldig.

Ik ga als de sodemieter al mijn controles nakijken..

Hartelijk dank Frank !
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/09/2013 21:28:58
Quote Anchor link
Gebruik nooit geen select *.
Dat is zeker in dit soort situaties absolute onzin.

En dan nog veel belangrijker, dit zal ten alle tijden een SQL fout melding opleveren:
Code (SQL)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM AUTO-EIG

- 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:
Code (SQL)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT COUNT(*) FROM auto_eig WHERE auto_id = 1234 AND kleur_id = 4321


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
 
Frank Nietbelangrijk

Frank Nietbelangrijk

14/09/2013 22:35:24
Quote Anchor link
scherp gezien weer Ger over dat minteken. Dat kan beter met een underscore.

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.
 
Erwin H

Erwin H

14/09/2013 23:23:26
Quote Anchor link
En dan nog ga je geen 'SELECT *' gebruiken, maar selecteer je de kolommen die je nodig hebt.
 
Paco de Wulp

Paco de Wulp

14/09/2013 23:57:04
Quote Anchor link
Wat maakt het eigenlijk uit of je nu SELECT * doet of alleen bepaalde kolommen selecteert.

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
 
Obelix Idefix

Obelix Idefix

15/09/2013 09:56:04
Quote Anchor link
Het gaat niet om jouw geheugen ;-)
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.
 
Erwin H

Erwin H

15/09/2013 10:10:27
Quote Anchor link
1) als je joins bouwt met tabellen waarin kolommen met dezelfde naam voorkomen (veel voorkomend is een 'id' kolom of 'naam') dan raak je data kwijt op het moment dat de resultaten overgezet worden naar een php array.
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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

15/09/2013 10:39:30
Quote Anchor link
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.
 
Eddy E

Eddy E

15/09/2013 11:56:37
Quote Anchor link
Dus hoef je die nog nogmaals op te vragen.

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
 
Frank Nietbelangrijk

Frank Nietbelangrijk

15/09/2013 12:32:25
Quote Anchor link
Als je één keer op verzenden drukt is het genoeg he Eddy :P

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM cars WHERE color='rood'

(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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

15/09/2013 14:15:32
Quote Anchor link
Misschien moet je dan wat nauwkeuriger lezen:
Paco:
In mijn tabel AUTO-EIG is auto_id, kleur_id de primaire key.
Ik wil controleren of dit record bestaat.
 



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.