Avatar billede riefart Seniormester
21. januar 2015 - 18:37 Der er 7 kommentarer og
2 løsninger

Opsplitning af streng i sql-post

Jeg arbejder med en webside, hvor en bruger kan tilføje nogle varenumre som favoritter.
En tilføjelse som favorit opdaterer en post i sql-databasen. Denne post kunne se sådan ud:
1121;1236;44588;15; hvor et varenummer bliver tilføjet til slut i strengen, adskilt af ;  hvis det vælges som favorit. Det rummer ikke problemer.
Alle de valgte varenumre har et billede i den aktuelle varepost samt en række informationer. Billede (og øvrige informationer) vil jeg gerne kunne vise i et område på siden.
Spørgsmålet er hvordan skiller jeg denne streng, så informationerne hentes på alle de tilføjede varenumre?
Avatar billede olsensweb.dk Ekspert
21. januar 2015 - 18:47 #1
kig på http://php.net/explode
(utested)

<?php
$str = "1121;1236;44588;15;";
$ar = explode (";" , $str);
print_r($ar);
?>
Avatar billede riefart Seniormester
21. januar 2015 - 20:48 #2
Den er jeg med på. Men hvordan laver jeg en sql-forespørgsel med de fundne delstrenge, hvor antallet ikke kendes ikke på forhånd, og der skal søges på hver eneste delstreng?
Vil det være eks ......where id=$ar[0]?
21. januar 2015 - 21:07 #3
Det var ikke det du spurgte om, og det jeg skal fortælle er du muligvis allerede klar over og har overvejet, men jeg kan ikke dy mig:  Du har altså et felt i en database tabel med multiple oplysninger, en række af favoritte varenumre.  Relationelle database systemer er (blandt andet) indrettet på i hvert felt at have en enkelt oplysning.  Så kan du søge på kryds og tværs uden at skulle gribe til at explode og lignende. 

Jeg gætter på, at favoritterne sidder i bruger tabellen, for eksempel såsom:

Bruger
id  navn  e-mail  favoritter
25    Hans  a@bc.de  123;124;
72    Jens    f@gh.ij    1213;25;

og der ud over har du uden tvivl en tabel over varer, der blandt andet har et felt for billed og felter for øvrige informationer.

Ifølge den traditionelle struktur ville du oprette en særskilt tabel til favoritter således:

Bruger
id  navn  e-mail
25    Hans  a@bc.de
72    Jens  f@gh.ij

Favoritter
id  brugerid  vareid
1        25        123
2        25        124
3        72        1213
4        72        25

Hver gang en bruger vælger endnu en favorit tilføjes en række i favoritter tabellen, for eksempel hvis Hans, bruger 25, vælger vare 125 som favorit:  INSER INTO Favoritter(brugerid, vareid) values(25, 125)

Når så bruger 25 åbner siden og du skal have fat i billed og øvrig informationer for hans favoritter søger du det således:

SELECT v.billed, v.pris, v.beskrivelse .....
FROM bruger b
JOIN favoritter f ON b.id = f.brugerid
JOIN varer v ON f.varedi = v.id
WHERE b.id = 25
21. januar 2015 - 21:11 #4
Mens jeg arbejdede med mit indlæg stillede du et spørgsmål der kan retfærdiggøre mit indlæg.  Svaret er, at du kan foretage sql forespørgsel ved ikke at arbejde med delstrenge, men ved at ændre database strukturen i retning af hvad jeg foreslår.
Avatar billede olsensweb.dk Ekspert
21. januar 2015 - 21:20 #5
antallet finder du med http://php.net/count

(utested)
 
<?php
$conn = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "");

for($i=0, $lng=count($ar); $i<$lng;$i++){
    $sql = "SELECT * FROM tbl WHERE id = . $ar[$i];
    $rs = $conn->query($sql);
    $obj = $rs->fetch(PDO::FETCH_OBJ);

    echo $obj->col1;
    echo $obj->col2;   
}
?>
   


>Vil det være eks ......where id=$ar[0]?
Ja

må give Christian_Belgien ret, der er langt fra optimal tabel structur
den rigtige er som Christian_Belgien angiver at splitte colonne op i en seperat tabel, som vist i #3
det vil også gøre din søgning mere effektiv

ellers kan vi skulle ud i noget med:
sql: http://www.w3schools.com/sql/sql_in.asp
php: http://php.net/in_array
Avatar billede riefart Seniormester
21. januar 2015 - 21:45 #6
Jeg havde faktisk en struktur som Christian foreslår, men ønskede at begrænse antallet af poster, og få en enklere søgning, hvorfor jeg samlede alle favoritvalg i en post. Men det kan være jeg efter denne grundige vejledning, skal gå tilbage hertil. Tak for hjælpen begge to.
Hvordan deler man lige point. Jeg har jo kunne bruge dele af begge jeres kommentarer?
21. januar 2015 - 21:52 #7
Du inviterer svar fra os begge og accepterer begge svar.  Her er mit.
Avatar billede arne_v Ekspert
22. januar 2015 - 02:12 #8
Jeg er helt enig i at strukturen skal laves om. En liste i et felt er meget slemt i en relationel database.

Men jeg vil dog lige naevne:

SELECT ... WHERE id IN (1121,1236,44588,15)
Avatar billede olsensweb.dk Ekspert
22. januar 2015 - 04:06 #9
her er mit svar
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

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