Error handeling
Ik heb een vraag met betrekking tot het omgaan met errors. De code hieronder zet ik altijd in mijn script om te zien welke errors ik krijg. Ik krijg bij mijn formulier vaker een undefined error, omdat de $naam nog niet door $_POST['naam'] gedefinieerd is geworden. Ondanks deze error werkt mijn script perfect. Zonder de error_reporting zou ik deze erorr niet te zien krijgen. Hoe belangrijk is het om deze error toch op te lossen?
Het is dus altijd belangrijk om alle errors en notice op te lossen. Hoe beter je script hoe sneller en hoe makkelijker te gebruiken.
Bij een formulier -zo als jij zegt- is het verstandig om te kijken of het verzonden is. Dat kan met
En als je wilt weten of een variabele al geset is kan je isSet gebruiken.
Daarnaast is het zomaar echoën van mysql_error() niet verstandig, maar ik denk dat je dit alleen maar zo hebt gedaan als voorbeeldje.
Lees ook eens dit voor goede error handling.
Ik heb de error opgelost, maar ik vroeg me gewoon af of het veel uitmaakte als het het de werking van het script niet beinvloedde. Ik heb in dit geval voor de isset functie gekozen om dit probleem op te lossen. Toch kan het best omslachtig zijn om dergelijke undefined errors weg te werken. Elke $naam moet gedefinieerd zijn en dat kan niet altijd in een script zo zijn. Ik heb mijn script toegevoegd om te laten zien wat ik bedoel. MIsschien ook handig script voor andere lezers. Deze namen script zet peter-paul of PeTeR-PAuL of o'conner om in Peter-Paul en O'Conner.
Wouter je zegt trouwens dat je en request method kunt gebruiken. Ik heb begrepen dat je site daarmee hack gevoeliger wordt. Is dat zo?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'true');
echo mysql_error();
$name = (isset($_POST['voornaam'])) ? ucwords(strtolower($_POST['voornaam'])) : "";
if(strpos($name, "'")) {
$pos = strpos($name, "'") + 1;
echo '1';
}
if (strpos($name, "-")) {
$pos = strpos($name, "-") + 1;
echo '2';
}
if (!preg_match('/[-\']/', $name)){
$pos = $name; //als ik dit niet definieer krijg ik een error
echo '3';
}
$name = substr_replace($name, strtoupper($name[$pos]), $pos, 1);
echo "Fixed name is: {$name}<br />\n";
?>
error_reporting(E_ALL);
ini_set('display_errors', 'true');
echo mysql_error();
$name = (isset($_POST['voornaam'])) ? ucwords(strtolower($_POST['voornaam'])) : "";
if(strpos($name, "'")) {
$pos = strpos($name, "'") + 1;
echo '1';
}
if (strpos($name, "-")) {
$pos = strpos($name, "-") + 1;
echo '2';
}
if (!preg_match('/[-\']/', $name)){
$pos = $name; //als ik dit niet definieer krijg ik een error
echo '3';
}
$name = substr_replace($name, strtoupper($name[$pos]), $pos, 1);
echo "Fixed name is: {$name}<br />\n";
?>
Edit: Ik heb altijd de error_repport aan staan om te zien wat er fout gaat. Mijn site is dan ook nog niet online. In dit voorbeeld zie je ook echo 1, 2, 3 staan en dit was voor mijn eigen om te zien welk pad de code nam.
MOcht deze code omslachtig zijn of beter kunnen dan hoor ik het graag!
Gewijzigd op 04/06/2011 10:46:22 door Sven b
Een variabele moet altijd uit de quotes. Dus niet
(dit had ik al een keer gezegd...)
De manier in je if statement is verkeerd. str_pos geeft namelijk de STRing_POSitie terug. Dit kan 0 zijn, wat wordt aangezien als false en dit terwijl het true is. Gebruik dus === true.
I.p.v. !preg_match('/[-\']/', $name) kan je ook preg_match('/[^-\']/', $name) gebruiken, of dit beter is weet ik niet.
Wat jij in dit script doet kan volgens mij veel sneller met ucwords.
bedankt voor je snelle reactie. Ik zal de aanpassingen maken. Het string_positie verhaal snap ik nog niet helemaal, maar ga ik nog mee stoeien.
Je geeft aan dat ucwords sneller gaat. Dat klopt wanneer ik gewoon een naam sven heb, maar als iemands naam o'conner of jean-paul is dan werkt ucwords niet meer, want met alleen ucwords krijg je dan.
O'conner en Jean-paul, terwijl het moet zijn... O'Conner en Jean-Paul. Dat is wat dit script doet of begreep je dit al en is er toch een snellere manier?
explode.
Vervolgens ga je met de array die je nu hebt elk woord met ucwords vergroten. Dan voeg je alles weer samen met een - of een '.
Ik heb het even getest en jou manier is sneller. Ik had gedacht dat het simpeler zou zijn met ucwords. Maar jou code heeft 0.000056982040405273 seconden nodig en die van mij 0.00010013580322266, het scheelt dus 5 tienduizendste seconde.
Ik zou het dan aanpakken dat je de string breek bij - of ', dit doe je bijv. met Vervolgens ga je met de array die je nu hebt elk woord met ucwords vergroten. Dan voeg je alles weer samen met een - of een '.
Ik heb het even getest en jou manier is sneller. Ik had gedacht dat het simpeler zou zijn met ucwords. Maar jou code heeft 0.000056982040405273 seconden nodig en die van mij 0.00010013580322266, het scheelt dus 5 tienduizendste seconde.
hoe je dat dan met explode zou doen zou ik dan niet weten. Ik snap dat je een - of een ' kan herkennen en die dan omzet of een spatie er tussen knalt, maar dan moet je ook de spaties er weer alle spaties verwijderen. Wat als het nu o'conner van der janssen is?
Ik heb trouwens nog nagedacht over je tip:
Quote:
De manier in je if statement is verkeerd. str_pos geeft namelijk de STRing_POSitie terug. Dit kan 0 zijn, wat wordt aangezien als false en dit terwijl het true is. Gebruik dus === true.
De string positie kan geen 0 zijn of ken jij iemand die 'sven heet? Of een andere dergelijke naam. Ik denk dat er geen enkele naam in de wereld met een - of een ' begint. Toch vraag ik me af wat je precies bedoelde met al die === erin zetten, want ik zie niet waar ik die er in zou moeten zetten.
Ik krijg in mijn script een error:
3 Notice: Uninitialized string offset: 0 in
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php $name = (isset($_POST['voornaam'])) ? ucwords(strtolower($_POST['voornaam'])) : "";
if(strpos($name, "'")) {
$pos = strpos($name, "'") + 1;
echo '1';
}
if (strpos($name, '-')) {
$pos = strpos($name, '-') + 1;
echo '2';
}
if (!preg_match('/[-\']/', $name)){
$pos = $name;
echo '3';
}
$name = substr_replace($name, strtoupper($name[$pos]), $pos, 1); //hier krijg ik de error
echo "Fixed name is: {$name}";
?>
if(strpos($name, "'")) {
$pos = strpos($name, "'") + 1;
echo '1';
}
if (strpos($name, '-')) {
$pos = strpos($name, '-') + 1;
echo '2';
}
if (!preg_match('/[-\']/', $name)){
$pos = $name;
echo '3';
}
$name = substr_replace($name, strtoupper($name[$pos]), $pos, 1); //hier krijg ik de error
echo "Fixed name is: {$name}";
?>
Ik heb geprobeerd om dit stukje code alleen te laten werken wanneer er gesubmit is, maar dat werkt niet. De code werkt goed wanneer ik een naam submit. Dus mijn idee was om de hele code dit te zetten:
Echter bij deze code doet hij niet meer een echo afgeven. Ik snap alleen niet hoe dat kan, omdat dit wel logischerwijs zo zou moeten werken.
Btw. Wouter hoe test je de snelheid van je script? Dat is echt wel handig... Kan ik nog wat leuke testjes doen. Heb je het volgende getest?
I.p.v. !preg_match('/[-\']/', $name) kan je ook preg_match('/[^-\']/', $name) gebruiken, of dit beter is weet ik niet.
Groetjes Sven
Gewijzigd op 04/06/2011 20:25:21 door Sven b
Een voorbeeld van hoe je een formulier goed verwerkt: http://snipplr.com/view/54888/verwerking-formulier/
De snelheid van een script test je door gebruik te maken van microtime:
Code (php)
Met explode krijg je alle namen in een array, met een foreach loop kan je die dan bewerken.
@Hieronder, bedankt. Heb het aangepast.
Gewijzigd op 05/06/2011 09:05:32 door Wouter J
Wouter J op 04/06/2011 23:40:46:
Over de pos. Ik zou voor de zekerheid toch gewoon === true gebruiken, het is altijd veiliger en je weet nooit wat er ingevoerd wordt. Hoe dit werkt staat uitgelegd op php.net. Typ maar eens php.net/functieNaam en je krijgt een uitgebreide documentatie over die functie.
Een voorbeeld van hoe je een formulier goed verwerkt: http://snipplr.com/view/54888/verwerking-formulier/
De snelheid van een script test je door gebruik te maken van microtime:
Met explode krijg je alle namen in een array, met een foreach loop kan je die dan bewerken.
Een voorbeeld van hoe je een formulier goed verwerkt: http://snipplr.com/view/54888/verwerking-formulier/
De snelheid van een script test je door gebruik te maken van microtime:
Code (php)
Met explode krijg je alle namen in een array, met een foreach loop kan je die dan bewerken.
Je mist een haakje in je code.
!preg_match('/[-\.]/') 3.5565569400787E-5
preg_match('/[^-\.]/') 3.4309375286102E-5
Dit betekend dus dat preg_match('/[^-\.]/') sneller is.