Avatar billede duqe Nybegynder
15. juli 2008 - 12:49 Der er 26 kommentarer og
1 løsning

Forkorte mysql_query

Hej

Har en mysql_query hvor linjen bliver uhyggelig lang:
mysql_query("SELECT * FROM sammenlign WHERE id='$id109' || id='$id110' || id='$111' || id='$112' || id='$113'");

- Fortsætter helt op til id150

Er der en måde jeg kan forkorte linjen på, så jeg ikke skal sidde og indtaste alle id-numre hele vejen op til nummer 150?

På forhånd tak :)
Avatar billede jakobdo Ekspert
15. juli 2008 - 12:50 #1
WHERE id between $id109 AND $id150
Avatar billede pidgeot Nybegynder
15. juli 2008 - 12:51 #2
Hvis den skal skrive statisk: mysql_query("SELECT * FROM sammenlign WHERE id IN ('$id109','$id110','$111','$112','$113')");

Ellers kan du bygge din SQL-sætning op dynamisk i et lopp eller lign.
Avatar billede pidgeot Nybegynder
15. juli 2008 - 12:54 #3
Jakobdo's løsning fungerer hvis du i virkeligheden mente selve tallene (eller de i øvrigt er direkte sekventielle). Hvis det er variable, og indholdet kan være mere eller mindre tilfældigt (dvs. ingen garanti for rækkefølge eller at de følger lige efter hinanden i tabellen), så skal du ud i en IN hvis det skal være kortere.
Avatar billede duqe Nybegynder
15. juli 2008 - 12:54 #4
Tak - smider du svar? :)
Avatar billede pidgeot Nybegynder
15. juli 2008 - 12:59 #5
Hvem - mig eller jakobdo?
Avatar billede duqe Nybegynder
15. juli 2008 - 13:00 #6
pidgeot >
"Ellers kan du bygge din SQL-sætning op dynamisk i et lopp eller lign."

Hvordan gør man det? Jeg vil meget nødig indtaste alle id, da der hele tiden bliver tilføjet nye (udover de 109 -> 150)
Avatar billede duqe Nybegynder
15. juli 2008 - 13:02 #7
Tallene er ikke direkte sekventielle, da kun 4 af dem bliver brugt. (helt tilfældigt hvilke)
Avatar billede pidgeot Nybegynder
15. juli 2008 - 13:10 #8
Nu mente jeg i forhold til det du sender med - hvis nu f.eks. $id109 kan være 52, $id110 er 51, og $id150 er 55, så vil $id110 ikke blive overvejet.

Igen, det forudsætter der er tale om *variable*, og ikke bare tal.

Hvad loopet angår: Nu vælger jeg lige at gå ud fra at der er tale om variable med det navn, og det af en eller anden grund ikke er muligt at smide det i et array.

(utestet, men princippet skulle være mere eller mindre til at gennemskue)

$start=109;
$max=150;
$sql='SELECT * FROM sammenlign WHERE id IN (';
for ($i=$start; $i<=$max; $i++)
{
  if ($i != $start)
    $sql .= ',';
  $sql .="'" . ${'id'.$i} . "'"; //tager variablen "$id" efterfulgt af $i, eks. $id109, $id110, etc.
}
$sql.=')';

Det ville være lidt nemmere at arbejde med hvis det enten var et array, eller det er egentlige *tal* der menes (og ikke variable).
Avatar billede jakobdo Ekspert
15. juli 2008 - 13:11 #9
Det med et loop eller løkke, afhænger af hvordan dine id'er bliver lavet i første omgang.
Avatar billede duqe Nybegynder
15. juli 2008 - 13:21 #10
Jeg har en liste hvor man kan krydse 4 titler af (checkbox). De checkboxe bliver navngivet efter hvilket id og hvilken titel der står ud for checkbox.

<input type=checkbox name=".$array['id'].">".$array['titel']."

Og mysql_query linjen skal så finde de 4 id numre der bliver valgt.
- Hvilket jeg gjorde på en noget besværlig måde:

if($_POST['109']){ $id109 = "109"; } else { $109 = ""; }
mysql_query("SELECT * FROM sammenlign WHERE id='$id109'");

(for hvert id-nummer)
Avatar billede pidgeot Nybegynder
15. juli 2008 - 13:32 #11
I stedet for at lave separate variable, så start alt det her med at lave et array:

$ids=array();

og der hvor du finder ud af at du skal have tilføjet noget, laver du så det her

if($_POST['109']){ $ids[] = "109"; } (ingen else)

Så ender du nemlig med et array med de valgte numre, så du kan danne din query med denne kode:

$sql='SELECT * FROM sammenlign WHERE id IN (' . implode(",", $ids) . ')';

(Da det kun er tal, og du har 100% styr på hvor de kommer fra, er der ingen grund til at smide ' om de enkelte tal).

Det gør samtidigt at du kan simplificere dit check på alle de checkboxes:

$start=109;
$max=150;
for ($i=$start; $i<=$max; $i++)
{
  if($_POST[$i]){ $ids[] = $i; }
}
Avatar billede jakobdo Ekspert
15. juli 2008 - 13:37 #12
Du bør nok bygge dine checkboxe anderledes op.
F.eks.
109 <input type="checkbox" name="val[]" value="109">
110 <input type="checkbox" name="val[]" value="110">
111 <input type="checkbox" name="val[]" value="111">
Avatar billede duqe Nybegynder
15. juli 2008 - 14:42 #13
Min kode ser nu sådan ud:

if(isset($_POST['109'])){ $ids[] = "109"; }
+ flere id's

$idss = implode(", ", $ids);
$res = mysql_query("SELECT * FROM sammenlign WHERE id IN ('$idss')");

Men nu kan jeg kun hive én række ud af "sammenlign" tabellen. Jeg ønsker at få fire
Avatar billede jakobdo Ekspert
15. juli 2008 - 15:01 #14
Hvordan bygger du din formular op?
Der hvor du har noget ala:

<input type="checkbox" name="val[]" value="109">
Avatar billede duqe Nybegynder
15. juli 2008 - 15:03 #15
<input type=checkbox name=".$array['id'].">
Avatar billede jakobdo Ekspert
15. juli 2008 - 15:14 #16
Ret dem til:

<input type=checkbox name="id[]" value=".$array['id'].">
Avatar billede duqe Nybegynder
15. juli 2008 - 15:19 #17
hvordan hiver dem så frem igen på næste side hvor de skal bruges i mysql linjen?
Avatar billede jakobdo Ekspert
15. juli 2008 - 15:24 #18
$ids = implode(',',$_POST['id']);
Avatar billede duqe Nybegynder
15. juli 2008 - 15:27 #19
Det virker næsten - Men jeg kan stadig kun få udskrevet én af rækkerne på den næste side :)
Avatar billede pidgeot Nybegynder
15. juli 2008 - 15:33 #20
Nu er det vel ikke noget med at du ikke kalder mysql_fetch_* i et loop, og dermed kun henter en række ud, vel?
Avatar billede duqe Nybegynder
15. juli 2008 - 15:47 #21
Hele koden ser sådan ud:

$res = mysql_query("SELECT * FROM sammenlign WHERE id IN ('$ids')");
while($array = mysql_fetch_assoc($res)){
echo "</td><td width=120px align=center valign=top><b>";
if(isset($array['picture'])){ echo "<img src=".$array['picture'].">";
}
}
Avatar billede jakobdo Ekspert
15. juli 2008 - 16:52 #22
du skal rette:
$ids = implode(',',$_POST['id']);
til:
$ids = implode("','",$_POST['id']);
Avatar billede duqe Nybegynder
15. juli 2008 - 21:07 #23
Det virker. Mange tak for jeres hjælp :)

Smider du et svar?
Avatar billede jakobdo Ekspert
15. juli 2008 - 21:52 #24
Svar!
Avatar billede jakobdo Ekspert
16. juli 2008 - 05:39 #25
Takker for point.
Avatar billede jakobdo Ekspert
16. juli 2008 - 05:39 #26
pidgeot: Hvis du føler dig snydt, så deler jeg gerne.
Avatar billede pidgeot Nybegynder
16. juli 2008 - 08:39 #27
Nah, jeg sidder over i denne omgang :)
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