[PHP] afbeelding plaatsen en lezen uit MySql

Pagina: 1
Acties:
  • 498 views sinds 30-01-2008

  • Waterspout
  • Registratie: November 2006
  • Laatst online: 10-03-2021
Hé PHP's,
ik ben sinds een maandje of 2 bezig met datbases (mysql). Ik probeer in een mysql database afbeeldingen te plaatsen en vervolgens via php aan te roepen en weer te geven. Als ik de afbeelding via een php script upload naar mysql staat er in de rij van de afbeelding alleen een teks naar de verwijzing op de server. Deze is vervolgens niet op te halen via php in een browser.

In de database wordt de afbeelding niet als afbeelding maar als tekst opgeslagen, en dan wel als:
images/image,jpg


Het php script (via internet gevonden) voor afbeelding te uploaden werkt overigens wel. Het plaatje wordt alleen als 'verwijzing' naar de server gezet):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php 
include("connect.inc.php");

  $sql = "SELECT * FROM afbeelding";
  $result = mysql_query($sql);
  if (!$result){
    echo 'Fout: sql statement heeft niet gewerkt.';
    //echo '<br>querystring:"'.$sql.'"';
    echo '<br>MySQL retourneerde: '.mysql_error();
    exit;
  }

  $num_results = mysql_num_rows($result);
  echo '<span class=text>Aantal records in de database: '.$num_results.'<BR><BR>'."\n";
  for ($i=0; $i < $num_results; $i++) {
    $row = mysql_fetch_array($result);
    echo '<strong>'.($i+1).' <a href="http://';
    echo $row['nummer'].'">'.$row['omschrijving'].'</a>';
    echo '</strong><BR>'."\n";
    echo $row['afbeelding'].'<BR><BR>'."\n";
  }
// gebruik het filter voor de afbeeldingen
include ("check.php");

// lees de waarde van 'go'
$go = $_POST['go'];


# als het formulier nog niet eerder is gebruikt dan 
# wordt er een formulier getoond op je scherm.

if ($go ==""): 

?>


<?php 
endif;

// Deze procedure wordt aangeroepen nadat men op verzenden heeft gedrukt

if ($go =="go"):
# Deze procedure zordt ervoor dat de afbeeldingen
# op je server worden geplaatst en tevens in je 
# mysql database.

// bepaal de huidige directory
$hello = getcwd();

# hier komen de afbeeldingen, als je 
# het script in de directory hallo hebt geinstalleerd
# dan worden de afbeeldingen in hallo/images/ 
# geplaatst. 

$file_dir = ($hello . "/images/");

# we moeten natuurlijk wel zeker weten 
# dat de directory bestaat. Dit controleren wij
# met de opdracht is_dir via de volgende routine :

if (is_dir ($file_dir)) {
  print "<br><br>++directorty bestaat";  
  }  else {  
  print "<br><br>--Directory bestaat nog niet" . $file_dir;  
    $newpage = $file_dir;
    echo ("<br>we gaan daarom de directory aanmaken");
    mkdir ($newpage, 0777);    
  }  

// toon de systeem datum
echo date("m/d/y G.i:s");


echo ("<br><br>");

# Ik heb besloten om $_FILES als een array te
# laden, zodat je (eventueel) meer afbeeldingen via
# een formulier op je server kunt plaatsen.

foreach($_FILES as $file_name => $file_array) {
       
       # Verander de bestandsnaam zodat het een geldig bestandsnaam wordt 
       # in een Linux omgeving. (Een Mac en een Windows omgeving zijn
       # veel relaxer met bestandsnaam m.b.t. spaties, hoofdletters en 
       # een mengeling van beide, maar dit geldt niet voor Linux, bovendien
       # zijn bestanden in een Linux omgeving hoofdletter gevoelig.
       
       $file_name=str_replace("'", "_", $file_array['name']);
       $file_name=str_replace(" ", "_", $file_array['name']);
       $file_name=stripslashes ($file_name);
       $file_name=trim($file_name);       
       $file_name=strtolower($file_name);    
                 
       echo "path: " .$file_array['tmp_name'] . "<br>\n";
       echo "name: " .$file_name . "<br>\n";    
       echo "type: " .$file_array['type'] ."<br>\n";
       echo "size: " .$file_array['size'] ."<br>\n";
       
       # gebruik de functie afbeeldingen (zie filter.php) om te
       # controleren of het om een afbeelding gaat.
       # de waarde van $test wordt 1 indien het een afbeelding betreft,
       # in alle andere gevallen is $test leeg.

       $test = afbeeldingen($file_name);
       if ($test !=""):
            echo $file_name . " dit is een afbeelding<br>";
            if (is_uploaded_file($file_array['tmp_name'])) {
                 move_uploaded_file($file_array['tmp_name'], "$file_dir/$file_name") or die ("Couldn't copy");
                 echo "Afbeelding staat op de server<br><br>";
                 // voeg de locatie + omschrijving van de afbeelding toe in de database
                 $afbeelding = "images/" . $file_name;
                 $query = "INSERT INTO afbeelding (nummer, omschrijving, afbeelding) VALUES('', '$_POST[omschrijving]','$afbeelding')";    
                 if(mysql_query($query)) die(mysql_error());                     
                        echo $afbeelding . " is toegevoegd aan de database met als omschrijving : <br>";                    
                        echo $_POST[omschrijving] ;
            }
       endif;                     
       if ($test ==""):    
             echo $file_name . " dit is geen afbeelding en wordt daarom niet op de server geplaatst<br>\n";      
       endif;
  }
endif;

?>


Ik kan op tweakers en op andere fora (via google) niet vinden hoe afbeeldingen in mysql worden opgeslagen. Dus als tekst of werkelijk als afbeelding.

Wie kan mij helpen,
ThanX,
Groet Ferry :)

  • DennusB
  • Registratie: Mei 2006
  • Niet online
Als tekst.
Maar dat kan je toch zien door even in te loggen in phpmyadmin?:S

Owner of DBIT Consultancy | DJ BassBrewer


  • mithras
  • Registratie: Maart 2003
  • Niet online
Waarom zou je dat willen? Het is niet het antwoord op je vraag, dat weet ik, maar in principe is een database geschikt voor arbitraire plaintext data. Een plaatje, binary, pdf'je of wat dan ook is afaik niet handig om binnen je (MySQL) database op te slaan, omdat dit alleen een hogere load geeft.

Als je bijvoorbeeld de locatie van een plaatje wil verbergen kan je dit op nog veel meer manieren doen, dus is "de feitelijke locatie van het plaatje verbergen" je doel, of had je iets anders in gedachte?
Als ik de afbeelding via een php script upload naar mysql staat er in de rij van de afbeelding alleen een teks naar de verwijzing op de server. Deze is vervolgens niet op te halen via php in een browser.
Ik snap hier eigenlijk weinig van. Niet op te halen via php? Geen idee wat je bedoelt...

[ Voor 23% gewijzigd door mithras op 06-03-2007 15:33 ]


  • Waterspout
  • Registratie: November 2006
  • Laatst online: 10-03-2021
mithras schreef op dinsdag 06 maart 2007 @ 15:31:

Als je bijvoorbeeld de locatie van een plaatje wil verbergen kan je dit op nog veel meer manieren doen, dus is "de feitelijke locatie van het plaatje verbergen" je doel, of had je iets anders in gedachte?
Wat ik wil is een aantal foto's opslaan in een mysql database. De foto's worden dus opgeslagen en via php (sql query) indien gewenst opgehaald uit de database en vervolgens op de browser getoond. Maar ik krijg het niet voor elkaar foto's in de database te zetten. Er wordt wel wat geplaatst, maar dat is alleen dus tekst (bijv. images/foto.jpg)

  • mithras
  • Registratie: Maart 2003
  • Niet online
Waterspout schreef op dinsdag 06 maart 2007 @ 15:39:
[...]

Wat ik wil is een aantal foto's opslaan in een mysql database. De foto's worden dus opgeslagen en via php (sql query) indien gewenst opgehaald uit de database en vervolgens op de browser getoond. Maar ik krijg het niet voor elkaar foto's in de database te zetten. Er wordt wel wat geplaatst, maar dat is alleen dus tekst (bijv. images/foto.jpg)
Een plaatje is niet zomaar een wat met ascii tekens achter elkaar geplakt geheel. Het heeft een hele andere structuur. Daarom raad ik je -nogmaals- aan om je plaatje gewoon in een mapje te zetten, de locatie uit de database te halen en (mogelijk met verificatie) het plaatje te tonen (of niet).

Als je het feitelijke mapje dan ontoegankelijk maakt (vrij eenvoudig met een Apache webserver) dan kan je alleen er naar toe via een speciale url.

Simpel gezegd: je hebt een domein mijndomein.nl. Als je dan een pagina maakt de volgende inhoud:
PHP: opslag.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if(!is_numeric($_GET["id"])){
  echo "Verkeerd id!";
}else{
    $id = $_GET["id"];
    query = "SELECT name, location FROM table WHERE id=".$id;
    /* haal hier je data op, naar een array $result */
    $download = false /* Zet naar true om opslaan van bestand door browser
      te forceren */
    $name = $result["name"];
    $location = "geheim_mapje/".$result["location"];
    $size = $result["size"];
    if(!file_exists($location)){
        echo = "Het bestand bestaat niet of is corrupt!";
    }else{
        ob_clean();
        header("Content-Type: ".$value["mime"]);
        header("Content-Length: ".$value["size"]);
        if($download){
            header("Content-Disposition: attachment; filename=\"$name\"");
        }else{
            header("Content-Disposition: inline; filename=\"$name\"");
        }
        header("Content-Transfer-Encoding: binary\n");
        readfile($location);
        exit;
    }
}
Kan je met http://mijndomein.nl/opslag.php?id=1 het plaatje uit de database halen met id=1 en die tonen. Geen gezeur, maar wel veilig :)

[ Voor 3% gewijzigd door mithras op 06-03-2007 15:49 ]


  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 09:37

pietje63

RTFM

Uit je eigen broncode
PHP:
1
2
// voeg de locatie + omschrijving van de afbeelding toe in de database 
                 $afbeelding = "images/" . $file_name;


Zo te zien een script dat je ergens vandaan haalt, anders zal het je niet verbazen dat je alleen een link naar de afbeelding krijgen.

Eerder in je script wordt de foto ook al naar de server gekopieerd. Wat gebruikelijk is met zo'n script is dat je de LOCATIE opslaat in de database en de afbeelding zelf op de server.Vervolgens haal je de locatie uit de database en kun je simpel via [html]<img src="<? echo($locatie); ?>">[/html] de afbeelding tonen.

Je kunt ook de afbeelding in de database zetten in een zogenaamd BLOG field, maar dit maakt het wat lastiger. Je moet dan als img src een php bestand oproepen die weer de informatie uit de database haalt en daar de juiste headers aan toe voegt.

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:53

Janoz

Moderator Devschuur®

!litemod

Je hebt twee opties:
1- Bij het uploaden kopieer je het plaatje naar een speciale map en sla je deze locatie op in een varchar in de database
2- Je laad de complete data van het bestand in en slaat dit op in een blob veld.

Voor beide opties is wat te zeggen.

Als je naar je eigen* script zou kijken dan zul je zien op regel 108 het bestand in een speciale map wordt gezet (die eventueel in regel 60 tot 70 aangemaakt is) en de locatie vervolgens in regel 112/113 in de database wordt gezet. In je database staat dus gewoon een verwijzing, en niet het plaatje zelf.

*Gezien de vragen die je stelt ga ik er vanuit dat dit niet je eigen script is. Sterker nog, het script is zo dudielijk gedocumenteerd dat ik van mening ben dat je of weinig verstand hebt van php of er eigenlijk gewoon helemaal nog neit echt naar gekeken hebt.

[ Voor 19% gewijzigd door Janoz op 06-03-2007 16:02 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:53

Janoz

Moderator Devschuur®

!litemod

Gezien mijn voetnoot boven en deze url http://www.flashfocus.nl/...ve/index.php/t-19445.html
ben ik maar tot de conclusie gekomen dat dit niet je eigen script is. Het is in Programming niet de bedoeling om support te vragen op scripts van anderen. PRG is gericht op het zelf programmeren.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1

Dit topic is gesloten.