Avatar billede dmy Nybegynder
22. april 2009 - 08:18 Der er 40 kommentarer og
1 løsning

Hjælp til fejl i kode

Hjælp.. har fundet en fejl i min simple billedeupload kode.

hvis jeg ikke uploader noget billede så gemmer den en kode af en masse tal i tabellen photo alligevel, hvilket jeg ikke forstår, for hvis der ikke er uploadet noget foto skal den jo heller ikke gemme noget i tabellen photo.

Hvad kan der være galt?




<?php

if(isset($_POST["Submit"]))
{

   
    $description = $_POST["description"];
   
   
   
    if ($_FILES['photo']) // hvis der er uploadet noget
{
    if( file_exists("../photos/" . $_FILES["photo"]["name"]))
    {
        $file_name = substr( md5( time() ), 0, 10 ) . $_FILES["photo"]["name"];
    }
    else
    {
        $file_name = $_FILES["photo"]["name"];
    }
    move_uploaded_file( $_FILES["photo"]["tmp_name"], "../photos/" . $file_name );
    header ('location:index.php');
}
else // hvis der ikke er uploadet noget
{
echo'fejl, der blev ikke uploadet til galleriet.';
}


   
    mysql_query("INSERT INTO photos (description, photo) VALUES ('".$description."', '".$file_name."')")or die(mysql_error());
    echo "Et foto er nu oprettet";

}
?>
<form id="form1" name="form1" method="post" enctype="multipart/form-data" action="">
    <table width="400" height="205" border="0" cellpadding="" cellspacing="1">
          <tr>
              <td><input type="file" name="photo"></td>
        </tr>
        <tr>
            <td><textarea name="description" rows="8" cols="25" ></textarea></td>
            </tr>
        <tr>
           
            <td><input type="submit" name="Submit" value="Tilføj nyt" /></td>
        </tr>
    </table>
</form>
Avatar billede Slettet bruger
22. april 2009 - 08:36 #1
Umiddelbart vil jeg sige, at det er fordi du eksekverer din query, uanset om der er blevet uploadet noget eller ej. Evt. exit når der ikke er uploadet noget, eller måske flyt din query.
Avatar billede dmy Nybegynder
22. april 2009 - 09:01 #2
hmm det forstår jeg ikke noget af..
kan du vise et eksempel på hvad du mener?
Avatar billede jakobdo Ekspert
22. april 2009 - 09:02 #3
Du kunne evt. lave:

if(move_uploaded_file( $_FILES["photo"]["tmp_name"], "../photos/" . $file_name )){
mysql_query("INSERT INTO photos (description, photo) VALUES ('".$description."', '".$file_name."')")or die(mysql_error());
}

Så skyder den kun din query af, hvis der rent faktisk er uploadet en fil, og det samtidig er lykkedes at gemme den korrekt.
Avatar billede dmy Nybegynder
22. april 2009 - 09:05 #4
ej hehe jeg har fundet ud af det, flyttede min query over billedeupload.
Avatar billede jakobdo Ekspert
22. april 2009 - 09:06 #5
Huh ?
Du bør bestemt gøre som jeg foreslår, det er det som giver bedst mening.
Avatar billede dmy Nybegynder
22. april 2009 - 09:08 #6
smid et svar ;-)
Avatar billede dmy Nybegynder
22. april 2009 - 09:09 #7
jakobdo: jamen når jeg prøver din, så gemmer den jo heller ikke i description???
Avatar billede jakobdo Ekspert
22. april 2009 - 09:16 #8
Følgende kode:

<?php
if(isset($_POST["Submit"])){
    $description = $_POST["description"];
    if ($_FILES['photo']){
        if( file_exists("../photos/" . $_FILES["photo"]["name"])){
            $file_name = substr( md5( time() ), 0, 10 ) . $_FILES["photo"]["name"];
        }else{
            $file_name = $_FILES["photo"]["name"];
        }
        if(move_uploaded_file( $_FILES["photo"]["tmp_name"], "../photos/" . $file_name )){
            mysql_query("INSERT INTO photos (description, photo) VALUES ('".$description."', '".$file_name."')")or die(mysql_error());
            header ('location:index.php');
            exit();
        }else{
            echo 'Upload fejlede';
        }
    }else{
        echo'fejl, der blev ikke uploadet til galleriet.';
    }
}
?>
<form id="form1" name="form1" method="post" enctype="multipart/form-data" action="">
    <table width="400" height="205" border="0" cellpadding="" cellspacing="1">
          <tr>
              <td><input type="file" name="photo"></td>
        </tr>
        <tr>
            <td><textarea name="description" rows="8" cols="25" ></textarea></td>
            </tr>
        <tr>
         
            <td><input type="submit" name="Submit" value="Tilføj nyt" /></td>
        </tr>
    </table>
</form>

Bør bestemt gemme i description, altså hvis description udfyldes.
Det kan du jo evt. lave et nyt tjek på.
Du bør stadig væk tage nogle flere elementer fra min upload kode, du har ikke nok kontrol/sikkerhed i din kode.
Avatar billede dmy Nybegynder
22. april 2009 - 09:20 #9
Hmm det virker altså ikke rigtig her.

Ja jeg tænkte nok at der ikke er nok sikkerhed i koden, men det er jo typisk med det vi lærer her på skolen.. hmm
Avatar billede jakobdo Ekspert
22. april 2009 - 09:27 #10
Og description har virker tidligere ?
Avatar billede dmy Nybegynder
22. april 2009 - 09:28 #11
jeps det virker når jeg som jeg skrev flyttede min query op over billedeupload
Avatar billede jakobdo Ekspert
22. april 2009 - 09:31 #12
Prøv at vis koden ?
Avatar billede dmy Nybegynder
22. april 2009 - 09:35 #13
<?php

if(isset($_POST["Submit"]))
{

   
    $description = $_POST["description"];
   
    mysql_query("INSERT INTO photos (description, photo) VALUES ('".$description."', '".$file_name."')")or die(mysql_error());
    echo "Din nyhed er nu oprettet";
   
    if ($_FILES['photo']) // hvis der er uploadet noget
{
    if( file_exists("../photos/" . $_FILES["photo"]["name"]))
    {
        $file_name = substr( md5( time() ), 0, 10 ) . $_FILES["photo"]["name"];
    }
    else
    {
        $file_name = $_FILES["photo"]["name"];
    }
    move_uploaded_file( $_FILES["photo"]["tmp_name"], "../photos/" . $file_name );
    header ('location:index.php');
}



   
   

}
?>
<form id="form1" name="form1" method="post" enctype="multipart/form-data" action="">
    <table width="400" height="205" border="0" cellpadding="" cellspacing="1">
          <tr>
              <td><input type="file" name="photo"></td>
        </tr>
        <tr>
            <td><textarea name="description" rows="8" cols="25" ></textarea></td>
            </tr>
        <tr>
           
            <td><input type="submit" name="Submit" value="Tilføj nyt" /></td>
        </tr>
    </table>
</form>
Avatar billede jakobdo Ekspert
22. april 2009 - 09:40 #14
Den kode virker måske, men den er ikke god.
Hvis billeder findes, så laver du et nyt navn og det er så ikke det navn du har gemt i din database.
Ligeldes, hvis upload fejler, så har du også gemt info i din database.
Avatar billede dmy Nybegynder
22. april 2009 - 09:50 #15
Hmm det er min lærer der har lavet den kode.

Han sagde at den laver et nyt navn til et billede hvis billedenavnet eksisterer i forvejen.

Det er også sådan den gør, ivertfald jeg jeg tester den.
Avatar billede dmy Nybegynder
22. april 2009 - 09:51 #16
hov forresten jo den gemmer det nye navn i databasen, præcis som den kalder billedet det.
Avatar billede jakobdo Ekspert
22. april 2009 - 09:56 #17
Ja, men prøv så at uploade en fil med samme navn som en tidligere fil.
Så burde det fejle.
Avatar billede Slettet bruger
22. april 2009 - 09:58 #18
baahahaha jakobdo sidst jeg var her inde prøvede jeg at hjælpe et fjols som ikke vidste en skid om noget, du ved en af dem der vil have det hele serveret for de har ingen interesse i at lære php...
lol og hvis jeg husker rigtigt prøvede du oss at hjælpe, den dag besluttet jeg mig for ikke at hjælpe "php" folket mere :P...

og så idag beslutter jeg mig faktisk for at se om der er nogle seriøse mennesker som faktisk fortjener hjælp.. og hvad er det første jeg støder på :P LOL jeg forstår ikke hvordan du kan bliver ved..

men men thumbs up jakobdo
Avatar billede dmy Nybegynder
22. april 2009 - 09:58 #19
ja det har jeg prøvet og det virker
Avatar billede jakobdo Ekspert
22. april 2009 - 10:01 #20
Hvis denne kode virker:

if(isset($_POST["Submit"]))
{
  $description = $_POST["description"];
 
    mysql_query("INSERT INTO photos (description, photo) VALUES ('".$description."', '".$file_name."')")or die(mysql_error());
    echo "Din nyhed er nu oprettet";
 
    if ($_FILES['photo']) // hvis der er uploadet noget
{
    if( file_exists("../photos/" . $_FILES["photo"]["name"]))
    {
        $file_name = substr( md5( time() ), 0, 10 ) . $_FILES["photo"]["name"];
    }
    else
    {
        $file_name = $_FILES["photo"]["name"];
    }
    move_uploaded_file( $_FILES["photo"]["tmp_name"], "../photos/" . $file_name );
    header ('location:index.php');
}
}

Så er der noget helt, helt galt...
Avatar billede dmy Nybegynder
22. april 2009 - 10:01 #21
hehehehe morsomt nok, men jeg er rent faktisk seriøs og er interesseret i at lære og ikke at få serveret.
Avatar billede jakobdo Ekspert
22. april 2009 - 10:01 #22
Den kender ikke navnet: $file_name
Da du kalder linjen:
mysql_query("INSERT INTO photos (description, photo) VALUES ('".$description."', '".$file_name."')")or die(mysql_error());
Avatar billede jakobdo Ekspert
22. april 2009 - 10:02 #23
Men hvis din kode virker, så må jeg nok også tilstå, så er der vel ingen grund på at rette dine fejl, som jo tydeligvis ikke er fejl, set med dine eller din lærers øjne. :o)
Avatar billede dmy Nybegynder
22. april 2009 - 10:17 #24
nej du har ret, det virker ikke
da jeg testede at havde jeg måske glemt at opdatere ...
Avatar billede dmy Nybegynder
22. april 2009 - 10:21 #25
jeg har ikke sagt at der ikke er fejl, men man burde da tro at en lærer ved hvad de gør, men det gør de så ikke.

Synes du at det med at lave navnet om er dårligt i koden?
Avatar billede jakobdo Ekspert
22. april 2009 - 10:29 #26
Prøv at test denne kode:

$allowedFileTypes = array('jpg','gif','png');
$uploadDir = '../photos';

//Er der trykket på Upload file knappen?
if(isset($_POST['Submit'])){
  //Har vi en fil?
  if(is_uploaded_file($_FILES['photo']['tmp_name'])){
    //Filendelse
    $extension = strtolower(pathinfo($_FILES['photo']['name'],PATHINFO_EXTENSION));
   
    //Er filen en af de filer vi gerne vil have?
    if(in_array($extension,$allowedFileTypes)){
        if( file_exists("../photos/" . $_FILES['photo']['name'])){
                $file_name = substr( md5( time() ), 0, 10 ) . '_' . $_FILES['photo']['name'];
            }else{
                $file_name = basename($_FILES['photo']['name']);
            }
   
      //Vi flytter filen fra tmp til vores UPLOADDIR
      if(move_uploaded_file($_FILES['photo']['tmp_name'],$uploadDir . basename($_FILES['photo']['name']))){
          $description = mysql_real_escape_string($_POST['description']);
          mysql_query("INSERT INTO photos (description, photo) VALUES ('".$description."', '".$file_name."')")or die(mysql_error());
        echo '<h3 style="color:green;">File ('.basename($_FILES['photo']['name']).') uploaded succesfully</h3>';
      }else{
        echo '<h3 style="color:red;">Error - unable to upload file: '.basename($_FILES['photo']['name']).'</h3>';
      }
    }else{
      echo '<h3 style="color:red;">Wrong filetype, allowed filetypes are: ('.implode(',',$allowedFileTypes).')</h3>';
    }
  }else{
    echo '<h3 style="color:red;">No file selected</h3>';
  }
}
Avatar billede dmy Nybegynder
22. april 2009 - 10:36 #27
Uploader jeg foto og tekst skriver den "file uploaded", men den gemmer ikke billedet i mappen.

skriver jeg kun tekst skriver den "no selected file"
Avatar billede dmy Nybegynder
22. april 2009 - 10:37 #28
vrøvl, den gemmer i mappen nu!
Avatar billede jakobdo Ekspert
22. april 2009 - 10:40 #29
Så med den kode, virker alt som det skal ?
Avatar billede dmy Nybegynder
22. april 2009 - 10:43 #30
uploader jeg igen med et af samme billedenavn, så laver den koden til databasen men gemmer ikke billedet med navnet
Avatar billede Slettet bruger
22. april 2009 - 10:45 #31
okay :) det var da godt at høre.. :) du burde bruge mysqli i stedet for
mysql og så er det mere sikkert og meget nemmere at bruge

$mysqli = new mysqli("host","user","pass","db");

if($mysqli)
{
$mysqli->query("INSERT INTO photos (description, photo) VALUES ('".$description."', '".$file_name."')");
}
else.....
Avatar billede jakobdo Ekspert
22. april 2009 - 10:46 #32
Ja, jeg glemte lige at rette en linje.

Ret:
if(move_uploaded_file($_FILES['photo']['tmp_name'],$uploadDir . basename($_FILES['photo']['name'])))
til:

if(move_uploaded_file($_FILES['photo']['tmp_name'],$uploadDir . $file_name))
Avatar billede dmy Nybegynder
22. april 2009 - 10:52 #33
okey det virker Tak ;-)

nu kan jeg jo ikke gemme i description uden at uploade et foto, kan man ikke det eller hvad?
Avatar billede jakobdo Ekspert
22. april 2009 - 10:55 #34
Vil du gemme tekst unden et billede ?
For det bør du jo lave på en anden måde, ala noget rediger description.
Avatar billede jakobdo Ekspert
22. april 2009 - 10:56 #35
Men jeg har desværre ikke mere tid nu, skal jo også gerne nå lidt selv...
Avatar billede dmy Nybegynder
22. april 2009 - 10:59 #36
ja det var det jeg ville have den til,

jeg ville have den til at gemme i tabellen "description" og hvis et billede ikke er uploadet, skal "description" alligevel gemmes.
Avatar billede dmy Nybegynder
22. april 2009 - 11:00 #37
bare i orden, men takker for hjælpen ;-) du har god tålmodighed hehe
Avatar billede jakobdo Ekspert
22. april 2009 - 11:01 #38
Så skal du flytte:
$description = mysql_real_escape_string($_POST['description']);
    mysql_query("INSERT INTO photos (description, photo) VALUES ('".$description."', '".$file_name."')")or die(mysql_error());

til denne "block":
else{
echo '<h3 style="color:red;">No file selected</h3>';
}

så det bliver:
else{
$description = mysql_real_escape_string($_POST['description']);
    mysql_query("INSERT INTO photos (description, photo) VALUES ('".$description."', '".$file_name."')")or die(mysql_error());
echo '<h3 style="color:red;">No file selected</h3>';
}
Avatar billede dmy Nybegynder
22. april 2009 - 12:37 #39
Ihh takker ;-) hvad skulle jeg gøre uden dig

smid et svar
Avatar billede jakobdo Ekspert
23. april 2009 - 06:35 #40
Svar!
Avatar billede jakobdo Ekspert
23. april 2009 - 11:29 #41
Takker for point.
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