16. marts 2014 - 09:46Der er
15 kommentarer og 1 løsning
preg_match() driller
Jeg har følgende script, som virker fint, hvis jeg fjerner preg_match(). Men med preg_match(), sker ingenting - udover fejlbeskeden: "du har brugt ulovlige...." Hvad er galt? <?php include("db_con.php"); if(isset($_REQUEST['book_tur'])) { $arrangementsnummer=$_POST['arrangementsnummer']; $arrangementstype=$_POST['arrangementstype']; $tidspunkt=$_POST['tidspunkt']; if($arrangementstype==' '){$arrangementstype='Guidet tur';} $navn=$_POST['tur_navn']; $telefon=$_POST['tur_telefon']; $email=$_POST['tur_email']; $bookingtal_ny=$_REQUEST['tur_antal_ny']; $bookingtal_gammel=$_REQUEST['tur_antal_gammel']; $ugedag=$_POST['ugedag']; $dato=$_POST['dato']; $maaned=$_REQUEST['maaned']; $epoc=$_REQUEST['epoc']; $besked=$_REQUEST['tur_note']; if($besked==''){$besked=' ';} $ip = $_SERVER['REMOTE_ADDR'];
if($stmt=$mysqli->prepare('SELECT `restpladser` FROM `arrangementer` WHERE `arrangementsnummer`=?')) { $stmt->bind_param('i', $arrangementsnummer); $stmt->execute(); $stmt->bind_result($restpladser_gammel); $stmt->fetch(); $stmt->close(); } if($bookingtal_ny<=$restpladser_gammel) { if((preg_match("/[a-zæøå0-9\. -]/i", $navn))AND(preg_match("/[0-9\. ]/", $telefon))AND(preg_match("/[a-zæøå0-9\.,\s\?\!\-\: ]/i", $besked))AND(preg_match("/[0-9 ]/", $bookingtal))AND(preg_match("/^[^\.]?[\w\.-]+@[^\.]?[\w\.-]+\.[A-Z]{2,4}$/i", $email))) { if($stmt=$mysqli->prepare('UPDATE `tilmeldinger` SET antal=?, `navn`=?, `telefon`=?, `email`=?, `besked`=? WHERE (`email`=? && `epoc`=?)')) { $stmt->bind_param('isissii', $bookingtal_ny, $navn, $telefon, $email, $besked, $email, $epoc); $stmt->execute(); $stmt->close(); } else { echo "Der er dersværre opstået en fejl: " . $mysqli->error; } $forskel=($bookingtal_ny-$bookingtal_gammel); $restpladser_ny=($restpladser_gammel-($forskel)); if($stmt=$mysqli->prepare('UPDATE `arrangementer` SET `restpladser`=? WHERE `arrangementsnummer`=?')) { $stmt->bind_param('ii', $restpladser_ny, $arrangementsnummer); $stmt->execute(); $stmt->close(); } } else { echo "Du har brugt ulovlige tegn i et eller flere felter!"; } } else { echo "Der kan højst bookes $restpladser_gammel pladser"; } } ?>
Ville det ikke være nemmere at dele alle din if(preg_match()) op. Så vil du kunne tjekke f.eks. ala:
if(preg_match("/[a-zæøå0-9\. -]/i", $navn)){ echo "Navn er ok"; }else{ echo "Navn er IKKE ok"; }
og på den måde se præcist hvilket felt der fejler. Du kunne også tilføje noget clientside tjek i javascript, dog skal du stadig bruge serverside tjek. :o)
Du kunne måske indsnævre problemet ved, efter at have fjernet alle preg_match() så at genindsætte dem en for en for at se, om det er en enkelt af dem der volder problemer, om det for eksempel er i $navn eller i $telefon at systemet finder ulovlige tegn.
Jeg har tidligere fjernet alle preg_match() på skift for at finde den, der fejlede. Men resultatet var det samme hver gang. Ingen effekt. @erik: hvordan ændrer jeg matchen så den kontrollerer at feltet kun indeholder tal eller mellemrum?
@erik: Tak for wake-up callet. Det gav mig lidt hygge ved tangenterne. @jakobdo: Jeg havde vist glemt start og slut. Det er ændret nu. Men jeg får stadig ikke andet resultat end den kedelige besked. "Du har brugt...."
Og fra head'en hvor pregmatch'en ligger: if((preg_match("/^[a-zæøå0-9\s\.\-]+$/i", $navn))AND(preg_match("/^[\d\s]+$/", $telefon))AND(preg_match("/^[a-zæøå0-9\s\.\,\-\?\!\&\;]+$/i", $besked))AND(preg_match("/^[\d\s]+$/", $bookingtal))AND(preg_match("/^[^\.]?[\w\.-]+@[^\.]?[\w\.-]+\.[A-Z]{2,4}$/i", $email))) { if($stmt=$mysqli->prepare('INSERT INTO `tilmeldinger` (`arrangementsnummer`, `arrangementstype`, `tidspunkt`, `dato`, `maaned`,`navn`, `telefon`, `antal`, `email`, `besked`, `epoc`, `ip`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)')) { $stmt->bind_param('isssssiissis', $arrangementsnummer, $arrangementstype, $tidspunkt, $dato, $maaned, $navn, $telefon, $bookingtal, $email, $besked, $epoc, $ip ); $stmt->execute(); $stmt->close(); } Håber, at det kan hjælpe til at hjælpe. Det er meget mærkeligt.
riefart, kom du fra det igen? Du har ikke været inde en uge, og du har tilsyneladende ikke set det sidste indlæg. Hvis spørgsmålet ikke længere er aktuelt, så luk det venligst igen. Ellers kom ind og forklar din videre hensigt.
For fanden, Erik. Det er meget pinligt. Jeg har vist lavet en vældig skævert. Jeg sad i en meget sen nattetime og rodede med nogle ændringer og ændrede bl.a $bookingtal til $bookingtal_ny, men kom fra det og glemte det. Det var der fejlen lå. Tak for nærlæsning og et godt råd. Smid fluks et svar.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.