Avatar billede Slettet bruger
30. november 2004 - 21:40 Der er 26 kommentarer og
1 løsning

mysql query fejl

jeg har lidt kode:

function listen()
    {
    echo "<table style=\"border: 0px; border-collapse: collapse; width: 100%;\" cellpadding=\"5\">
    <tr height=\"30\">
      <td><b>Id</b></td>
      <td><b>Mærke</b></td>
      <td><b>Model</b></td>
      <td><b>køn</b></td>
      <td><b>Forhandler</b></td>
      <td colspan=\"2\" align=\"center\"><b>Ændringer</b></td>
    </tr>";
    $query = mysql_query("SELECT * FROM cykler");
    while($row = mysql_fetch_array($query))
        {
        $i++;
        if($i%2 == '0')
            {
            $bg = "#BFD3A5";
            }
        else
            {
            $bg = "#FFFFFF";
            }
        $q =
        mysql_query("
        SELECT
        model.navn as model,
        cykelhandlere.navn as forhandler,
        koen.navn as koen,
        maerke.navn as maerke
        FROM
        model,
        maerke,
        koen,
        cykelhandlere
          WHERE
        koen.id=". $row['koen'] ."
        AND model.id=". $row['modelid'] ."
        AND maerke.id=model.maerkeid
        AND cykelhandlere.id=". $row['forhandlerid'] ."
        ORDER BY model.navn ASC")
        or die(mysql_error());
       
        $r = mysql_fetch_array($q);
        echo
        "<tr height=\"20\" bgcolor=\"". $bg ."\">
        <td>". $row['id'] ."</td>
        <td>". $r['maerke'] ."</td>
        <td>". $r['model'] ."</td>
        <td>". $r['koen'] ."</td>
        <td>". $r['forhandler'] ."</td>
        <td><a href=\"?id=". $_GET['id'] ."&sid=". $row['id'] ."\">". Rediger ."</a></td>
        <td><a href=\"?id=". $_GET['id'] ."&func=slet&sid=". $row['id'] ."\">slet</a></td>
        </tr>";
        }
    echo "<tr height=\"30\"><td style=\"text-align: center;\" colspan=\"6\"><a href=\"?id=". $_GET['id'] ."&sid=0\">Tilføj en ny cykel</a></td></tr></table>";
    }


og den siger:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND model.id=1 AND maerke.id=model.maerkeid AND cykelhandle

kan i sige hvad der er galt?
Avatar billede Slettet bruger
30. november 2004 - 21:44 #1
har lige ændret det til :

function listen()
    {
    echo "<table style=\"border: 0px; border-collapse: collapse; width: 100%;\" cellpadding=\"5\">
    <tr height=\"30\">
      <td><b>Id</b></td>
      <td><b>Mærke</b></td>
      <td><b>Model</b></td>
      <td><b>køn</b></td>
      <td><b>Forhandler</b></td>
      <td colspan=\"2\" align=\"center\"><b>Ændringer</b></td>
    </tr>";
    $query = mysql_query("SELECT * FROM cykler");
    while($row = mysql_fetch_array($query))
        {
        $i++;
        if($i%2 == '0')
            {
            $bg = "#BFD3A5";
            }
        else
            {
            $bg = "#FFFFFF";
            }
        $q =
        mysql_query("
        SELECT
        model.navn as modelnavn,
        cykelhandlere.navn as forhandlernavn,
        koen.navn as koennavn,
        maerke.navn as maerknavn
        FROM
        model,
        maerke,
        koen,
        cykelhandlere
          WHERE
        koen.id=". $row['koen'] ."
        AND model.id=". $row['modelid'] ."
        AND maerke.id=model.maerkeid
        AND cykelhandlere.id=". $row['forhandlerid'] ."
        ORDER BY model.navn ASC")
        or die(mysql_error());
       
        $r = mysql_fetch_array($q);
        echo
        "<tr height=\"20\" bgcolor=\"". $bg ."\">
        <td>". $row['id'] ."</td>
        <td>". $r['maerkenavn'] ."</td>
        <td>". $r['modelnavn'] ."</td>
        <td>". $r['koennavn'] ."</td>
        <td>". $r['forhandlernavn'] ."</td>
        <td><a href=\"?id=". $_GET['id'] ."&sid=". $row['id'] ."\">". Rediger ."</a></td>
        <td><a href=\"?id=". $_GET['id'] ."&func=slet&sid=". $row['id'] ."\">slet</a></td>
        </tr>";
        }
    echo "<tr height=\"30\"><td style=\"text-align: center;\" colspan=\"6\"><a href=\"?id=". $_GET['id'] ."&sid=0\">Tilføj en ny cykel</a></td></tr></table>";
    }

det ligger også her http://pastebin.dk/index.php?show=57
Avatar billede Slettet bruger
30. november 2004 - 21:54 #2
ja, jeg tror også at det er verdens sværeste spg..
Avatar billede jakoba Nybegynder
30. november 2004 - 22:09 #3
Det ser mest ud somom du har fejlstavet et af feltenes navne i dit $row array

prøv evt med en debuglinie
    var_dump( $row );    // debuglinie  fjernes når det duer.
så du kan checke om der virkelig er felter med de navne

en potentielt værre fejl er at de eneste tabeller du joiner er model og mærke.
        AND maerke.id=model.maerkeid
de to andre tabeller hentes der blot fra parallellt. det giver en hulens masse kombinationer og måske endda en 'overload'
Avatar billede Slettet bruger
01. december 2004 - 12:37 #4
jeg er ikke med på hvordan jeg skal bruge var_dump().

Det sidste lyder også ldit kryptisk, men ikke desto mindre tror jeg at det er fejlen
Avatar billede Slettet bruger
01. december 2004 - 12:44 #5
hvad kunne jeg gøre ved det jakoba.. ved du det?
Avatar billede jakoba Nybegynder
01. december 2004 - 12:52 #6
Rent gætteri, men mon ikke tabellem cykelhandlere indeholder info om hvilke mærker den enkelte forhandler sælger. forhandleren skal så kun med ved de cykelmærker.

og for model kunne der tilsvarened være info om om den model fås som dame/herre/unisex/... hvilke køn der nu findes for cykler.
Avatar billede Slettet bruger
01. december 2004 - 12:54 #7
cykelhandlere indeholder info om cykelhandlerne.. cykler indeholder info om cyklerne mens mærke og model indeholder... modellerne og hvilke mærker de findes i.
Avatar billede Slettet bruger
01. december 2004 - 12:55 #8
jeg har en dump for strukturen her:

http://pastebin.dk/index.php?show=59

og tak for det hurtige svar!
Avatar billede Slettet bruger
01. december 2004 - 13:17 #9
jeg har lavet end del om, jeg indsætter kun funktionen "listen" idet det jo er der problemet er:

function listen()
    {
    echo "<table style=\"border: 0px; border-collapse: collapse; width: 100%;\" cellpadding=\"5\">
    <tr height=\"30\">
      <td><b>Id</b></td>
      <td><b>Mærke</b></td>
      <td><b>Model</b></td>
      <td><b>køn</b></td>
      <td><b>Forhandler</b></td>
      <td colspan=\"2\" align=\"center\"><b>Ændringer</b></td>
    </tr>";
    $query = mysql_query(
    "
    SELECT
    cykler.id as id,
    cykler.modelid,
    cykler.forhandlerid,
    model.navn as modelnavn,
    cykelhandlere.navn as forhandlernavn,
    koen.navn as koennavn,
    maerke.navn as maerknavn,
    model.maerkeid
   
    FROM
    cykler,
    model,
    maerke,
    koen,
    cykelhandlere
     
    WHERE
    koen.id=cykler.id
    AND model.id=cykler.modelid
    AND maerke.id=model.maerkeid
    AND cykelhandlere.id=cykler.forhandlerid
    ORDER BY modelnavn DESC
    ")or die(mysql_error());
    while($row = mysql_fetch_array($query))
        {
        $i++;
        if($i%2 == '0')
            {
            $bg = "#BFD3A5";
            }
        else
            {
            $bg = "#FFFFFF";
            }
        echo
        "<tr height=\"20\" bgcolor=\"". $bg ."\">
        <td>". $row['id'] ."</td>
        <td>". $row['maerkenavn'] ."</td>
        <td>". $row['modelnavn'] ."</td>
        <td>". $row['koennavn'] ."</td>
        <td>". $row['forhandlernavn'] ."</td>
        <td><a href=\"?id=". $_GET['id'] ."&sid=". $row['id'] ."\">". Rediger ."</a></td>
        <td><a href=\"?id=". $_GET['id'] ."&func=slet&sid=". $row['id'] ."\">slet</a></td>
        </tr>";
        }
    echo "<tr height=\"30\"><td style=\"text-align: center;\" colspan=\"6\"><a href=\"?id=". $_GET['id'] ."&sid=0\">Tilføj en ny cykel</a></td></tr></table>";
    }
Avatar billede jakoba Nybegynder
01. december 2004 - 13:19 #10
Det ser ud til at det er tabellen  cykler  der knytter de andre tabeller sammen, den peger både på forhandlere, køn, model og mærke.

så lad os lave en query der finder cykler med de ønskede værdier for
  $row['koen']  $row['modelid']  og  $row['forhandlerid']

fx:
        mysql_query("
            SELECT
                model.navn as modelnavn,
                cykelhandlere.navn as forhandlernavn,
                koen.navn as koennavn,
                maerke.navn as maerknavn
            FROM
                cykel
                JOIN model        ON model.id        = cykel.modelid
                JOIN maerke        ON maerke.id        = model.maerkeid
                JOIN koen          ON koen.id          = cykel.koenid
                JOIN cykelhandlere ON cykelhandlere.id = cykel.forhandlerid
            WHERE
                  cykel.koenid=". $row['koen'] ."
              AND cykel.modelid=". $row['modelid'] ."
              AND cykel.forhandlerid=". $row['forhandlerid'] ."
            ORDER BY model.navn ASC")
        or die(mysql_error());

bemærk at jeg har flyttet betingelserne for hvordan tabellerne skal sættes sammen op i FROM sektionen, sådan at det der står i WHERE kun er de betingelser der begrænser det endelige resultat.

MySQL virker som regel lige godt enten du adskiller dem eller skriver dem alle i WHERE, men jeg foretrækker at opdele fordi det fortæller mig lidt mere om strukturen og om den joinede tabel.

mvh JakobA
Avatar billede Slettet bruger
01. december 2004 - 13:21 #11
ok det ser virkelig godt ud.. det eneste er at maerkenavn ikke bliver vist.. variablen er bare tom.
Avatar billede Slettet bruger
01. december 2004 - 13:23 #12
join er jeg ikke helt med på hvad gør.. jeg har læst om det i mysql manualen, men det ser ikke ud som om at jeg forstår det.. for mig at se gør det det samme som bare at sige "FROM tabel1, tabel2, tabel3"
Avatar billede jakoba Nybegynder
01. december 2004 - 13:27 #13
tjae, jeg er supergod til at lave stavefejl, men uden syntaksfej er det nok snarere noget med at tabellen maerke har værdien '' i navn for det maerkeid.
Avatar billede Slettet bruger
01. december 2004 - 13:29 #14
jeg prøver lige at gå det efter. igen :D
Avatar billede Slettet bruger
01. december 2004 - 13:35 #15
den siger syntax fejl her: http://cykeltjek.dk/index.php?id=50 

det vi har (har lige tilføjet pris):

mysql_query("
            SELECT
                model.navn as modelnavn,
                cykelhandlere.navn as forhandlernavn,
                koen.navn as koennavn,
                maerke.navn as maerkenavn,
                cykler.pris as pris
            FROM
                cykler
                JOIN model        ON model.id        = cykler.modelid
                JOIN maerke        ON maerke.id        = model.maerkeid
                JOIN koen          ON koen.id          = cykler.koenid
                JOIN cykelhandlere ON cykelhandlere.id = cykler.forhandlerid
            WHERE
                  cykler.koenid=". $row['koen'] ."
              AND cykler.modelid=". $row['modelid'] ."
              AND cykler.forhandlerid=". $row['forhandlerid'] ."
            ORDER BY model.navn ASC") or die(mysql_error());
Avatar billede Slettet bruger
01. december 2004 - 13:37 #16
men ville det ikke være smart at lægge den her query sammen med den i while løkken: "SELECT * FROM cykler"
Avatar billede Slettet bruger
01. december 2004 - 13:41 #17
jeg tror at jeg har været alt for hurtigt ude..

jeg vil gerne have udskrevet alle mine cykler... så behøver jeg vil overhovedet ikke nogle where gør jeg?

det er første gang jeg har brugt join, derfor er jeg ret lost :/
Avatar billede jakoba Nybegynder
01. december 2004 - 13:42 #18
NEJ NEJ NEJ.
JOIN kombinerer flere tabeller sammen til een stor tabel efter bevidste regler (betingelsen efter on) tænk på en lynlås der samler to stykker tøj.

med bare ',' laves der godtnok også en stor tabel, men den består af alle kombinationer af alle rækker i alle tabeller

eksempel
tabel: a
felter  a1  a2
row1    0  'x'
row2    1  'y'

tabel:
row1 
row2    1  'olsen'

med  FROM a JOIN b ON a.a1=b.b1
felter  a1  a2  b1  b2
row1    0  'x'  0  'hansen'
row2    1  'y'  1  'olsen'

med  FROM a, b  bliver den samlede tabel:
felter  a1  a2  b1  b2
row1    0  'x'  0  'hansen'
row2    0  'x'  1  'olsen'
row3    1  'y'  0  'hansen'
row4    1  'y'  1  'olsen'

med kun 2 rækker i hver tabel er forskellen ikke så stor. men med fx 1000 rækker i hver ville det komme 1000 * 1000 rækker i den joinede tabel. det kan mærkes.

Når TDC laver queries ind i deres abbonentdatabase kan jeg godt love dig de er omhyggelige med at joine fornuftigt :-))

mvh JakobA
Avatar billede Slettet bruger
01. december 2004 - 13:44 #19
så er det jo join jeg skal bruge.. den er jo genial!!!!
:D
Avatar billede Slettet bruger
01. december 2004 - 13:50 #20
med hensyn til min post kl. 13.41.03  http://www.eksperten.dk/spm/566704#rid5140497

ved du der hvad jeg kan gøre?
Avatar billede jakoba Nybegynder
01. december 2004 - 13:55 #21
helt enig i at det er bedre  aat slå de 2 queries sammen til en (fjerne where betingelserne)

Og i at det er genialt :-))  det hedder en relationsdatabase.

Næe, ikke andet end checke stavefejl, og så checke at data i tabellerne wirkelig er som du tror.
Avatar billede Slettet bruger
01. december 2004 - 13:55 #22
jeg tror at det virker nu :D:D:D
http://pastebin.com/125189
Avatar billede Slettet bruger
01. december 2004 - 13:56 #23
bare smid et svar.. forhøjer lige til 100 point :D
Avatar billede Slettet bruger
01. december 2004 - 13:57 #24
hov.. du kan forresten heller ik se siden på det link jeg gav dig, det er på admin siden.. sry
Avatar billede jakoba Nybegynder
01. december 2004 - 14:12 #25
mange tak
Avatar billede Slettet bruger
01. december 2004 - 14:13 #26
hvis du har lyst, må du godt tage et kig forbi http://www.eksperten.dk/spm/566680
Avatar billede Slettet bruger
01. december 2004 - 14:13 #27
velbekomme
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