Avatar billede hejmeddigbabe Nybegynder
27. september 2004 - 00:01 Der er 21 kommentarer

Jeg får kun binære data skrevet på skærmen fra en database

Jeg har oprettet en database i mysql. Jeg har lavet en side getpic.php der henter et billede fra databasen. Denne side modtager en parameter id. Dette virker fint.
Når jeg kalder getpic direkte med f.eks getpic.php?id=s011627 får jeg kun volapyk tilbage fra browseren.
scriptet getpic.php ser ud som følger:


<?php
    include('users_connect.php');
   
$query = "select bin_data,filetype from fil_data where studienummer='$id'";
    $result = mysql_query($query);
    $row = @mysql_fetch_array($result);

       

    header("Content-type: ".$row[filetype]);
    echo $row[bin_data];

?>
Dette kalder jeg med linien
    <img src="getpic.php?id=s011627" width="75" alt="">


Jeg ved godt at det ikke er dynamisk. Men vil få det til at virke så simpelt som muligt først.

Det virker som om at jeg ikke fortæller php rigtigt at det er et billede, de binære data jeg sender i echo $row[bin_data];
. Er der nogen der kan hjælpe??
Har siddet og kigget på lignende spørgsmål i snart 2 timer. Fatter ikke en meter af hvorfor det ikke virker.
Avatar billede Slettet bruger
27. september 2004 - 03:12 #1
For en ordens skyld skal du huske at skrive feltnavnene i anførselstegn når du bruger arrays, som $row['feltnavn']. PHP kan normalt godt finde ud af det, men der kan optræde situationer, hvor det kan skabe fejl, der er meget svære at finde, hvis man ikke gør det korrekt.

Prøv for fejlsøgning midlertidigt at rette til:

    header("Content-type: text/plain");
    echo $row['filetype'];

NB! Jeg vil tro, at fejlen skyldes, at register_globals er slået fra, så prøv at starte scriptet med denne linie:

$id=(isset($_GET['id'])?$_GET['id']:0;
Avatar billede hejmeddigbabe Nybegynder
27. september 2004 - 19:16 #2
Jeg har rettet de to ting du sagde mit script ser nu således ud:

<?php
    $id=(isset($_GET['id'])?$_GET['id']:0);
    include('users_connect.php');

    $query = "select bin_data,filetype from fil_data where studienummer='$id'";
    $result = mysql_query($query);
    $row = @mysql_fetch_array($result);

    //header("Content-type: ".$row['filetype']);
    //echo $row['bin_data'];

    header("Content-type: text/plain");
  echo $row['filetype'];

?>

Jeg får følgende respons i html når jeg kører
http://localhost/pmp/getpic.php?id=s011627

image/pjpeg

Hvilket også er det der står i databasen.

Har du nogle gode ideer?
På forhånd tak for hjælpen.
Avatar billede Slettet bruger
27. september 2004 - 21:03 #3
Måske er pjpeg ikke understøttet af din browser. Jeg kunne ikke umiddelbart finde ud af nogen forskel mellem image/jpeg og image/pjpeg, så prøv at se, om det virker med følgende linie:

if($row['filetype']=='image/pjpeg'){$row['filetype']='image/jpeg';}
Avatar billede hejmeddigbabe Nybegynder
27. september 2004 - 22:32 #4
Jeg har nu prøvet den linie du foreslog. Jeg har desuden prøvet med BMP og GIF billeder. Den kan databasen også godt finde ud af. Jeg har desuden lavet et nyt html script til at kalde getpic.php?id=s011627
som kun indeholder linien:

<img src="getpic.php?id=s011627" width="75" alt="">

Stadig samme resultat.

Gad vide om man ikke kan oprette en fil på serveren som man så kopierer indholdet fra databasen ind i og så bruger den location. Jeg kan nemlig sagtens vise billeder som ligger direkte på serveren. Det virker bare rimelig meget som en lappe løsning.....
Avatar billede Slettet bruger
27. september 2004 - 22:40 #5
Jeg kom lige til at tænke på at måske er magic_quotes_runtime slået til på serveren. Hvis den er, så prøv med

echo stripslashes($row['bin_data']);
Avatar billede hejmeddigbabe Nybegynder
27. september 2004 - 23:10 #6
Virker heller ikke. Enten er jeg meget dum eller også er der en eller anden mærkelig ting jeg ikke har taget højde for. Sandsynligvis det første.
Avatar billede Slettet bruger
28. september 2004 - 13:42 #7
Lige nøjagtig sådan noget som at gemme filer i et databasefelt er der mange, der har problemer med, så det har ikke noget at gøre med om du er dum. (Det skal jeg ikke kunne sige, om du er, for jeg kender dig jo ikke. ;-)

Hvor stor er den oprindelige fil, og hvilken felttype har du brugt i databasen?
Avatar billede hejmeddigbabe Nybegynder
28. september 2004 - 22:30 #8
Jeg har brugt longblob....går vist op til en gigabyte.
Har dog fået rettet en anden fejl i min include('users_connect.php');
Da denne fil indeholdte nogle html headers. Det virker jo ikke når der ikke må echoes noget før man laver sin egen header.
Da jeg rettede det, fik jeg det til at virke på en af mine venners computer.
Stripslashed gør ingen forskel. Man kan dog ændre i billedet ved at kære addslashes på det.
Det virker dog stadig ikke. Måske er det noget med opsætningen af min apache og php?
Avatar billede Slettet bruger
28. september 2004 - 22:48 #9
Du kan måske bruge denne funktion:

function my_stripslashes($streng){
  return get_magic_quotes_runtime()?stripslashes($streng):$streng;
}

Den bruges, når du skal udskrive billedet

echo my_stripslashes($row['bin_data']);

Forskellen på den og den almindelige stripslashes er, at denne kun laver stripslashes, hvis PHP er sat op til automatisk at lave addslashes på det, du trækker ud fra databasen.

Du skal nok også bruge addslashes() på billedet, når du sætter det ind i databasen.
Avatar billede hejmeddigbabe Nybegynder
28. september 2004 - 22:58 #10
Jep jeg bruger addslashes() når jeg lægger det ind.
Mit script ser nu således ud:

<?php
    include('users_connect.php');
    //$id=(isset($_GET['id'])?$_GET['id']:0);
   
    $id="s011627"; // så er der heller ikke noget problem med parametren id.

    $query = "select bin_data,filetype from fil_data where id='$id'";
    $result = mysql_query($query);
    $row = @mysql_fetch_array($result);


    //gør vist ingen forskel da det heller ikke virker med bmp osv...
    //if($row['filetype']=='image/pjpeg'){$row['filetype']='image/jpeg';}

    function my_stripslashes($streng){
  return get_magic_quotes_runtime()?stripslashes($streng):$streng;
    }

  header("Content-type: ". $row["filetype"]);
    //echo $row["bin_data"];
    echo my_stripslashes($row['bin_data']);

?>

samme resultat
Avatar billede Slettet bruger
28. september 2004 - 23:39 #11
OK, for at teste, om det er indholdet i databasen, den er gal med eller om det er måden, vi sender den, så prøv lige dette:

<?php
    include('users_connect.php');
    //$id=(isset($_GET['id'])?$_GET['id']:0);
 
    $id="s011627"; // så er der heller ikke noget problem med parametren id.

    $query = "select bin_data,filetype from fil_data where id='$id'";
    $result = mysql_query($query);
    $row = @mysql_fetch_array($result);


    //gør vist ingen forskel da det heller ikke virker med bmp osv...
    //if($row['filetype']=='image/pjpeg'){$row['filetype']='image/jpeg';}

    function my_stripslashes($streng){
  return get_magic_quotes_runtime()?stripslashes($streng):$streng;
    }

//  header("Content-type: ". $row["filetype"]);
    //echo $row["bin_data"];
//    echo my_stripslashes($row['bin_data']);


$data=my_stripslashes($row['bin_data']);
if ($fil=fopen($id . '.jpg', 'wb')){
  while($svar=fwrite($fil,$data,strlen($data)){
    $data=substr($data,$svar);
    if(strlen($data)==0) break;
  }
  if ($svar===false) die("Fejl under skrivning");
} else {
  die("Kunne ikke åbne fil");
}

header("Location: " . $id . ".jpg");

?>
Avatar billede hejmeddigbabe Nybegynder
29. september 2004 - 00:10 #12
Not Found
The requested URL /pmp/s011627.jpg was not found on this server.


--------------------------------------------------------------------------------

Apache/2.0.51 (Win32) mod_ssl/2.0.51 OpenSSL/0.9.7c PHP/5.0.2 Server at localhost Port 80
Avatar billede Slettet bruger
29. september 2004 - 00:13 #13
Jeg glemte jo også at lukke filen. Indsæt denne linie lige før header-kaldet:

fclose($fil);
Avatar billede Slettet bruger
29. september 2004 - 00:14 #14
Hvis det stadig ikke virker, så prøv at se om den måske har gemt filen et andet sted, så vi skal rette header-kaldet (eller sætte en sti på i fopen).
Avatar billede hejmeddigbabe Nybegynder
29. september 2004 - 00:17 #15
nix header kaldet virkede fint. For jeg havde sjovt nok først en fil liggende ved det navn. Så den opretter tilsyneladende ikke s011627.jpg filen med den kode du skrev. Jeg synes fandme du gør en stor indsats for mig. Tak for det.
Avatar billede Slettet bruger
29. september 2004 - 00:39 #16
Prøv engang at rette

$data=my_stripslashes($row['bin_data']);
if ($fil=fopen($id . '.jpg', 'wb')){
  while($svar=fwrite($fil,$data,strlen($data)){
    $data=substr($data,$svar);
    if(strlen($data)==0) break;
  }
  if ($svar===false) die("Fejl under skrivning");
} else {
  die("Kunne ikke åbne fil");
}

fclose($fil);
header("Location: " . $id . ".jpg");

til dette:


if ($fil=fopen($id . '.jpg', 'wb')){
  $svar=fwrite($fil,$data){
  if ($svar===false) die("Fejl under skrivning");
} else {
  die("Kunne ikke åbne fil");
}

fclose($fil);
header("Location: http://localhost/pmp/" . $id . ".jpg");
Avatar billede hejmeddigbabe Nybegynder
29. september 2004 - 00:51 #17
if ($fil=fopen($id . '.jpg', 'wb'))
{
  $svar=fwrite($fil,$data);
  if ($svar===false) die("Fejl under skrivning");
}
else {
  die("Kunne ikke åbne fil");
}

fclose($fil);
header("Location: http://localhost/pmp/" . $id . ".jpg");

Nu kommer der et stort felt til billedet. Men stadigt et rødt kryds
Desuden oprettes en fil med navnet s011627.jpg i mappen pmp som en bør. Desværre er den tom. dvs size = 0KB
Avatar billede Slettet bruger
29. september 2004 - 01:43 #18
OK, lad os se, om det måske er fordi der slet ikke er kommet noget i databasefeltet:

<?php
    include('users_connect.php');
    //$id=(isset($_GET['id'])?$_GET['id']:0);

    $id="s011627"; // så er der heller ikke noget problem med parametren id.

    $query = "select bin_data,filetype from fil_data where id='$id'";
    $result = mysql_query($query);
    $row = @mysql_fetch_array($result);

    header("Content-type: text/plain");
    echo strlen($row['bin_data']);
?>

Den skulle gerne skrive et tal. Hvis tallet er 0, så er databasefeltet tomt, og så er det upload-scriptet der laver fejlen.
Avatar billede Slettet bruger
29. september 2004 - 01:44 #19
Og nu er jeg på vej i seng, så det bliver måske ikke før i morgen, jeg skriver igen.
Avatar billede hejmeddigbabe Nybegynder
29. september 2004 - 21:43 #20
Ok nu virker det. Jeg fatter ikke hvordan. Det der gør udslaget er at skifte
<?
    mysql_connect("localhost","root","") or die("Cannot connect to server");
    mysql_select_db("users") or die("Cannot select database");
?>


ud med

<?php
$link = MYSQL_CONNECT("localhost","root","");
if (!$link) {
die("fejl i forbindelse");
}

$selectdb = mysql_select_db("users");
if (!$selectdb) {
die("databasen findes ikke");
}

?>

Tusind tak for hjælpen. Har trods alt lært en masse.
Avatar billede Slettet bruger
29. september 2004 - 23:41 #21
Det fatter jeg ikke, for de to stykker kode skulle gøre nøjagtig det samme. Den eneste reelle forskel er, at den første kræver at short_open_tag = On i php.ini.

Hvis short_open_tag = On kan man nøjes med <? ellers skal man skrive <?php
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
Computerworld tilbyder specialiserede kurser i database-management

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