php formulier

Status
Niet open voor verdere reacties.

shootme

Nieuwe gebruiker
Lid geworden
12 apr 2011
Berichten
1
Hallo,

Ik zou graag een formulier in php willen maken met een zoekveld.

Idee is dat ik een factuur kan maken uit een bestaande database waaruit ik o.a. adresgegevens automatisch invul in een formulier nadat ik het klantnummer heb ingevoerd.

Dus: Ik voer klantnummer in en adres en telefoonnummer worden in verschillende velden ingevuld.

Ik heb geen idee hoe deze functie heet en met google ben ik er niet uitgekomen.

Alvast heel erg bedankt!
 
Dit is niet echt een functie, maar een script. Je moet ten eerste een goed html formulier hebben, zoals deze:

Code:
<form method="POST" action="">
<input type="text" name="klantnummer" />
<input type="submit" name="submit" value="submit" />
</form>

Verder heb je een script nodig wat het gaat verwerken, maar daarvoor moet je verbinding maken met je MySQL database:

PHP:
<?php

mysql_connect('localhost', 'user', 'password'); // Verbind met MySQL
mysql_select_db('database'); // Selecteer standaard database

if(isset($_POST['submit']) && isset($_POST['klantnummer'])) { // Controleer of het formulier is verstuurd

	$klantnummer = (int) $_POST['klantnummer']; // Controleer en defineer $klantnummer
	
	$sql = mysql_query('SELECT * FROM tabel WHERE klantnummer="'.$klantnummer.'"'); // Haal gegevens van klant op
	if(mysql_num_rows($sql) == 1) { // Controleer of er 1 hit is
	
		$row = mysql_fetch_assoc($sql); // Verwerk query tot resultaat
		
		echo 'Adres: ' . $row['adres'] . '<br />Naam: ' . $row['naam']; // Echo gegevens
		
	} else { // Er zijn 0 of meer dan 1 hits, klopt dus niet!
	
		echo 'Deze gebruiker bestaat niet!'; // Geef foutmelding terug
		
	}
	
}

?>

Nou, dit script is behoorlijk basis, dus waarschijnlijk moet je er zelf ook nog wat aan sleutelen. Als je nog vragen hebt, dan kun je effe reactie posten :)
 
Even wat aanmerkingen (los van ontbrekende foutafhandeling bij het verbinden met de database):

PHP:
if(isset($_POST['submit']) && isset($_POST['klantnummer'])) {

Dat is niet zo handig. Controleren of een formulier gesubmit is, moet _altijd_ op de volgende manier:

PHP:
if($_SERVER['REQUEST_METHOD'] == 'POST'){

PHP:
 $klantnummer = (int) $_POST['klantnummer']; // Controleer en defineer $klantnummer

Je controleert het niets en bovendien is het overpompen van $_POST-variabelen in andere variabelen een nutteloze aangelegenheid. Gebruik verderop in je script gewoon $_POST['klantnummer'], dat bevordert ook de veiligheid.

PHP:
  $sql = mysql_query('SELECT * FROM tabel WHERE klantnummer="'.$klantnummer.'"'); // Haal gegevens van klant op
- SELECT * is altijd onwenselijk (maar hier weet je de databasestructuur niet, uiteraard).
- De variabele '$sql' klopt niet, als het om naamgeving gaat. Wat je terugkrijgt van mysql_query() is een resource, geen 'sql'. Kan verwarrend zijn.
- Gebruik altijd mysql_real_escape_string() of Prepared Statements. Daarnaast ontbreekt ook hier foutafhandeling.
 
Even wat aanmerkingen (los van ontbrekende foutafhandeling bij het verbinden met de database):

PHP:
if(isset($_POST['submit']) && isset($_POST['klantnummer'])) {

Dat is niet zo handig. Controleren of een formulier gesubmit is, moet _altijd_ op de volgende manier:

PHP:
if($_SERVER['REQUEST_METHOD'] == 'POST'){

PHP:
 $klantnummer = (int) $_POST['klantnummer']; // Controleer en defineer $klantnummer

Je controleert het niets en bovendien is het overpompen van $_POST-variabelen in andere variabelen een nutteloze aangelegenheid. Gebruik verderop in je script gewoon $_POST['klantnummer'], dat bevordert ook de veiligheid.

PHP:
  $sql = mysql_query('SELECT * FROM tabel WHERE klantnummer="'.$klantnummer.'"'); // Haal gegevens van klant op
- SELECT * is altijd onwenselijk (maar hier weet je de databasestructuur niet, uiteraard).
- De variabele '$sql' klopt niet, als het om naamgeving gaat. Wat je terugkrijgt van mysql_query() is een resource, geen 'sql'. Kan verwarrend zijn.
- Gebruik altijd mysql_real_escape_string() of Prepared Statements. Daarnaast ontbreekt ook hier foutafhandeling.

Ik zal je commentaar eventjes per deel beantwoorden:

Over de controle van een formulier zijn altijd al meningsverschillen geweest, zie http://www.pfz.nl/wiki/isset-vs-request-method/
Jouw methode controleert of er IETS is meegestuurd door een formulier, mijn methode controleert of de waarden van het formulier zijn meegestuurd. Ik weet het, het kan netter met trim() en empty(), maar zoals ik al vermeld heb, is dit een pure basis, die ik in 2 minuten heb geschreven.

Ik pomp variabelen uit POST en GET altijd over naar andere variabelen, aangezien dit makkelijker typen is als de variabele veel wordt gebruikt. Daarnaast is het voor mij overzichtelijker en beter te controleren.

Select * is onwenselijk, inderdaad, maar het scheelt hooguit een paar milliseconden, en daarmee kun je een boel gezeik met debuggen vermijden. Voeg jij later iets toe aan je script, terwijl je niet de wildcard gebruikt, dan moet je de query weer bijwerken, en ik denk dat je dat wel gaat vergeten (tenminste, ik wel). Daarnaast, ik werk meestal met tabellen waarbij alle data wordt gebruikt, dus ik ben niets anders gewent. :)

De naamgeving van $sql is jouw mening. Ik ben van mening dat $sql een prima naam is, en op deze manier prima wordt gebruikt.

mysql_real_escape_string is in dit voorbeeld NIET nodig, aangezien bij dat wat jij overpompen noemt, de variabele wordt veranderd in een integer. Foutafhandeling ontbreekt gedeeltelijk, en dat klopt, aangezien het een script is wat in 2 minuten is geschreven, en ik verder geen ingewikkelde scripts wil posten hier :)

Voor de duidelijkheid: Iedereen heeft zijn manier van programmeren, en ik gebruik deze. :p
 
"Over de controle van een formulier zijn altijd al meningsverschillen geweest, zie http://www.pfz.nl/wiki/isset-vs-request-method/
Jouw methode controleert of er IETS is meegestuurd door een formulier, mijn methode controleert of de waarden van het formulier zijn meegestuurd. Ik weet het, het kan netter met trim() en empty(), maar zoals ik al vermeld heb, is dit een pure basis, die ik in 2 minuten heb geschreven."

Het ging om het controleren van de submit-button in dit geval, die is er níet altijd.


"Ik pomp variabelen uit POST en GET altijd over naar andere variabelen, aangezien dit makkelijker typen is als de variabele veel wordt gebruikt. Daarnaast is het voor mij overzichtelijker en beter te controleren."

Het is een veiligheidsrisico, maar dat zul je nog wel merken in grotere projecten of in projecten met meerdere mensen. Nu weet niemand meer waar die variabele vandaan kwam, of dat dus uit een formulier is of ergens anders uit. Dat is het gevaar.

"Select * is onwenselijk, inderdaad, maar het scheelt hooguit een paar milliseconden, en daarmee kun je een boel gezeik met debuggen vermijden. Voeg jij later iets toe aan je script, terwijl je niet de wildcard gebruikt, dan moet je de query weer bijwerken, en ik denk dat je dat wel gaat vergeten (tenminste, ik wel). Daarnaast, ik werk meestal met tabellen waarbij alle data wordt gebruikt, dus ik ben niets anders gewent. :)"

Het probleem zit 'm juist in het debuggen. Als je de kolommen benoemt, zie je altijd precies wat je ophaalt en wat niet. Daarnaast wordt SELECT * onoverzichtelijk als je uit meerdere tabellen gaat selecten.

"De naamgeving van $sql is jouw mening. Ik ben van mening dat $sql een prima naam is, en op deze manier prima wordt gebruikt."

Leden van een projectgroep later ook?

"mysql_real_escape_string is in dit voorbeeld NIET nodig, aangezien bij dat wat jij overpompen noemt, de variabele wordt veranderd in een integer. Foutafhandeling ontbreekt gedeeltelijk, en dat klopt, aangezien het een script is wat in 2 minuten is geschreven, en ik verder geen ingewikkelde scripts wil posten hier :)"

MysqL_real_escape_string() is ALTIJD nodig. Als je het één keer vergeet, ga je het vaker vergeten, of je een variabele nou naar een int cast of niet.
 
1. De submit button is er in dit geval dus wel
2. Ik werk niet met meerdere mensen, en ga dat ook niet doen
3. Ik heb geen behoefte aan het telkens toevoegen van velden aan een query, ik werk altijd met kladblok, met op de achtergrond de tabelstructuur
4. mysql_real_escape_string is niet nodig in dit geval.

Om punt 4 nog even te bewijzen, heb ik een sql injectie voor je gesimuleerd, en heb ik mijn manier van het controleren van een integer gebruikt, en mysql_real_escape_string():
PHP:
<?php

$string = '1\' OR 1 = 1';
$nofunc = (int) $string;
$func   = mysql_real_escape_string($string);

echo $nofunc;
echo '<br />';
echo $func;

?>

Uitkomst:
Code:
1
1\' OR 1 = 1

Maakt niet veel uit eh?
 
1. De submit button is er in dit geval dus wel

Nope. Probeer maar eens in Firefox iets in een text veld te typen en dan op enter te drukken. Dan wordt er (in ieder geval in sommige versies; misschien dat ze het veranderd hebben in 4) géén submit button meegestuurd en faalt je script.
 
Nope. Probeer maar eens in Firefox iets in een text veld te typen en dan op enter te drukken. Dan wordt er (in ieder geval in sommige versies; misschien dat ze het veranderd hebben in 4) géén submit button meegestuurd en faalt je script.

Oohw, das trouwens wel leuk om te weten.
 
Leuk projectje om met JQuery te doen. Klantnummer invullen en dan geen submit button hoeven gebruiken, maar alles wordt al opgehaald!

Gr. Ronald!:)
 
1. De submit button is er in dit geval dus wel
2. Ik werk niet met meerdere mensen, en ga dat ook niet doen
3. Ik heb geen behoefte aan het telkens toevoegen van velden aan een query, ik werk altijd met kladblok, met op de achtergrond de tabelstructuur
4. mysql_real_escape_string is niet nodig in dit geval.

1 -> Zie Frats.
2 -> Famous last words.
3 -> Zie 2.
4 -> Het gaat om het consequent zijn, niet om specifieke gevallen.
 
1 -> Zie Frats.
2 -> Famous last words.
3 -> Zie 2.
4 -> Het gaat om het consequent zijn, niet om specifieke gevallen.

Jij leest niet echt goed hè? Ik programmeer op mijn manier, en dat verander je niet.
1. Het kan zijn dat bepaalde browsers dit niet meesturen, en dit wist ik ook niet.
2. Geen famous last words, ik programmeer alleen voor educatieve doeleinden.
3. Zie 2.
4. Niks consequent, ik zie elk script en elke variabele als uniek, en gebruik geen overbodige functies. Jij noemt overpompen overbodig, ik noem het gebruik van de functie op deze plaats overbodig.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan