Avatar billede rasmus-madsen Nybegynder
24. oktober 2005 - 18:56 Der er 58 kommentarer og
2 løsninger

Select med IN.

Hej allesammen..

Bruger denne kode:
$id_er = "233,2051,973,384";
$res2 = mysql_query("SELECT * FROM cpg133_pictures WHERE PID IN ($id_er)") or die(mysql_error());

Men problemet er at den hente sådan her:
233,384,973,2051 (altså en anden rækkefølge)..
Men den skal tage efter denne :
$id_er = "233,2051,973,384";

Ved i hvad man kan gøre ved deT?

På forhånd tak.
Avatar billede jakobdo Ekspert
24. oktober 2005 - 19:01 #1
Er det ikke "bare" er spørgsmål om at ordre output korrekt?
Avatar billede rasmus-madsen Nybegynder
24. oktober 2005 - 19:02 #2
Nej ikke helt..

Det skal gøres der.
Avatar billede nielle Nybegynder
24. oktober 2005 - 19:02 #3
Databasen forsøger at optimer hastigheden ved at hente posterne på den mest økonomiske måde. Denne har - som du har erfaret - ikke noget at gøre med rækkefølgen i din IN. Hvis du skal have posterne ud i den givne rækkefølge, så er der vist ikke andet for end at dele den op i 4 separate SQL-sætninger - en hvor hvert pid.
Avatar billede rasmus-madsen Nybegynder
24. oktober 2005 - 19:03 #4
Så kommer der godt nok mange sql-sætninger så..
Har nemlig mange flere ider en det der...
Avatar billede nielle Nybegynder
24. oktober 2005 - 19:04 #5
Du har en anden mulighend - nemlig at hente posterne i den rækkefølge databasen fortrækker, placere dem i et array undervejs, og så tilsidst at sortere dette array efter dine pid'er.
Avatar billede pidgeot Nybegynder
24. oktober 2005 - 19:04 #6
Den henter i den rækkefølge fordi det er den rækkefølge de ligger i. Det kan du ikke umiddelbart gøre noget ved, med mindre du kan opnå samme rækkefølge ved at sortere på et andet felt.

Ellers skal du ud i at sammensætte en masse queries med UNION, hvor hver del kun returnerer en enkelt række - ikke nogen sjov løsning hvis der kan være et varierende antal elementer.

Du kan selvfølgelig også sortere uden om MySQL ved at hive alle rækker ud i et array, og skrive en funktion til at sortere - læs op på funktionen usort, den viser dig hvor meget der i så fald skulle laves.
Avatar billede nielle Nybegynder
24. oktober 2005 - 19:06 #7
Dette har imidlertid den ulempe at det kræver mere RAM og og flere CPU-resourcer. Specielt hvis vi snakker om mange pid'er.
Avatar billede rasmus-madsen Nybegynder
24. oktober 2005 - 19:06 #8
Hmm okay..
Har i et lille ekspempel med sortering..
Er nemlig ikke helt med hvad i mener :S
Avatar billede nielle Nybegynder
24. oktober 2005 - 19:16 #9
Jeg ville nu ikke bruge usort, men snare noget i denne stil:

$id_er = "233,2051,973,384";
$query = mysql_query("SELECT pid, a, b, c FROM cpg133_pictures WHERE PID IN (" . $id_er . ")") or die(mysql_error());

$values = array();
while ($row = myssql_fetch_assoc($query)
{
    $values[row["pid"]] = $row["a"] . ", " . $row["b"] . ", " . $row["c"];
}

$id_er_arr = explode(",", $id_er);
foreach ($id_er_arr as $id)
{
    if (array_key_exists($id, $values))
    {
        echo $id . " = " . $values[$id] . "<br>";
    }
}
Avatar billede rasmus-madsen Nybegynder
24. oktober 2005 - 19:37 #10
Den ikke få den til at virke..
Min hotel viser desværre ikke fejl koder :@ ...

Mangler der noget i den..
Avatar billede nielle Nybegynder
24. oktober 2005 - 19:40 #11
Du skal selvfølgelig rette a, b og c til de feltnavne der gælder i dit tilfælde. Udover det, så kan jeg ikke lige identifisere nogen fejlkilder. :^|
Avatar billede rasmus-madsen Nybegynder
24. oktober 2005 - 19:42 #12
<?
  @mysql_connect("localhost","AAAAAAAAAA","AAAAAA")
          or die( mysql_error() );
mysql_select_db("electro_hide_dk");

$id_er = "233,2051,973,384";
$query = mysql_query("SELECT pid, filename FROM cpg133_pictures WHERE PID IN (" . $id_er . ")") or die(mysql_error());

$values = array();
while ($row = myssql_fetch_assoc($query)
{
    $values[row["pid"]] = $row["pid"] . ", " . $row["filename"];
}

$id_er_arr = explode(",", $id_er);
foreach ($id_er_arr as $id)
{
    if (array_key_exists($id, $values))
    {
        echo $id . " = " . $values[$id] . "<br>";
    }
}
echo mysql_error();

?>

er det helt ved siden af :S
Avatar billede nielle Nybegynder
24. oktober 2005 - 19:44 #13
Næ, det ser sån' set ok ud :^)
Avatar billede rasmus-madsen Nybegynder
24. oktober 2005 - 19:46 #14
hmm nederen..
Avatar billede nielle Nybegynder
24. oktober 2005 - 19:49 #15
Prøv om du ikke selv kan slå udskrift af fejl til med error_reporting():

http://dk.php.net/manual/da/function.error-reporting.php
Avatar billede jgivoni Nybegynder
24. oktober 2005 - 20:18 #16
$id_er = "233,2051,973,384";
$query = mysql_query("SELECT * FROM cpg133_pictures WHERE PID IN ($id_er)") or die(mysql_error());

$id_er = explode(",", $id_er);
$values = array();
while ($row = myssql_fetch_assoc($query))
    {
    $values[array_search($row["pid"],$id_er)] = $row;
    }

og så er det bare at skrive dem ud eller hvad du nu har lyst til
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 17:52 #17
Jeg kan virkelig få det til at virker :S ...

Men har fundet en anden ide. Håber i kan hjælpe med den.

$id_er = "233,2051,973,384";
$navn = "madsen,thomas,patrick,stanek";

(madsen er id 233, thomas er 2051 osv..)

Så køre loppet så
$billede[madsen] = $row['data']
$billede[thomas] = $row['data']

Kan vi deT?

På forhånd tak-
Avatar billede nielle Nybegynder
25. oktober 2005 - 18:01 #18
Har du prøvet med 24/10-2005 19:49:07 endnu? Uden fejlmeddelelser er det ofte temmeligt svært at lave noget fornuftig debugging.
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 18:02 #19
Ja har prøvet det...
Ved ikke hvad der sker for lorte hotel :@ .. Den viser ikke fejl.
Avatar billede nielle Nybegynder
25. oktober 2005 - 18:03 #20
Prøv at vise os din kode.
Avatar billede pidgeot Nybegynder
25. oktober 2005 - 18:04 #21
Problemet lader til at være at det kode der er blevet postet her har en stavefejl - myssql_fetch_array i stedet for mysql_fetch_array.
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 18:06 #22
<?
  @mysql_connect("localhost","AAAAAAAAAA","AAAAAA")
          or die( mysql_error() );
mysql_select_db("electro_hide_dk");

$id_er = "233,2051,973,384";
$query = mysql_query("SELECT pid, filename FROM cpg133_pictures WHERE PID IN (" . $id_er . ")") or die(mysql_error());

$values = array();
while ($row = myssql_fetch_assoc($query)
{
    $values[row["pid"]] = $row["pid"] . ", " . $row["filename"];
}

$id_er_arr = explode(",", $id_er);
foreach ($id_er_arr as $id)
{
    if (array_key_exists($id, $values))
    {
        echo $id . " = " . $values[$id] . "<br>";
    }
}
echo mysql_error();

?>

Det faktisk nøjagtigt denne kode jeg prøver at kører.
Avatar billede nielle Nybegynder
25. oktober 2005 - 18:10 #23
pidgeot> Godt spottet :^)

rasmus-madsen> I den kode prøver du jo ikke at sætte fejludskrivning til vai error_reporting()?
Avatar billede pidgeot Nybegynder
25. oktober 2005 - 18:11 #24
Okay, så stod der myssql_fetch_assoc, ikke myssql_fetch_array - men begge ting er under alle omstændigheder forkerte, der er et s for meget i myssql-delen - der skal i stedet stå mysql.
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 18:14 #25
pageheader($lang_search_php[0]);
$id_er = "233,2051,973,384";
$query = mysql_query("SELECT pid, filename FROM cpg133_pictures WHERE PID IN (" . $id_er . ")") or die(mysql_error());

$values = array();
while ($row = mysql_fetch_assoc($query)
{
    $values[row["pid"]] = $row["pid"] . ", " . $row["filename"];
}

$id_er_arr = explode(",", $id_er);
foreach ($id_er_arr as $id)
{
    if (array_key_exists($id, $values))
    {
        echo $id . " = " . $values[$id] . "<br>";
    }
}
echo mysql_error();
echo error_reporting();

Stadig intet.. Måske skulle jeg prøve på et andet hotel.. Men skal lige hjem først så.
Avatar billede nielle Nybegynder
25. oktober 2005 - 18:17 #26
Du bruger error_reporting() forkert. Den skal op i starten af din kode og så skal den have et argument som angiver hvor meget der skal skrives ud.
Avatar billede nielle Nybegynder
25. oktober 2005 - 18:17 #27
F.eks.:

error_reporting(E_ALL);
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 18:57 #28
Fejlen er i denne linje :
    $values[row["pid"]] = $row["pid"] . ", " . $row["filename"];

Med denne fejl:
Parse error: parse error, unexpected '[', expecting ']' in /home/www/web82/html/test/hvem3.php on line 33
Avatar billede nielle Nybegynder
25. oktober 2005 - 19:01 #29
Peøv ar retet til:

$values[$row["pid"]]
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 19:04 #30
Det er gjordt nu.. Men stadig noget som er galt..

Er lige ved at kigge.. Skriver hvis jeg ikke lig finder den :D
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 19:06 #31
Så... Nu udskriver den:
233 = 233, IMG_1506.JPG
2051 = 2051, p 140.jpg
973 = 973, IMG_2320.JPG
384 = 384, IMG_2093.JPG
2039
Avatar billede nielle Nybegynder
25. oktober 2005 - 19:10 #32
Uheldigt filnavn du har der: "p 140.jpg".
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 19:13 #33
Ja den er lidt.. Men det går..

Men har et andet problem. Hvis du vil hjælpe mig ?
Avatar billede nielle Nybegynder
25. oktober 2005 - 19:26 #34
Sig frem?
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 19:29 #35
HAr denne kode:


$i=1;
$i2=1;
$values = array();
while ($row = mysql_fetch_assoc($query))
{
$Billedes[$i2] = "albums/" .$row['filepath'] ."thumb_" .$row['filename'];
$Album[$i2] = $row['aid'];
$Pid[$i2] = $row['pid'];
$pw[$i2] = $row['pwidth'];
$ph[$i2] = $row['pheight'];
$i2++;
}

$id_er_arr = explode(",", $id_er);
foreach ($id_er_arr as $id)
{
    if (array_key_exists($id, $values))
    {
echo $Billedes[$i];

//der kommer mere her der skal bruge de andre variabler...
        $i++;
    }

Kører denne kode her.

Den skulle egentlig udskrive 4 stier men det gør den ikke :@..
Ingen fejl.. Loader bare siden.
Avatar billede nielle Nybegynder
25. oktober 2005 - 19:35 #36
Da du lægger stierne i $Billedes[$i2] med indeksene 1, 2, 3 og 4 så nytter det ukke noget at du forsøger at hente dem ud igen med dine pid'er. Så skal de jo hentes ud igen med 1, 2, 3 og 4.
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 19:40 #37
Så du mener det skal være noget lignede:
$values = array();
while ($row = mysql_fetch_assoc($query))
{
$Billedes = "albums/" .$row['filepath'] ."thumb_" .$row['filename'] .",";
$Album .= $row['aid'] .",";
$Pid .= $row['pid'] .",";
$pw .= $row['pwidth'] .",";
$ph .=$row['pheight'] .",";
}

$id_er_arr = explode(",", $id_er);
$$Billedes = explode(",", $Billedes);
foreach ($id_er_arr as $id)
{
    if (array_key_exists($id, $values))
    {
echo $Billedes[$i];
        $i++;

Men det virker hellere ikke :S
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 19:42 #38
$Billedes = explode(",", $Billedes);
Avatar billede nielle Nybegynder
25. oktober 2005 - 19:44 #39
Nej, hvis du laver din while-løkke på den måde så overskriver hvert loop jo reultatet fra det forrige.

Det jeg menere er at når du lægger i med index 1, 2, 3 så skal de også hentes ud igen på samme måde:

$i=1;
$i2=1;
$values = array();
while ($row = mysql_fetch_assoc($query))
{
    $Billedes[$i2] = "albums/" .$row['filepath'] ."thumb_" .$row['filename'];
    $Album[$i2] = $row['aid'];
    $Pid[$i2] = $row['pid'];
    $pw[$i2] = $row['pwidth'];
    $ph[$i2] = $row['pheight'];
    $i2++;
}

for ($i3=1; $i3<$i2; $i3++)
{
    echo $Billedes[$i3];
    //der kommer mere her der skal bruge de andre variabler...
}
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 19:46 #40
Super det virker jo :D
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 19:48 #41
Men række følgen er stadig den samme som da vi startede :(
Avatar billede nielle Nybegynder
25. oktober 2005 - 19:50 #42
Ja, for du lægger jo elementerne i dit array sådan som de kommer ud af databasen. Det var jo derfor at vi lavede den kode som gav resultatet i 25/10-2005 19:06:45 - men den går du jo væk fra igen i dit eksempel 25/10-2005 19:40:31?
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 19:52 #43
Okay.. Er helt forvirret nu..
Avatar billede nielle Nybegynder
25. oktober 2005 - 19:56 #44
I din løkke - 25/10-2005 19:40:31 - lægger di de enkelte poster ind i dine arrays på pladserne 1, 2, 3, 4 osv. I koden 25/10-2005 18:14:27 bliver de i stedet lagt ind på pladserne 233, 2051, 973, 384 og det er den væsentlige forskel.
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 20:00 #45
Ja men så kan jeg ikke finde ud af det..
Prøver lig engang.
Avatar billede nielle Nybegynder
25. oktober 2005 - 20:00 #46
Jeg vil umiddelbart tro at din kode skal se sådan her ud:

pageheader($lang_search_php[0]);

$pid_er = "233,2051,973,384";
$query = mysql_query("SELECT pid, filename FROM cpg133_pictures WHERE PID IN (" . $pid_er . ")") or die(mysql_error());

$Billedes = array();
$Album = array();
$pw = array();
$ph = array();

while ($row = mysql_fetch_assoc($query)
{
    $pid = $row["pid"];

    $Billedes[$pid] = "albums/" . $row['filepath'] . "thumb_" . $row['filename'];
    $Album[$pid] = $row['aid'];
    $pw[$pid] = $row['pwidth'];
    $ph[$pid] = $row['pheight'];
}

$pid_er_arr = explode(",", $pid_er);
foreach ($pid_er_arr as $pid)
{
    if (array_key_exists($pid, $Billedes))
    {
        echo $Billedes[$pid];
    }
}
Avatar billede nielle Nybegynder
25. oktober 2005 - 20:04 #47
while ($row = mysql_fetch_assoc($query))
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 20:05 #48
SUPER det virker :D
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 20:16 #49
Har lige et spm mere.. Så skal jeg nok lade dig være :D..

Har brug for Pid som kolonen hedder i databasen.:
$query = mysql_query("SELECT pid, filename, filepath, pwidth, pheight FROM cpg133_pictures WHERE PID IN (" . $pid_er . ")") or die(mysql_error());

$Billedes = array();
$Album = array();
$pw = array();
$ph = array();
$id2 = array();

while ($row = mysql_fetch_assoc($query))
{
    $id2[$pid] = $row["pid"];
    $Billedes[$pid] = "albums/" . $row['filepath'] . "thumb_" . $row['filename'];
    $Album[$pid] = $row['aid'];
    $pw[$pid] = $row['pwidth'];
    $ph[$pid] = $row['pheight'];
}

$pid_er_arr = explode(",", $pid_er);
$i=1;
foreach ($pid_er_arr as $pid)
{
    if (array_key_exists($pid, $Billedes, $id2))
    {
Echo $id2[$pid];
$i++;
    }

Men det er blankt :S . . Hvad gør jeg forkerT?
}
Avatar billede nielle Nybegynder
25. oktober 2005 - 20:21 #50
Det er jo så smart at pid-feltet netop hedder $pid:

$query = mysql_query("SELECT pid, filename, filepath, pwidth, pheight FROM cpg133_pictures WHERE PID IN (" . $pid_er . ")") or die(mysql_error());

$Billedes = array();
$Album = array();
$pw = array();
$ph = array();

while ($row = mysql_fetch_assoc($query))
{
    $Billedes[$pid] = "albums/" . $row['filepath'] . "thumb_" . $row['filename'];
    $Album[$pid] = $row['aid'];
    $pw[$pid] = $row['pwidth'];
    $ph[$pid] = $row['pheight'];
}

$pid_er_arr = explode(",", $pid_er);
foreach ($pid_er_arr as $pid)
{
    if (array_key_exists($pid, $Billedes, $id2))
    {
        echo $pid;
    }
}
Avatar billede nielle Nybegynder
25. oktober 2005 - 20:21 #51
$query = mysql_query("SELECT pid, filename, filepath, pwidth, pheight FROM cpg133_pictures WHERE PID IN (" . $pid_er . ")") or die(mysql_error());

$Billedes = array();
$Album = array();
$pw = array();
$ph = array();

while ($row = mysql_fetch_assoc($query))
{
    $Billedes[$pid] = "albums/" . $row['filepath'] . "thumb_" . $row['filename'];
    $Album[$pid] = $row['aid'];
    $pw[$pid] = $row['pwidth'];
    $ph[$pid] = $row['pheight'];
}

$pid_er_arr = explode(",", $pid_er);
foreach ($pid_er_arr as $pid)
{
    if (array_key_exists($pid, $Billedes))
    {
        echo $pid;
    }
}
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 20:26 #52
Ja men den er stadig blank :s ..

Den udskriver ikke pid. Har lige prøvet.
Avatar billede nielle Nybegynder
25. oktober 2005 - 20:28 #53
$query = mysql_query("SELECT pid, filename, filepath, pwidth, pheight FROM cpg133_pictures WHERE PID IN (" . $pid_er . ")") or die(mysql_error());

$Billedes = array();
$Album = array();
$pw = array();
$ph = array();

while ($row = mysql_fetch_assoc($query))
{
    $pid = $row["pid"];

    $Billedes[$pid] = "albums/" . $row['filepath'] . "thumb_" . $row['filename'];
    $Album[$pid] = $row['aid'];
    $pw[$pid] = $row['pwidth'];
    $ph[$pid] = $row['pheight'];
}

$pid_er_arr = explode(",", $pid_er);
foreach ($pid_er_arr as $pid)
{
    if (array_key_exists($pid, $Billedes, $id2))
    {
        echo $pid;
    }
}
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 20:30 #54
Bliver du sur, hvis jeg siger den stadig ikke udskriveR=
Avatar billede nielle Nybegynder
25. oktober 2005 - 20:32 #55
Hvorfor skulle jeg blive sur?

if (array_key_exists($pid, $Billedes))
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 20:33 #56
over jeg spørger om så meget ;) ..

Det virker :D
Avatar billede nielle Nybegynder
25. oktober 2005 - 20:38 #57
Jeg var godt klar over hvad du mente - men hvis du ikke skulle have lov til at spørge på Eksperten, hvad er den så beregnet til? ;^)
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 20:43 #58
hehe Takker..

Er lidt i tvivl med point delign..
Ham jgivoni svaret også..
Avatar billede nielle Nybegynder
25. oktober 2005 - 20:48 #59
Svar :^)
Avatar billede rasmus-madsen Nybegynder
25. oktober 2005 - 22:51 #60
Håber det okay..

Og tusind tak for hjælpen.
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