Avatar billede optur Novice
09. marts 2011 - 13:12 Der er 18 kommentarer og
1 løsning

problemer med at hente data fra mysql join

Jeg er i gang med en transportskade formular.

min database ser ud som følgende:

filer
  id
  value
  ordrenr

info
  id
  kundenavn
  telefonnummer
  emailadresse
  ordrenummer
  fragtkvit
  omfang
  emballage
  foreslag

jeg har følgende kode:

<?php
$id = $_GET['id'];
include('db_con.php');
?>

<body>
<table id="tableid" cellpadding="0" cellspacing="0">
<?php
echo $id;
$resultat = mysql_query("SELECT info.kundenavn, info.telefonnummer, info.emailadresse, info.ordrenummer, info.fragtkvit, info.omfang, info.emballage, info.foreslag filer.value, filer.ordrenr FROM filer, info WHERE filer.ordrenr = info.'$id'");
while ($raekke = mysql_fetch_array($resultat)) {
extract($raekke);
echo "<tr>";
echo "<td>".$ordrenummer."</td>";
echo '<td>'.$kundenavn.'</td>';
echo '<td>'.$telefonnummer.'</td>';
echo '</tr>';
echo '<tr>';
echo "<td colspan='3' class='trbody'></td>";
echo '</tr>';
}
?>
</table>
</body>


men får følgende fejl:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampplite\htdocs\transportskadeformular\post.php on line 16

og linje 16 er i min while løkke..  jeg er helt på bar bund her
Avatar billede michael_stim Ekspert
09. marts 2011 - 13:17 #1
Prøv denne:
$resultat = mysql_query("SELECT info.kundenavn, info.telefonnummer, info.emailadresse, info.ordrenummer, info.fragtkvit, info.omfang, info.emballage, info.foreslag filer.value, filer.ordrenr FROM filer, info WHERE filer.ordrenr = info.".$id);
Avatar billede optur Novice
09. marts 2011 - 13:34 #2
den kommer stadig med samme fejl
09. marts 2011 - 13:58 #3
Giver din query rent faktisk et resultat?  Jeg laegger maerke til at den kode du viser mangler et komma, "info.foreslag filer.value" i stedet for "info.foreslag, filer.value".  Proev i din query at tilfoeje "or die(mysql_error())" for at faa mysql til selv at fortaelle hvis der er noget galt med queryen.

Jeg foreslaar at proeve denne query:

$resultat = mysql_query("SELECT info.kundenavn, info.telefonnummer, info.emailadresse, info.ordrenummer, info.fragtkvit, info.omfang, info.emballage, info.foreslag, filer.value, filer.ordrenr FROM filer, info WHERE filer.ordrenr = info.'$id'")or die(mysql_error());
09. marts 2011 - 14:02 #4
..hvad jeg ville have tilfoejet er at mysql_query returnerer enten et resultat eller, hvis der ikke er noget resultat, false.  Fejlmeldingen tyder paa at vaerdien af $result er false.
Avatar billede optur Novice
09. marts 2011 - 14:07 #5
jeg får følgende meddelelse:
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 ''13'' at line 1
Avatar billede michael_stim Ekspert
09. marts 2011 - 14:09 #6
Hov,

WHERE filer.ordrenr = info.id AND info.id=".$id);
Avatar billede michael_stim Ekspert
09. marts 2011 - 14:13 #7
Eller:
WHERE filer.ordrenr = ".$id);

Afhængigt af hvad du vil.
Avatar billede optur Novice
09. marts 2011 - 14:13 #8
Den virker nu Micheal =D
Avatar billede optur Novice
09. marts 2011 - 14:18 #9
den sidste løsning du kom med henter alle data ud frem for den ene som skal bruges
09. marts 2011 - 14:57 #10
Din oprindelige fejlmelding i loekken skyldtes ikke fejl ved loekken men at din mysql forespoergsel ikke gav nogen vaerdi.

Nu giver forespoergslen vaerdi, saa den oprindelige fejlmelding forsvandt.  Nu skal du have forespoergslen til at give den rigtige vaerdi.

Din forespoergsel joiner to tabeller, filer og info.  Hvilket felt har de to tabeller faelles?  Jeg vil gaette paa ordrenr.  Saa hvor du siger "..FROM filer, info WHERE filer.ordrenr = info.$id.." skulld du have sagt "..FROM filer, info WHERE filer.ordrenr = info.ordrenr.."

Og saa vil du begraense udtraekket til en enkelt raekke baseret paa $_GET['id'] som du gemmer i $id.  Hvilken vaerdi i hvilken tabel svarer til $id?  Hvis tabellen info har en id og denne id med INT som datatype (og hvis du faar en integer ud af $_GET['id']) saa bliver queryen denne:

$result = mysql_query("SELECT info.kundenavn, ......... FROM filer, info WHERE filer.ordrenr = info.ordrene AND info.id = '$id'")or die(mysql_error());
Avatar billede optur Novice
09. marts 2011 - 15:01 #11
Nej for der er ingen ordernr i info, der køre den efter ID som er a_i. jeg har lavet det sådan at ordrenr i filer er det id som sættes i info.

Hvis det er kan jeg pakke det hele ned i en zip så du kan se selve koden med en sql dump.
09. marts 2011 - 15:37 #12
Lad os hellere proeve at bruge et par indlaeg til at snakke sagens gang igennem.  (Det her skulle jo gerne vaere hjaelp til selvhjaelp.)

Foerst et spoergsmaal:  Hvad reprenterer en raekke i tabellen info?  Representerer det en enkelt transportskade?  Du giver hver transportskade en id, og hver transportskade er for en kunde (med telefonnummer og email), og skaden er paa en fragt med en fragtkvittering, skaden havde et givet omfang, godset var i en emballage, og der foreligger et forslag til skadesgodtgoerlse?  Det lyder ligetil (hvis det er korrekt.)  Hvad staar der saa i info.ordrenummer?

Naeste spoergsmaal:  Hvad representerer en raekke i tabellen filer?  Er det saaledes at behandlingen af en skade genererer et antal filer og de filer bevarer du i tabellen filer?  Hvis tabellen filer indeholder filer for skaderne, hvordan ved du saa hvilke filer der hoerer til hvilke skader?  Svare filer.ordrenummer til info.id?  Eller hvad?

Tredje spoergsmaal:  Du laver en skadeformular som resulterer i et nummer der kommer til at staa i $_GET['id'].  Hvad svarer $_GET['id'] til?  Til en enkelt skade, nemlig den skade der i tabellen info har id lig med $_GET['id']? 

Fjerde spoergsmaal:  Hvilke oplysninger vil du saa have trukket ud af databasen?  Vil du have oplysningerne om skaden (kunde, fragtkvit, omfang, o.s.v.) samt alle filer der hoere til skaden?  Eller hvad?
Avatar billede optur Novice
09. marts 2011 - 15:50 #13
1: det der står i ordrenummer i info er det ordrenummer som kunden selv kan vælge at skrive ind (det nummer som eventuelt står på faktura), for at undgå at kunden taster fejl eller lignende så bruger vi id til at bestemme da den er fast og aldrig ens.

2: der bliver hver fil der bliver uploaded sat ind med filnavn. Og ud fra den id som er blevet sat i info bliver der så sat det id i ordrenr således at flere billeder kan følge en kunde. Så id i info svare til ordrenr i filer.

3: jeg benytter $_GET['id']; til at bestemme ud fra en view.php som jeg ikke har vist. koden for denne fil ses neden for.

det jeg har gjort er et database udtræk hvor min medarbejder kan vælge det ønskede ordrenummer som så tager den id med fra info som ordrenummeret et tilknyttet og sender det videres til post.php som er den fil vi har siddet og diskuteret.


<?php
include('db_con.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Transportskade</title>
<style type="text/css">
#tableid {
width:500px;
border:1px solid #3E754D;
}

.trhead {
background-color:#60b16f;
}

.trbody {
border-bottom:1px solid #3E754D;
}
</style>
</head>
<body>

<div id="container">
<div id="udtraek">
<table id="tableid" cellpadding="2" cellspacing="0">
<tr class="trhead">
<td>Ordrenummer</td>
<td>Kundenavn</td>
<td>Telefon nummer</td>
</tr>

<?php
$resultat = mysql_query("SELECT * FROM info");
while ($raekke = mysql_fetch_array($resultat)) {
extract($raekke);
echo "<tr>";
echo "<td><a href='post.php?id=".$id."'>".$ordrenummer."</a></td>";
echo '<td>'.$kundenavn.'</td>';
echo '<td>'.$telefonnummer.'</td>';
echo '</tr>';
echo '<tr>';
echo "<td colspan='3' class='trbody'></td>";
echo '</tr>';
}
?>
</table>
</div>
</div>
</body>
</html>
Avatar billede optur Novice
09. marts 2011 - 15:51 #14
4: view.php er en oversigt over alle ordrenumre og post.php er den detaljevisning hvor der køre en løkke med billederne under denne.

jeg kan poste vi færdige filer herinde når jeg har lavet dem.
09. marts 2011 - 17:17 #15
Vi kommer naermere.  Lad mig fortaelle i mine egne ord hvad jeg nu forstaar fra dine indlaeg, saa kan du rette mig hvis jeg tager fejl.

Altsaa:

1.  Hver raekke i tabellen info svarer til en skade, og skaden er unikt identificeret ved info.id.

2.  Til en skade kan der hoere mange filer.  Data over filerne bevares i tabellen filer, og filerne er linkede til skader derved at filer.ordernummer = info.id.

3.  Du vaelger i view.php en enkelt skade og sender skadens id til post.php hvor den ankommer som $_GET['id'] hvilket du gemmer i $id.  Du vil saa se de filer som hoerer til skaden.

Hvis det altsammen er korrekt, saa skal du i post.php vaelge de raekker i tabellen filer der svarer til skaden med info.id = $id og skrive de rigtige data ud.

Saa hvordan kombinerer du tabellen filer med tabellen info?  Fordi du siger at info.id svarer til filer.ordernr faar du alle vaerdierne saaledes:

SELECT * FROM info i JOIN filer f ON i.id = f.ordernr

Man kunne ogsaa havde sagt SELECT * FROM filer, info WHERE filer.ordernr = info.id.  Men jeg finder JOIN metoden langt nemmere at forstaa.  Yderligere giver jeg tabellerne korte navne for at undgaa at skulle gentage tabelnavnene.

Du vil ikke have alle vaerdierne, kun de der hoerer til skaden med id = $id, altsaa:

SELECT * FROM info i JOIN filer f ON i.id = f.ordernr WHERE i.id = $id

Hvis jeg indsaetter det i din kode fra dit oprindelige indlaeg faar jeg dette:

....
$result = mysql_query("SELECT i.kundenavn, i.telefonnummer, i.emailadresse, i.ordernummer, i.fragtkvit, info.omfang, i.emballage, i.foreslag, f.value, f.ordrenr FROM info i JOIN filer f ON i.il = f.ordernr WHERE i.id = $id")or die(mysql_error());
while .....

Det er muligt at din version af mysql ikke vil acceptere "WHERE i.id = $id" men foretraekker "WHERE i.id = '$id'"  I saa fald retter du det.

Saa (1) fortael mig om jeg har forstaaet problemet rigtigt og, hvis saa, (2) om min foreslaaede kode er til hjaelp.
09. marts 2011 - 17:19 #16
Det var ikke ment som svar endnu fordi jeg ikke ved om jeg har forstaaet problemet rigtigt, jeg fik trykket paa den forkerte knap.
Avatar billede optur Novice
09. marts 2011 - 17:36 #17
øhh det var meget meget forvirrende?? nogle gange bruger du i. andre gange info. og f. og filer. kan du ikke tage og skrive det korrekt uden forkortelser hist og pist? giver overhovedet ingen mening for mig desværre??

Men du har ret ind til nr 3.
09. marts 2011 - 18:06 #18
Du gad altsaa ikke engang svare paa om jeg havde forstaaet problemet rigtigt!  Og jeg har skrevet det korrekt, men du goer ikke den indsats at saette dig ind i det.

Det oprindelige spoergsmaal drejede sig om fejlmelding i din loekke.  Det svarede jeg paa: fejlmeldingen i loekken kom fordi din sql query var ukorrekt og ikke gav noget resultat.

Da du fik resultater ud af din query og det oprindelige problem derved blev loest var resultaterne ikke de tilsigtede.  Dette yderligere problem skulle du egenlig have oprettet et nyt spoergsmaal for, men jeg proevede (og mener selv at jeg gjorde en stor indsats) at hjaelpe dig til rette.

Jeg staar af her.  Du afgoer om du vil lukke spoergsmaalet paa baggrund af besvarelse af dit oprindelige spoergsmaal og saa oprette et nyt spoergsmaal for de videre problemer.  I saa fald boer du nok forklare problemet lidt tydeligere (og lade vaere med at komme med bemaerkninger som "kan du ikke lige tage og skrive det korrekt..".
Avatar billede optur Novice
09. marts 2011 - 20:01 #19
ok du begyndte på en lang smøre som jeg ikke fattede ret meget af.. jeg er rimelig meget noob og kan ikke forklare hvorfor tingene virker som det gør... det eneste jeg kan gøre er at poste den kode som virkede. Jeg forstå lang fra ret meget af hvad der sker, hvilket er det jeg så småt prøver på. Men da denne opgave var ret vigtig at få løst rimelig hurtigt så var det ikke helt nemt at skulle besvare.

Din måde at håndtere problemet på gjorde at jeg selv forstod nogle ting bedre, men i dit 3. svar/spørgsmål stod jeg helt af, for jeg forstod intet af koden. Derfor svarede jeg som jeg gjorde. Ikke for at være uhøflig, men fordi jeg slet ikke forstod hvad i. osv betød, jeg så ikke nogen deklaration af variablerne til i eller f og så fattede jeg intet..

Og jo da jeg fik mit problem løst i starten fik jeg de data ud som jeg skulle bruge. Og du valgte at køre videre i hvad jeg forstod som en måde for at forklare over for andre i detaljer hvad jeg havde gang i. Og det hjalp mig til at forstå en masse, men jeg er meget interesseret i at vide havde det var du havde gang i her til sidst?? for det fortod jeg desværre intet af.

Jeg er ked af du opfattede det som om at jeg stadig havde problemer, vi havde lige skudt forbi hinanden... jeg fandt en løsning i det som Micheal_stim postede. hvilket jeg også mener jeg skrev før du indledte =)

Men igen mange tak for den hjælp du har givet det har hjulpet mig til at forstå meget af det her. Og for det syntes jeg også du skal have de point =D
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