Avatar billede hrole Mester
22. januar 2010 - 12:57 Der er 30 kommentarer og
1 løsning

Problem med to dropdown menuer hvor oplysningerne trækkes fra mysql

Hej,

Jeg har to forms på en side hvor jeg trækker oplysningerne til en dropdown menu i hver form fra en database med følgende script.
Problemet er at oplysningerne fra database udtrækket kun vises i den første form. Hvis jeg inaktivere scriptet i første form, med /**/, vises dropdown menuen fint i den anden form.
Jeg kan ikke se hvad jeg overser - kan I hjælpe?

<?php    require_once('../../Connections/con_a.php');
                                    $query_f_s = mysql_query("SELECT `id` FROM tabel WHERE status = 'a'");
                                    while ($row = mysql_fetch_array($query_f_s)) {
                                    $id = $row['id'];
                                    require_once('../../Connections/con_b.php');
                                    $query_f_s2 = mysql_query("SELECT * FROM tabel WHERE (id = '$id' AND tabel2 = 'tekst')");
                                    while ($row = mysql_fetch_row($query_f_s2)) {
                                        echo '<option value="'.$row[0].'"';
                                        if ($row[0] == $_GET['soeg'])
                                            {
                                                echo ' selected="selected"';
                                            }
                                        echo '>'.$row[4].' '.$row[2].' '.$row[5].' '.$row[3].'</option>'."\n";
                                    }
                                    } ?>
Avatar billede showsource Seniormester
22. januar 2010 - 13:37 #1
Vil du hente fra to tabeller eller hvad ?
Avatar billede hrole Mester
22. januar 2010 - 13:45 #2
ja. Den første query henter id fra en db, som benyttes i query nr. to til at hente oplysningerne fra en anden db (og tabel).
Avatar billede showsource Seniormester
22. januar 2010 - 13:57 #3
SELECT t1.id, t2.* FROM tabel as t1, tabel2 as t2
WHERE t1.id = t2.id
AND
t1.status = 'a'
AND
t2.hvadhedderditfelt = 'tekst'

Skule vist virke.
Kan også gøres med noget JOIN men det kan jeg ikke lige "ryste" ud.

Men måske

SELECT * FROM tabel2
JOIN tabel ON tabel.id = tabel2.id
WHERE
tabel.status = 'a'
AND
tabel2.hvadhedderditfelt = 'tekst'
Avatar billede hrole Mester
22. januar 2010 - 14:03 #4
tak for dit bud, men jeg er egentlig mere interesseret i hvorfor scriptet opfører sig som det gør og hvorfor det ikke fungerer.
Avatar billede showsource Seniormester
22. januar 2010 - 14:11 #5
Hvis du højreklikker på og bruger "vis kilde" kan du ofte se hvad som går galt.
Et hurtigt bud er at du bruger "tabel2" som et kolonne navn i tabel i din anden query
Avatar billede showsource Seniormester
22. januar 2010 - 14:12 #6
Du kan jo sætte en or die (mysql_error()) i enden af query, til at få vist fejl i query
Avatar billede hrole Mester
22. januar 2010 - 14:45 #7
Du har fuldstændig ret, jeg bruger "tabel2" som kolonne navn i tabel i anden query. Det var jeg ikke klar over var et problem.
Med mit oprindelige script er fejlmeddelelsen:
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Er der andre måder at løse problemet på udover dit forslag i #3?
Avatar billede hrole Mester
22. januar 2010 - 14:58 #8
og jeg får samme fejlmeddelelse med dit forslag i #3. Bemærk at oplysningerne hentes fra TO forskellige databaser.
Avatar billede showsource Seniormester
22. januar 2010 - 15:43 #9
To forskellige brugere ?
De har garanteret IKKE adgang til hinandens databaser.
Avatar billede showsource Seniormester
22. januar 2010 - 15:51 #10
Altså, så skal du stadig hente fra en db, og dernæst lave forespørgsler til den anden db.
Og så ville jeg gøre så'n:

<?php
    require_once('../../Connections/con_a.php');
    $query_f_s = mysql_query("SELECT id FROM tabel WHERE status = 'a'") or die (mysql_error());

$ref = array();

        while ($row = mysql_fetch_array($query_f_s)) {
        $ref = $row['id'];
        }

    mysql_close();

$next = "SELECT * FROM tabel2
        WHERE id
        IN (".implode(",", $ref.")
        AND
        ditnavnpåfelt = 'tekst'";

    require_once('../../Connections/con_b.php');

    $query_f_s2 = mysql_query($next) or die (mysql_error());

// resten af script .................
Avatar billede hrole Mester
22. januar 2010 - 16:08 #11
Præcis. Dog driller linien:
IN (".implode(",", $ref.")
Avatar billede showsource Seniormester
22. januar 2010 - 16:21 #12
Ja, hov

(".implode(",", $ref).")
Avatar billede showsource Seniormester
22. januar 2010 - 16:22 #13
Og jeg går ud fra at det er et tal som der skal sammenlignes med ved hentning.
Avatar billede hrole Mester
22. januar 2010 - 16:40 #14
Det er tal og jeg kan se logikken i dit forslag, men der er noget der driller.

Hvis jeg køre en:
echo $next;

får jeg:
SELECT * FROM tabel2 WHERE id IN () AND ditnavnpåfelt = 'tekst'

mens en echo $ref, giver relevant idnr.
Avatar billede dkfire Nybegynder
22. januar 2010 - 16:58 #15
Hvis jeg lige må tillade at kommentere lidt på dit første spørgsmål.

For at kunne bruge to mySQL databaser samtidig, bliver du nød til at angive hvilken forbindelse du vil bruge til dine query's.
http://dk2.php.net/mysql_query
Ved at angive en ressource som anden parameter, fortæller du mysql funktionen hvilken forbindelse den skal bruge, altså hvilken database.

Angående sidste spørgsmål, så prøv:
$next = "SELECT * FROM tabel2
        WHERE id
        IN (".implode(',',$ref).")
        AND
        ditnavnpåfelt = 'tekst'";

Ellers må du vise hvordan din kode ser ud. ( Altså den du tester som fejler )
Avatar billede hrole Mester
22. januar 2010 - 17:54 #16
dkfire: det troede jeg egentlig også jeg gjorde da jeg først har:
require_once('../../Connections/con_a.php');
og herefter:
require_once('../../Connections/con_b.php');
som henviser til
<?php
include ("ingenforbindelse.php");
mysql_connect("XXX", "YYY", "afskrift") or die($fejl);
mysql_select_db("ZZZ") or die($fejl);
?>
Hvor ZZZ er forskellig for con_a og con_b.

Den nye kode er:
<table><tr>
<td>Valg:</td>
<td><select name="valg" id="valg" >
<?php
require_once('../../Connections/con_a.php');
$query_f_s = mysql_query("SELECT id FROM tabel WHERE status = 'a'");
$ref = array();
while ($row = mysql_fetch_array($query_f_s)) {
$ref = $row['id']; }
mysql_close();
$next = "SELECT * FROM tabel2 WHERE id IN (".implode(',',$ref).") AND ditnavnpåfelt = 'tekst'";
require_once('../../Connections/con_b.php');
$query_f_s2 = mysql_query($next);
while ($row = mysql_fetch_row($query_f_s2)) {
echo '<option value="'.$row[0].'"';
if ($row[0] == $_GET['soeg'])
{
echo ' selected="selected"';
}
echo '>'.$row[4].' '.$row[2].' '.$row[5].' '.$row[3].'</option>'."\n";
}
?>
</selected></td>
</tr>
</table>

og resultatet er en dropdownmenu uden indhold.
Avatar billede showsource Seniormester
22. januar 2010 - 22:47 #17
or die (mysql_error())
er din ven !!!

Og hvordan kan du få
"mens en echo $ref, giver relevant idnr." ?

echo $ref;

burde give "array" og ikke mere.
Avatar billede hrole Mester
22. januar 2010 - 23:30 #18
Ved at ændre $ref = $row['id']; } til $ref[] = $row['id']; } fungere scriptet, MEN samme problem opstår som beskrevet i mit første indlæg.
Hvis jeg har to forms på samme side og bruger scriptet en gang i hver form til at danne dropdownmenu, vises kun den første. Jeg vil lige tilføje at jeg har sat en mysql_close(); inden ?>.
Avatar billede hrole Mester
22. januar 2010 - 23:36 #19
or die (mysql_error()); giver ingen fejlmeddelelse.

Grunden til echo $ref gav idnr., var at [] manglede, nu giver den netop Array.
Avatar billede showsource Seniormester
22. januar 2010 - 23:37 #20
Ja, mine øjne er små lige nu !
$ref = $row['id'];
skal selvf. være
$ref[] = $row['id'];

Ellers er $ref jo blot en var for hvert nyt row i db, altså IKKE et array.

Og glem nu IKKE den:

or die (mysql_error())

bag på query !!!
Avatar billede showsource Seniormester
22. januar 2010 - 23:40 #21
well, så prøv at tjekke mysql_num_rows($query_f_s2)
Avatar billede showsource Seniormester
22. januar 2010 - 23:42 #22
$next = "SELECT * FROM tabel2 WHERE id IN (".implode(',',$ref).") AND ditnavnpåfelt = 'tekst'";

Prøv lige:

$next = "SELECT * FROM tabel2 WHERE id IN (".implode(",",$ref).") AND ditnavnpåfelt = 'tekst'";
Avatar billede hrole Mester
22. januar 2010 - 23:51 #23
Scriptet virker nu som nævnt i #18, men problemet er når scriptet kører i form nummer 2. Altså når samme script indsættes i en ny form på samme side til at danne en dropdownmenu. Her vises ingen resultater i dropdownmenuen.
Avatar billede hrole Mester
23. januar 2010 - 00:22 #24
Jeg bør nævne at variablerne i script nr. to er ændret, så jeg derfor fx ikke har to $next.
Avatar billede hrole Mester
23. januar 2010 - 00:28 #25
For overblikkets skyld kommer koden, hvor status = 'b' er ændret i dropdown nr. 2 for at få andet udtræk.

<table><tr>
<td>Valg:</td>
<td><select name="valg" id="valg" >
<?php
require_once('../../Connections/con_a.php');
$query_f_s = mysql_query("SELECT id FROM tabel WHERE status = 'a'");
$ref[] = array();
while ($row = mysql_fetch_array($query_f_s)) {
$ref = $row['id']; }
mysql_close();
$next = "SELECT * FROM tabel2 WHERE id IN (".implode(',',$ref).") AND ditnavnpåfelt = 'tekst'";
require_once('../../Connections/con_b.php');
$query_f_s2 = mysql_query($next);
while ($row = mysql_fetch_row($query_f_s2)) {
echo '<option value="'.$row[0].'"';
if ($row[0] == $_GET['soeg'])
{
echo ' selected="selected"';
}
echo '>'.$row[4].' '.$row[2].' '.$row[5].' '.$row[3].'</option>'."\n";
}
?>
</selected></td>
</tr>
</table>

<table><tr>
<td>Valg nr 2:</td>
<td><select name="valg 2" id="valg 2" >
<?php
require_once('../../Connections/con_a.php');
$query_f_s2 = mysql_query("SELECT id FROM tabel WHERE status = 'b'");
$ref2[] = array();
while ($row = mysql_fetch_array($query_f_s2)) {
$ref2 = $row['id']; }
mysql_close();
$next2 = "SELECT * FROM tabel2 WHERE id IN (".implode(',',$ref).") AND ditnavnpåfelt = 'tekst'";
require_once('../../Connections/con_b.php');
$query_f_s2b = mysql_query($next2);
while ($row = mysql_fetch_row($query_f_s2b)) {
echo '<option value="'.$row[0].'"';
if ($row[0] == $_GET['soeg'])
{
echo ' selected="selected"';
}
echo '>'.$row[4].' '.$row[2].' '.$row[5].' '.$row[3].'</option>'."\n";
}
?>
</selected></td>
</tr>
</table>
Avatar billede hrole Mester
23. januar 2010 - 01:50 #26
Problemet er løst ved at flytte al php koden udenfor tabel, så kun while løkken er i <td>. Hvis I vil se den endelige kode, så sig til.
Tak til showsource for at hjælpe på vej - smid svar.
Avatar billede showsource Seniormester
23. januar 2010 - 16:02 #27
Et svar.
Avatar billede dkfire Nybegynder
23. januar 2010 - 22:31 #28
At du forbinder til en mysql database to gange er ikke det samme som at php ved hvilken forbindelse den skal bruge til hvilken query.
Det er lige præcis derfor at der er yderligere en parameter både i mysql_select_db og mysql_query. Du bliver nød til at fortælle php hvilken forbindelse du vil bruge, hvis du vil have flere end en forbindelse åben.

Det kan gøres med:
[div]
<?php
include ("ingenforbindelse.php"); // hvad laver lige den ??
$conn1 = mysql_connect("XXX", "YYY", "***") or die($fejl);
mysql_select_db("ZZZ", $conn1) or die(mysql_error());

$conn2 = mysl_connect( ***, ***, ***);
mysql_select_db( "???", $conn2) or die(mysql_error());

$result1 = mysql_query("SELECT * FROM tabel1", $conn1) or die(mysql_error());
$result2 = mysqk_query("SELECT * FROM tabel2", $conn2) or die(mysql_error());
?>

Men hvis det bare handler om at vælge mellem flere forskellige databaser for samme bruger og på samme server, så behøver du ikke at oprette en ny forbindelse, du kan "bare" skifte mellem databaserne.
Avatar billede hrole Mester
23. januar 2010 - 23:31 #29
Tak for forklaringen.
include ("ingenforbindelse.php"); er blot $fejl = 'Der kunne ikke forbindes til databasen.';, så mysqlfejlmeddelelse ikke vises for de besøgende på siden. Men når jeg tester bruger jeg or die(mysql_error()); i stedet for or die($fejl);.

Hvis jeg har forskellige require_once('Connections/con_b.php');
som henviser til
<?php
include ("ingenforbindelse.php");
mysql_connect("XXX", "YYY", "afskrift") or die($fejl);
mysql_select_db("ZZZ") or die($fejl);
?>
og con_c.php henviser til en anden mysql_connect og mysql_connect_db på samme server med forskellig brugernavn og kodeord, og con_d.php henviser til... osv.

Har jeg forstået korrekt at jeg da fx kan gøre følgende:
require_once('Connections/con_b.php');
    while... {
          require_once('Connections/con_c.php');
              while... {
                    require_once('Connections/con_d.php');
              }
    }

kode...
require_once('Connections/con_c.php');
kode...
kode...
require_once('Connections/con_b.php');

Hvis jeg har forstået korrekt forstår jeg stadig ikke hvorfor mit oprindelige script ikke fungerer i form nr. to.
Avatar billede dkfire Nybegynder
24. januar 2010 - 12:56 #30
Du bør starte med at læse mit indlæg igennem!

Og Nej du skal ikke have nogen require_once i dine while løkker, det er rigtig dårlig programmering.

Hvis du vil have flere forbindelser åbne på samme tid bliver du nød til at fortælle hvilken forbindelse du vil bruge på hvilke tidspunkt.
Derfor SKAL du gemme forbindelsen i en variabel:
$CONN = mysql_connect( ???, ???, ???);

Dernæst skal du bruge henne variabel når du vil lave noget med din forbindelse, som at vælge en database eller lave en query:
mysql_select_db(???, $CONN);
og
mysql_query("SELECT ....", $CONN);
Avatar billede hrole Mester
25. januar 2010 - 00:03 #31
Ok, jeg er med på hvad du mener. Det virker også noget mere logisk, end den metode jeg benyttede (som i øvrigt er fra Larry Ullman's PHP and MySQL for Dynamic Web Sites: Visual QuickPro Guide).
Tak for forklaringen.
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