Avatar billede riefart Seniormester
16. marts 2014 - 09:46 Der 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='&nbsp;';}
$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";   
    }
}
?>
Avatar billede jakobdo Ekspert
16. marts 2014 - 10:18 #1
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)
16. marts 2014 - 10:20 #2
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.
16. marts 2014 - 10:22 #3
Jeg så ikke #1 før jeg fik #2 skudt af.  Men vi er vist inde på nogenlunde det samme, undersøge preg_matcherne en for en.
Avatar billede erikjacobsen Ekspert
16. marts 2014 - 10:25 #4
Du skal også forstå, at fx

  preg_match("/[0-9\. ]/", $telefon

kontrollerer at der findes eet tal/punktum/mellemrum, så strengen "hej med dig" vil være et lovligt telefonnummer.
Avatar billede riefart Seniormester
16. marts 2014 - 10:56 #5
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?
Avatar billede jakobdo Ekspert
16. marts 2014 - 11:13 #6
test et regexp ala: ^[\d\s]+$
Avatar billede riefart Seniormester
16. marts 2014 - 16:09 #7
@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...."
Avatar billede erikjacobsen Ekspert
16. marts 2014 - 16:11 #8
Har dine felter de samme navne som i koden?
Hvordan ser koden så ud nu?
Avatar billede riefart Seniormester
16. marts 2014 - 17:39 #9
Et klip af relevante dele fra body:
<div class="boks2">
<form name="tilmeld_guidetur" class="tilmeld_guidetur" onsubmit="return validate();" action="#" method="post" >
            <div class="tur_navn">Navn<br /><input type="text" class="tur_navn_felt" name="tur_navn" value="<?php echo $navn;?>"/></div>
            <div class="tur_telefon">Telefon<br /><input type="text" class="tur_telefon_felt" name="tur_telefon"  value="<?php echo $telefon;?>"/></div>
            <div class="tur_email">Email<br /><input type="text" class="tur_email_felt" name="tur_email"  value="<?php echo $email;?>"/></div>
            <input type="submit" class="tur_book_knap" value='Færdig&nbsp;›' name="book_tur" />
            </div>
            <div class="boks3">
            <div class="tur_antal">Antal (max <?php echo $restpladser; ?>)<br /><input type="text" class="tur_antal_felt" name="tur_antal_ny"  value="<?php echo $antal;?>"/></div>
            <div class="tur_note">Bemærkning<br /><textarea class="tur_note_felt" name="tur_note">&nbsp;<?php echo $besked;?></textarea></div>
            <input type="hidden" name="arrangementstype" value="<?php echo $arrangementstype;?>" />
            <input type="hidden" name="arrangementsnummer" value="<?php echo $arrangementsnummer;?>" />
            <input type="hidden" name="tidspunkt" value="<?php echo $tidspunkt;?>" />
            <input type="hidden" name="ugedag" value="<?php echo $ugedag;?>" />
            <input type="hidden" name="dato" value="<?php echo $dato;?>" />
            <input type="hidden" name="maaned" value="<?php echo $maaned;?>" />
            <input type="hidden" name="epoc" value="<?php echo $epoc;?>" />
            <input type="hidden" name="tur_antal_gammel" value="<?php echo $antal;?>" />
            </div>     
            </form>
        </div>

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.
Avatar billede erikjacobsen Ekspert
16. marts 2014 - 20:46 #10
Prøv at kigge efter om du har noget, der hedder $bookingtal
23. marts 2014 - 21:03 #11
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.
Avatar billede riefart Seniormester
30. marts 2014 - 11:21 #12
@erik: Beklager den sene reaktion. Jeg har en variabel '$bookingtal', og refererer kun til variabler med indhold. Men ingenting virker.
Avatar billede erikjacobsen Ekspert
30. marts 2014 - 11:47 #13
Det er dig der bestemmer farten ;)

Men kan vi ikke lige se hvor '$bookingtal' får en værdi?
Avatar billede riefart Seniormester
03. april 2014 - 21:35 #14
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.
Avatar billede erikjacobsen Ekspert
03. april 2014 - 22:28 #15
Jeg samler slet ikke på point, tak. :)
Avatar billede riefart Seniormester
04. april 2014 - 18:57 #16
Men tak for hjælpen anyways. Så lukker jeg.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester