Avatar billede Frederik Nybegynder
20. juli 2011 - 23:36 Der 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>


<?php
                } else {
                                define("PATTERN_EMAIL", "/^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/");
                                $fornavn = &$HTTP_POST_VARS['fornavn'];
                                $efternavn = &$HTTP_POST_VARS['efternavn'];
                                $adresse = &$HTTP_POST_VARS['adresse'];
                                $postnummer = &$HTTP_POST_VARS['postnummer'];
                                $town = &$HTTP_POST_VARS['town'];
                                $email = &$HTTP_POST_VARS['email'];
                                $tlfnr = &$HTTP_POST_VARS['tlfnr'];
                                $koen = &$HTTP_POST_VARS['koen'];
                                $alder = &$HTTP_POST_VARS['alder'];
                                $region = &$HTTP_POST_VARS['region'];
                                $accept = &$HTTP_POST_VARS['accept'];

                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>';
                                }

                else {
                                mysql_connect($mysql_host, $mysql_user, $mysql_pw);
                                mysql_select_db($mysql_db);

                                $query = mysql_query("SELECT email FROM brugergruppe WHERE email = '$email' LIMIT 1") or die (mysql_error());

                                $count = mysql_num_rows($query);

                if ($count >= 1) {
                                $error = "E-mailen er allerede oprettet i systemet. Vælg en anden e-mail for at gennemføre oprettelsen.";
                                }
       
                if (!$error) {

                                mysql_query("insert into brugergruppe (fornavn, efternavn, adresse, postnummer, town, email, tlfnr, koen, alder, region) values ('$fornavn', '$efternavn', '$adresse', '$postnummer', '$town', '$email', '$tlfnr', '$koen', '$alder', '$region')")
                                or die(mysql_error());

                                print "Kære <b>\"$fornavn $efternavn\"</b> tak for din henvendelse. Du er nu oprettet som bruger i systemet.";
                } else {
                                echo $error;
                                }
?>

<br>
Gå til <a href="index.php?pageid=1"><b>Tilbage til forsiden</b></a><br>

<?php
}
}
?>






Jeg håber I kan hjælpe mig med at nå frem til en løsning!
Avatar billede webweaver Praktikant
20. juli 2011 - 23:53 #1
Skift &$HTTP_POST_VARS ud med $_POST og se om det skulle gøre en forskel.
Avatar billede heinzdmx Nybegynder
20. juli 2011 - 23:56 #2
Hjælper det at gøre følgende:

if (!$error) {


Om til:

if (!isset($error) || !$error) {
Avatar billede olebole Juniormester
21. juli 2011 - 00:01 #3
<ole>

Erklær dine variabler før du begynder at bruge dem. Det sikrer dig mod flere typer fejl og uforudsete særheder  =)

/mvh
</bole>
Avatar billede webweaver Praktikant
21. juli 2011 - 00:09 #4
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 ...
Avatar billede olebole Juniormester
21. juli 2011 - 00:24 #5
#4 >> Svært at være uenig!  *o)
Avatar billede vagnk Juniormester
21. juli 2011 - 09:25 #6
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.
Avatar billede vagnk Juniormester
21. juli 2011 - 09:40 #7
Sludder og vrøvl. Jeg kan mærke jeg har været oppe hele natten. Din test på (count >= 1) er helt korrekt.
Avatar billede olebole Juniormester
21. juli 2011 - 13:52 #8
- 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  =)
Avatar billede Frederik Nybegynder
21. juli 2011 - 15:47 #9
- 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.";

Eller har det ikke noget betydning?


Hvad vil være den optimale løsning på problemet?
Avatar billede olebole Juniormester
21. juli 2011 - 15:55 #10
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:

if ($error==='') {
Avatar billede vagnk Juniormester
21. juli 2011 - 16:15 #11
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.
Avatar billede olebole Juniormester
21. juli 2011 - 16:39 #12
vagnk >> men at erklære sine variabler før brug, anser du med andre ord ikke for best (eller i det mindste good) practice ... eller?
Avatar billede heinzdmx Nybegynder
21. juli 2011 - 16:47 #13
Min løsning hopper undgår problemet, men oles er nok hvad der vil være bedst for forståelse af problemet.

Evt. kan man sætte

$error = false


I toppen, så forbliver resten af koden som den er nu, og du undgår problemer.
Avatar billede Frederik Nybegynder
21. juli 2011 - 16:55 #14
Ændrede til

if (!isset($error) || !$error) {


som #2 sagde, og nu virker det tilsyneladende :)

tak for hjælpen!

I har jo været nogle stykker til at hjælpe, så hvad gør vi med point?
Avatar billede olebole Juniormester
21. juli 2011 - 17:06 #15
Jeg samler ikke points, så det indsnævrer jo feltet en del  =)
Avatar billede heinzdmx Nybegynder
21. juli 2011 - 17:47 #16
Jeg lægger et svar.

Du kan jo dele pointene mellem os der vil have point :)
Avatar billede webweaver Praktikant
21. juli 2011 - 17:52 #17
Jeg springer over :-)
Avatar billede vagnk Juniormester
22. juli 2011 - 07:12 #18
Det gør jeg osse.
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