Gå til innhold

Bilde + Tekst i MySQL


Anbefalte innlegg

Hei

 

Jeg tenkte å lage et script som gjør at brukern kan legge inn tekst med et bilde i sin database. Altså bilde av et produkt og litt tekst.

 

Det jeg da lurer på er om bildet må legges inn i databasen eller skal det ligge i en mappe? Hvordan kan jeg gjøre dette? Hva er vanlig?

 

Er ny i PHP så jeg håper noen kan hjelpe meg :blush:

Lenke til kommentar
Videoannonse
Annonse

Det er mulig det går å legge inn bilder i DB, men jeg vet ikke hvordan.

 

Jeg bruker å lagre bildet på fil og info i DB. Filnavn på bilde blir 34.jpg og posten for det bildet blir i DB slikt:

 

ID: 34

EXTENSION: JPG

TEXT: 'Dette er en fin bil.'

 

Dermed vet jeg at filnavnet er ID + "." + EXTENSION. Og så henter jeg ut texten i samme slengen. Det er også mulig å laste opp bilder fra nettsiden:

 

http://no.php.net/features.file-upload

Lenke til kommentar

Du kan lagre bilder i mySQL, men kansje ikke å annbefale, spørs helt hvor stor database du har tilgang til.

 

Du kan eventuelt også bare gjøre som foreslått med lagring av navnet på bildet i en database, jeg ville nok ha lagt til en ekstra kolonne med navn på fila istedenfor å laste opp alle bilder på serveren med id som navn.

Lenke til kommentar

Jeg kan også skyte inn at jeg legger til en kolonne i tabellen som heter code. Denne har en tilfeldig generert kode som jeg sender til en php-fil som bruker GD-modulen. Dermed holder jeg filnavnet skjult. Det kan være viktig hvis du har bilder som heter 1.jpg, 2.jpg, 3.jpg, osv. Da kan det lages skript for å hente ut alle bilder, og det er ikke ønskelig noen ganger.

Lenke til kommentar
Takk for svar :)

 

Ok, da lar jeg være å putte dem i DB men blir filnavnet endert på bildene jeg uploader på måten du beskrev Albino? Altså navn = Id

 

Har du et script for dette tilgjengelig?

5540710[/snapback]

Når en bruker laster opp bildet blir den lagt inn på en temporary mappe satt i php.ini. For å flytte bildet bruker du move_uploaded_file(...)

 

Her er en liten test, uten noe database. Det greier du vel selv?

<?
 // Genererer en tilfeldig kode. $length angir antall tegn i koden.
 // Tegn som brukes: 0123456789 abcdefghijklmnopqrstuvwxyz
 function code($length) {
   $b = 0;
   for ($a=48; $a<=57; $a++) $table[$b++] = chr($a);
   for ($a=97; $a<=122; $a++) $table[$b++] = chr($a);

   $str = "";
   for ($a=0; $a<$length; $a++) {
     $t = rand(0, $b-1);
     $str .= $table[$t];
   }
   return $str;
 }
?>
<html>
 <body>
   <?
     if (isset($_POST['cmdUpload']))
     {
       $filename = $_FILES['fileUpload']['name'];
       $size = $_FILES['fileUpload']['size'];
       $tmp = $_FILES['fileUpload']['tmp_name'];
       $parts = explode(".", $filename);
       $extension = strtolower($parts[(sizeof($parts)-1)]);

       $code = code(50);
       // Sjekk om bilde med denne koden eksisterer.
       // Hvis det finnes et bilde: lag ny kode.

       // Sett inn ny rad i bilde-tabellen.
       // id blir laget automatisk av autonummer.
       // Hent ut id fra rad hvor code = $code.
       // Vi bruker 356 som eksempel.
       $picture_id = 356;

       move_uploaded_file($tmp, "pictures/".$picture_id.".".$extension);

       echo "Bildet har blitt lastet opp. Tjohei!";
       exit;
       }
   ?>
   <form enctype="multipart/form-data" action="<? echo $_SERVER['PHP_SELF']; ?>" method="post">
     <input type="file" name="fileUpload" size="50"><br />
     <br />
     <input type="submit" name="cmdUpload" value="Last opp fil">
   </form>
 </body>
</html>

Lenke til kommentar

Dette scriptet validerer ingenting! Her kan jeg laste opp omtrent hva jeg enn måtte ønske.

 

Annbefaler å enten validere bildet i et lignende script, eller buke klassen min istedenfor move_uploaded_file(),

 

Hele poenget med klassen jeg har laget er å erstatte move_uploaded_file() med en metode som utfører den samme jobben, men også

 

Lager thumbnail

Resizer hovedbildet

Legger til tekst/logo i nederste venstre hjørne

Hånterer mappe adresser

Validerer at bildet er ek etke bilde og ikke overstiger en gitt størrelse i både piksler og bytes

Lenke til kommentar

er det snakk om et bilde, er explode med . ikke mest opptimale løsning. alle kan da rename et script til .jpg (om denne filen includes gjennom include() vil innholdet bli kjørt som php uansett)

 

Ved validering av bilder er det langt mere sikkert å sjekke filypen med metoder som:

 

- exif_imagetype() (exif funksjonene er en extension, ikke alle servere har denne, men om de har er den å annbefale)

 

- getimagesize() (Denne lager et array, id 2 inneholder en int som forteller deg hva slags bildetype det er

 

her er exif_imagetype() førstevalget om du har tilgang til det, dette fordi getimagesize() extracter mer info du kansje ikke har bruk for...

Lenke til kommentar
er det snakk om et bilde, er explode med . ikke mest opptimale løsning. alle kan da rename et script til .jpg (om denne filen includes gjennom include() vil innholdet bli kjørt som php uansett)

 

Ved validering av bilder er det langt mere sikkert å sjekke filypen med metoder som:

 

- exif_imagetype() (exif funksjonene er en extension, ikke alle servere har denne, men om de har er den å annbefale)

 

- getimagesize() (Denne lager et array, id 2 inneholder en int som forteller deg hva slags bildetype det er

 

her er exif_imagetype() førstevalget om du har tilgang til det, dette fordi getimagesize() extracter mer info du kansje ikke har bruk for...

5546549[/snapback]

Hvorfor skulle jeg kjøre include på et bilde?

 

Jeg laget et Alumni-tjeneste for Høgskolen i Molde som en prosjektoppgave, og der brukte jeg exif_imagetype(). Den hadde problemer med noen bilder. Tror det var gif. Jeg vet fortsatt ikke hvorfor, for de jeg prøvde virket bra. Uansett foreslo en av mine rådgivere at jeg heller skulle kjennkjenne filtype på filnavn. Det er jeg fortsatt enig i. Kjører jeg bildet (som egentlig er et skript) fra nettleseren vil ikke PHP behandle den fila uansett. Da må i så fall serveren være satt opp til å takle .jpg-filer som PHP-skript, eller så må filen renames til .php, som ikke brukeren har mulighet til. Det siste alternativet er include, men det blir ikke aktuelt.

Lenke til kommentar

Hei

 

Takk for svar:)

 

Har fått til scriptet du viste her Albino. Funket bra.

Planen var å legge inn $extension og $picture_id i en DB og bare legge det i en <IMG SCR=""/> når jeg henter det ut igjen. Er dette en grei måte å gjøre det på?

Det blir vel ikke kjørt som et script da? om noen skulle ha renamet et script.

Lenke til kommentar

Det skal gå fint. Eksempel:

<?
$filename = $row['id'].".".$row['extension'];
echo "<img src=\"$filename\" />";
?>

Problemet her er at leserne kan se filnavnet til bildet. Når de ser at bildene har et mønster (altså 1.jpg, 2.jpg, 3.jpg, 4.jpg ... n.jpg). Da kan noen laget et skript for å skrive ut alle bildene på sida di. For meg var dette plagsomt, da jeg skulle la brukerne laste opp bilder og noen skulle skjules for andre. Derfor måtte filnavnet skjules.

 

Du kan jo begynne med dette systemet i hvert fall, og så kan du jo utvide det etter hvert.

 

Edit: kodeleif. :D

Endret av Albino
Lenke til kommentar

Brukte dette også:

 

<?
// Genererer en tilfeldig kode. $length angir antall tegn i koden.
// Tegn som brukes: 0123456789 abcdefghijklmnopqrstuvwxyz
function code($length) {
  $b = 0;
  for ($a=48; $a<=57; $a++) $table[$b++] = chr($a);
  for ($a=97; $a<=122; $a++) $table[$b++] = chr($a);

  $str = "";
  for ($a=0; $a<$length; $a++) {
    $t = rand(0, $b-1);
    $str .= $table[$t];
  }
  return $str;
}
?>

 

Bildene fikk navn som "32489h32534uig625dfgdf734n2.jpg" o.l

Dette burde vel hindre det problemet?

Lenke til kommentar

Tror det skal gå bra, ja. Kan jo selvfølgelig bruke en brute force-algoritme som sjekker alle mulige løsninger, men jeg tror det er en del...

 

Det er 36 muligheter for hver posisjon i strengen. Strengen din har en lengde på 27. Det vil gi 36^27 = 1,048e+42 muligheter. :thumbup:

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...