Avatar billede mr_bula Nybegynder
21. november 2006 - 20:36 Der er 16 kommentarer og
1 løsning

Vis billede - php/MySQL spørgsmål

Hej jeg har 3 tabeller, en hvor der kan uploades et billed:

CREATE TABLE billede (
    billed_id        int(11) NOT NULL auto_increment,
    beskrivelse        varchar(50),
    filnavn         varchar(50),
    filtype            varchar(50),
    filindhold         blob,
    primary key(billed_id)
)

En der indeholder en model, som har to attributer model_id og model_navn, og en trejde der sammenkoder model og billed:
tabel mbilled, som har billed_id og et model_id.

Nu vil jeg så gerne lave en fil, vis_billede.php, hvorefter man så kan vise billedet ved vis_billede.php?id=2, men kan ikke få det til at virke. Tror problemet ligger i $billed:

if (!isset($_GET['id'])) {
  print("modelid ikke angivet!");
  exit;


$sql = "SELECT billed_id FROM mbilled WHERE model_id = ". $_GET['id'] ." ";

$billed = mysql_query($sql);
if (!$billed) {
  print("<p>Query ikke udført: ".$sql." SQL-fejl: ".mysql_error()."</p>");
  exit;
  }
$sql = "SELECT beskrivelse, filtype, filindhold FROM billede WHERE billed_id = ". $billed ." ";
$sql .= " AND billed_id <> 1 ";

$row = mysql_fetch_object($billed);

if (!empty($row->filindhold)) {
  // Output MIME header
  header("Content-Type: ". $row->filtype);
  // Output billede
  print $row->filindhold;
}
else {

  $sql = "SELECT beskrivelse, filtype, filindhold FROM billede WHERE billed_id = 1";
  $result = mysql_query($sql);
  if (!$result) {
      print("<p>Query ikke udført: ".$sql." SQL-fejl: ".mysql_error()."</p>");
      exit;
  }
  $row = mysql_fetch_object($result);

  if (!empty($row->filindhold)) {
      // Output MIME header
      header("Content-Type: ". $row->filtype);
      // Output billede
      print $row->filindhold;
  }
}
mysql_close($conn);
Avatar billede tdafoobar Nybegynder
21. november 2006 - 20:40 #1
Prøv at beskriv hvad der PRÆCIS ikke virker. Er åndsvagt vi skal sidde og gætte os til det.

Koden ser rigtig ud, omend elendig syntax, og utrolig grimt, ink. mulighed for SQL-injections.
Avatar billede mr_bula Nybegynder
21. november 2006 - 20:44 #2
Beklager, først kunne den ikke vise noget billede, men nu viser den kun billed_id = 1, så der er noget galt i øverste del.

Mulighed for SQL-injections skal jeg nok fixe, men hvorfor er syntaksten elendig?
Avatar billede zynzz Praktikant
21. november 2006 - 20:49 #3
$sql = "SELECT billed_id FROM mbilled WHERE model_id = '". $_GET['id'] ."' "; ?
Avatar billede mr_bula Nybegynder
21. november 2006 - 20:55 #4
nope, stadig billed_id 1
Avatar billede tdafoobar Nybegynder
21. november 2006 - 21:07 #5
ved at sætte din kode pænere op , kan jeg jo se at du bruger $billed her:

$sql  = "SELECT beskrivelse, filtype, filindhold FROM billede WHERE billed_id = ". $billed ." ";

$billed er i din context en resource, ikke en string.. klart at det ikke virker så :p
Avatar billede tdafoobar Nybegynder
21. november 2006 - 21:10 #6
Og en udgave med pænere syntax:

<?php

if(!isset($_GET['id'])) {
    $id  = (int)$_GET['id'];
    $sql = sprintf("SELECT
                            m.billed_id
                          ,b.billed_id
                          ,b.beskrivelse
                          ,b.filtype
                          ,b.filindhold
                    FROM
                            mbilled m
                          ,billede b
                    WHERE
                            m.model_id = %d
                    AND
                            b.billed_id = m.billd_id
                    AND
                            b.billed_id != 1
                  ";,$id);
    $res = mysql_query($sql);
    if($res) {
        die("<p>Query ikke udført: ".$sql." SQL-fejl: ".mysql_error()."</p>");
    }
    $row = mysql_fetch_object($billed);
    if(!empty($row->filindhold)) {
        header("Content-Type: ". $row->filtype);
        print $row->filindhold;
    } else {
        $sql = sprintf("SELECT
                                billed_id
                              ,beskrivelse
                              ,filtype
                              ,filindhold
                        FROM
                                billede
                        WHERE
                                billed_id = 1
                      ";,$id);
        $res = mysql_query($sql);
        if($res) {
            die("<p>Query ikke udført: ".$sql." SQL-fejl: ".mysql_error()."</p>");
        }
        $row = mysql_fetch_object($billed);
        if(!empty($row->filindhold)) {
            header("Content-Type: ". $row->filtype);
            print $row->filindhold;
    }
}

?>
Avatar billede tdafoobar Nybegynder
21. november 2006 - 21:12 #7
rettelse i den sidste $sql.

$sql = "SELECT
              billed_id
              ,beskrivelse
              ,filtype
              ,filindhold
        FROM
                billede
        WHERE
                billed_id = 1
      ";
Avatar billede mr_bula Nybegynder
21. november 2006 - 21:31 #8
Hmm kan bedre lige min måde at poste sql på ;)

Du manglede en } og havde en ; for meget, men din kode viser bare en blank skærm. Har rettet b.billed_id = m.billd_id til b.billed_id = m.billed_id

Kan man ikke i mit eksemple lave $billed til en string eller lignende så det virker?
Avatar billede tdafoobar Nybegynder
21. november 2006 - 21:55 #9
hvorfor ? det er direkte åndsvagt at lave 2(4) queries når du ikke behøver. Derudover skal du jo ALTID fetche data før det kan læses.
Avatar billede tdafoobar Nybegynder
21. november 2006 - 21:56 #10
og hvis min kode læser blank skærm, er det fordi du ikke er har set querystring argument på, og dvs. slet ikke læst mit foreslag, fordi et ikke var en 100% løsning.

Hvis du GIDER kode php, SÅ LÆR DET.
Avatar billede mr_bula Nybegynder
21. november 2006 - 22:07 #11
Jeg gør altså mit bedste. Hvis jeg vidste alle disse ting eller vidste hvor jeg kunne læse om dem ville jeg nok selv lave det i stedet for at spørge om hjælp.

Synes du er ved at blive uforskammet og utrolig hånlig
Avatar billede mr_bula Nybegynder
21. november 2006 - 22:57 #12
Vil du forklare det for mig?
Avatar billede mr_bula Nybegynder
21. november 2006 - 23:14 #13
Det jeg ikke forstår er din første $sql? Er det en join?
Avatar billede tdafoobar Nybegynder
22. november 2006 - 00:34 #14
uforskammet er den som ignorer svaret han ikke kan forstå.

Og nej, det er ikke en JOIN, jeg henter bare data fra 2 tabeller, helt normalt SQL.

Hånlig ? fordi jeg forventer at folk gider lære det grundlæggende før de kaster sig ud i projekter ? må man jo selv bedømme.

Jeg gider ikke rigtig forklare dig hvordan grundlæggende php virker, hvordan php-sikkerhed fungeret, hvordan php-arrays fungeret, eller hvordan man bruger SQL, når der er over en milliard tutorials på nettet, det er simplelthend spild af tid.

Hvad jeg gider gøre, er at påpege hvad der skal ændres, hvilket jeg har gjort.
Avatar billede mr_bula Nybegynder
22. november 2006 - 10:13 #15
Ok, tak for den tid du brugte på mig. Jeg forstod som sagt ikke helt dit forslag, så jeg løste problemet vha. en innerjoin.

Mente jo hellere ikke du skulle forklare mig alt om php og sql, nu skal du jo ikke være dum
Avatar billede mr_bula Nybegynder
22. november 2006 - 10:15 #16
Giver altid point til personer der viser en måde at løse en problemstilling på, så hvis du vil have nogen smid et svar.
Avatar billede mr_bula Nybegynder
18. december 2006 - 19:13 #17
Lukker - hr. god-til-at-fiske vil åbenbart ikke have nogle 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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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