20. juli 2011 - 23:36Der er
17 kommentarer og 1 løsning
Fejl med variabel
Hej har et script hvor jeg får fejlmeddelelsen: Notice: Undefined variable: "error in /customers/5/5/c/side.dk/httpd.www/mappe/brugergruppe/add-ok.php on line 56"
Dvs. ved linjen: if (!$error) {
Min kode ser således ud: <?php require("config.php"); $add = &$HTTP_POST_VARS['add']; if(empty($add)) { ?>
<br><a href="index.php?pageid=1">Fejl! Alle felterne skal udfyldes. Tryk her for at blive sendt til oprettelsesformularen.</a>
if(empty($accept)) { echo '<font color="red"><b>Fejl!</b></font><br>Du skal acceptere vilkårene for at blive oprettet i systemet. <br><br> <a href="index.php?pageid=1"><b>Tryk her for at blive sendt til oprettelsesformularen</b></a>'; }
else if(!preg_match(PATTERN_EMAIL, $email)) { echo '<font color="red"><b>Fejl!</b></font><br>Du skal angive en gyldig e-mail for at blive oprettet i systemet. <br><br> <a href="index.php?pageid=1"><b>Tryk her for at blive sendt til oprettelsesformularen</b></a>'; }
else if(empty($fornavn) OR empty($efternavn) OR empty($adresse) OR empty($postnummer) OR empty($town) OR empty($email) OR empty($tlfnr) OR empty($koen) OR empty($alder) OR empty($region)) { echo '<font color="red"><b>Fejl!</b></font><br>Alle felterne skal udfyldes for at kunne gennemføre oprettelsen. <br><br> <a href="index.php?pageid=1"><b>Tryk her for at blive sendt til oprettelsesformularen</b></a>'; }
Hvis du sidder med PHP5, skal du erklære dine variabler først som olebole nævner. Hvis du sidder i PHP4, vil det du har virke helt fint, hvilket jeg tror du gør. Vil tro det er fordi register Globals er off by default og derfor benyttes bør $_POST, $_GET og så videre benyttes i stedet, som jeg har postet et indlæg omkring tidligere ...
Du kan gøre som Heinzdmx og bør gøre som olebole siger og webweavers forslag med at skifte til $_POST skal du osse notere dig. Og så vil jeg gentage mit råd om at gøre feltet 'mail' i brugertabellen UNIQUE, så du får en fejlmeddelelse som du kan spørge på - og så skal du IKKE bruge 'or die()', men noget der ligner:
$status = mysql_query(...); if (!$status && $status == SOME_MYSQL_ERRNO){ ### Mysql har svaret med 'duplicate key' gør_hvad_du_skal; } else{ ### Alle andre fejl die(mysql_error()); }
Dertil:
###if ($count >= 1) { ### lige bestemt 1 vil vi jo gerne have if ($count > 1) { $errmsg = "E-mailen er allerede oprettet i systemet. "; $errmsg .= "Vælg en anden e-mail for at gennemføre oprettelsen."; echo $errmsg; echo "<br>Gå til <a href='index.php?pageid=1'>"; echo "<b>Tilbage til forsiden</b></a><br>"; exit; }
### Resten af koden som eksekveres hvis recorden bliver oprettet.
- og da der er sat LIMIT 1, er det nok mere logisk at skrive ($count===1) ... eller til nød blot med to lighedstegn. Jeg har aldrig testet performance forskellen på operatorerne == og ===, men formoder, sidstnævnte er hurtigere, som det er tilfældet i f.eks. JavaScript =)
- Har rettet &$HTTP_POST_VARS til $_POST. Men får stadig samme fejl. - Bruger PHP Version 5.3.6. - Hvis jeg skal erklære variablen før brug, hvor vil det så være bedst at definere: $error = "E-mailen er allerede oprettet i systemet. Vælg en anden e-mail for at gennemføre oprettelsen.";
Du skal bare erklære den, før du skal bruge den - og ikke inde i en if-sætning. Hvis du som udgangspunkt sætter værdien til en tom streng, skal du selvfølgelig spørge, om strengen stadig er tom:
Det der siges er Notice: Undefined variable. Det betyder at $error ikke er defineret. Det bliver den ikke hvis count() er 0. Altså skal du enten gøre som heinzdmx siger nemlig at teste på om $error eksisterer med isset(), eller som jeg foreslår - lave alt det der har med situationen at gøre og så afslutte, eller lave en if-then-else konstruktion hvor du behandler de to situationer.
Du har masser af muligheder, det er bare med at få afprøve nogle af dem og vælge det der passer dig.
Den med $_POST har intet med problemet at gøre. Det er bare noget der støder vores øjne, og som vi gi'r et venligt hint om.
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.