mysql while vraag
ik heb hier een script :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$sql_sql = mysqli_query($dbcreat,
"SELECT * FROM `vriendenlijst` WHERE
`naam_1`='".mysqli_real_escape_string($dbcreat,$data->login)."' or
`naam_2`='".mysqli_real_escape_string($dbcreat,$data->login)."' AND `bevestigd`='1'") or die(mysqli_error($dbcreat));
$sqll = mysqli_fetch_object($sql_sql);
$sqll_gevonden = mysqli_num_rows($sql_sql);
$berichten = mysqli_query($dbcreat,"SELECT * FROM berichten_muur
WHERE
`gebruikersnaam`='".mysqli_real_escape_string($dbcreat,$data->login)."' or
`gebruikersnaam`='".mysqli_real_escape_string($dbcreat,$sqll->naam_1)."' or
`gebruikersnaam`='".mysqli_real_escape_string($dbcreat,$sqll->naam_2)."'");
while($object = mysqli_fetch_object($berichten)){
?>
$sql_sql = mysqli_query($dbcreat,
"SELECT * FROM `vriendenlijst` WHERE
`naam_1`='".mysqli_real_escape_string($dbcreat,$data->login)."' or
`naam_2`='".mysqli_real_escape_string($dbcreat,$data->login)."' AND `bevestigd`='1'") or die(mysqli_error($dbcreat));
$sqll = mysqli_fetch_object($sql_sql);
$sqll_gevonden = mysqli_num_rows($sql_sql);
$berichten = mysqli_query($dbcreat,"SELECT * FROM berichten_muur
WHERE
`gebruikersnaam`='".mysqli_real_escape_string($dbcreat,$data->login)."' or
`gebruikersnaam`='".mysqli_real_escape_string($dbcreat,$sqll->naam_1)."' or
`gebruikersnaam`='".mysqli_real_escape_string($dbcreat,$sqll->naam_2)."'");
while($object = mysqli_fetch_object($berichten)){
?>
het probleem is dat als je 3 vrienden hebt je maar 3 berichten te zien krijgt.
maar als er 10 berichten zijn en je hebt maar 3 vrienden blijven er maar 3 berichten staan.
hoe krijg ik dit dat als er 10 berichten zijn dat je ze ook alle 10 te zien krijgt en niet maar 3?
kan iemand mij helpen? ik ben al paar dagen bezig met deze fout, ik heb al van alles geprobeert van Inner en cross join en nog veel meer.
is iets compleet anders dan
A OR (B AND C)
Het lijkt mij altijd beter om expliciet te zijn in wat je bedoelt. Volgens mij was zo'n AND/OR vraag al eerder aan de orde geweest?
Daarnaast: gebruik (ook hier :)) user ID's in plaats van user namen...
Tevens: misschien kun je dit splitsen in VERZONDEN en ONTVANGEN berichten?
het is een soort gastenboek waar je kan lezen wat je vrienden typen.
ook als ik dit veranderd in user->id werkt er niks.
er blijven maar 3 berichten staan.
alleen als ik
gebruik en in de while
Code (php)
1
2
3
2
3
<?php
if($vrienden->naam_1 == $gebruikersnaam or $vrienden->naam_2 == $gebruikersnaam or $data->login == $gebruikersnaam
?>
if($vrienden->naam_1 == $gebruikersnaam or $vrienden->naam_2 == $gebruikersnaam or $data->login == $gebruikersnaam
?>
werkt het prima. alleen het probleem is dat ik dan geen pagina 1 2 3 4 5 ect kunt toevoegen omdat als ik dat wil toevoegen de pagina nummer werken op het aantal vrienden dat je hebt.
weet iemand het antwoord?
Gewijzigd op 14/03/2015 17:02:36 door Eeyk Vd noot
Daarnaast zou ik user id's gebruiken.
Hieruit bouw je dan uiteindelijk een lijst van vrienden-id's.
Dan kun je een query bouwen waarbij je bericht opvraagt die ofwel van jou zijn, ofwel van een (bevestigde) vriend.
Of je bouwt een lijst van gebruiker-id's, waarbij je bestaande gebruiker-ids (jezelf) steeds overschrijft zodat je een lijst van unieke gebruikers overhoudt. Die je weer voor de berichtenmuur-query kunt gebruiken.
EDIT: het probleem is ook dat je van je eerste query maar één resultaat ophaalt...
Gewijzigd op 14/03/2015 17:16:17 door Thomas van den Heuvel
Hoe zorg ik er voor dat de query meerderemaals word opgehaald?
Het is niet geheel ondenkbaar dat dit meerdere resultaten oplevert:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$sql_sql = mysqli_query($dbcreat,
"SELECT * FROM `vriendenlijst` WHERE
`naam_1`='".mysqli_real_escape_string($dbcreat,$data->login)."' or
`naam_2`='".mysqli_real_escape_string($dbcreat,$data->login)."' AND `bevestigd`='1'") or die(mysqli_error($dbcreat));
?>
$sql_sql = mysqli_query($dbcreat,
"SELECT * FROM `vriendenlijst` WHERE
`naam_1`='".mysqli_real_escape_string($dbcreat,$data->login)."' or
`naam_2`='".mysqli_real_escape_string($dbcreat,$data->login)."' AND `bevestigd`='1'") or die(mysqli_error($dbcreat));
?>
Hoe haal je normaal meerdere resultaten op? Met een while-loop wellicht?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$sql_sql = mysqli_query($dbcreat,
"SELECT * FROM `vriendenlijst` WHERE
(`naam_1`='".mysqli_real_escape_string($dbcreat,$data->login)."' or
`naam_2`='".mysqli_real_escape_string($dbcreat,$data->login)."') AND `bevestigd`='1'") or die(mysqli_error($dbcreat));
$sqll_gevonden = mysqli_num_rows($sql_sql);
while($sqll = mysqli_fetch_object($sql_sql)){
$berichten = mysqli_query($dbcreat,"SELECT * FROM berichten_muur
WHERE
gebruikersnaam='".mysqli_real_escape_string($dbcreat,$data->login)."' or
gebruikersnaam='".mysqli_real_escape_string($dbcreat,$sqll->naam_1)."' or
gebruikersnaam='".mysqli_real_escape_string($dbcreat,$sqll->naam_2)."'
ORDER BY datum DESC
");
}
while($object = mysqli_fetch_object($berichten)){ ?>
$sql_sql = mysqli_query($dbcreat,
"SELECT * FROM `vriendenlijst` WHERE
(`naam_1`='".mysqli_real_escape_string($dbcreat,$data->login)."' or
`naam_2`='".mysqli_real_escape_string($dbcreat,$data->login)."') AND `bevestigd`='1'") or die(mysqli_error($dbcreat));
$sqll_gevonden = mysqli_num_rows($sql_sql);
while($sqll = mysqli_fetch_object($sql_sql)){
$berichten = mysqli_query($dbcreat,"SELECT * FROM berichten_muur
WHERE
gebruikersnaam='".mysqli_real_escape_string($dbcreat,$data->login)."' or
gebruikersnaam='".mysqli_real_escape_string($dbcreat,$sqll->naam_1)."' or
gebruikersnaam='".mysqli_real_escape_string($dbcreat,$sqll->naam_2)."'
ORDER BY datum DESC
");
}
while($object = mysqli_fetch_object($berichten)){ ?>
ik probeer nu dit maar dit geeft nog steeds niet het juiste resultaat.
Toevoeging op 14/03/2015 17:48:23:
ik heb gedaan wat je ze en alles op id gezet maar dit lost niks op helaas.
2. Haal, mits je vriendenlijst niet leeg is, alle berichten op die afkomstig zijn van deze personen. Gebruik hierbij bijvoorbeeld de IN (...) constructie van MySQL:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$query =
'SELECT *
FROM berichten_muur
WHERE poster_id = '.$jouwUserId.'
OR poster_id IN ('.implode(',', $nietLegeLijstVanVriendenIds).')';
?>
$query =
'SELECT *
FROM berichten_muur
WHERE poster_id = '.$jouwUserId.'
OR poster_id IN ('.implode(',', $nietLegeLijstVanVriendenIds).')';
?>
En for the love of all that is good and holy: refereer aan users via hun ID, niet via hun naam.
$query =
'SELECT *
FROM berichten_muur
WHERE poster_id = '.$data->id.'
OR poster_id IN ('.implode(',', $sqll->id_gebruiker_2 or $sqll->id_gebruiker_2).')';
?
Lees eens goed wat ik schrijf, ik heb niet het idee dat ik onduidelijk ben.
Was dat ook een vraag van jou, of zijn meer mensen met hetzelfde probleem bezig?
en je eigen bericht 3x. ik heb nu in me database naam_1 en naam_2 vervangen door id_1 en id_2. en de gebruikersnaam in berichten muur door gebruikers_id.
als je bij de vorige oplossing 3 vrienden had kreeg je je eigen berichten 3x te zien had je 5 vrienden kreeg je je eigenberichten 5x te zien.
Gewijzigd op 14/03/2015 18:11:14 door Eeyk Vd noot
Hier is wat pseudo SQL van hoe het zou kunnen.
INNER JOIN
(SELECT * FROM vriendenlijst AS TT
WHERE TT.naam_1='".mysqli_real_escape_string($dbcreat,$data->login)."'
OR TT.naam_2='".mysqli_real_escape_string($dbcreat,$data->login)."') AS TTT
ON BB.gebruikersnaam= TTT.naam_2 or BB.gebruikersnaam= TTT.naam_1 AND BB.pagina='overzicht'
dat heb ik al eens geprobeerd alleen dan krijg ik maar 3 berichten te zien.
en als je 4 vrienden hebt krijg je 4 berichten te zien terwijl er bijvoorbeeld 20 berichten staan.
Toevoeging op 14/03/2015 19:01:01:
ik heb er id van gemaakt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$berichten = mysqli_query($dbcreat,"SELECT * FROM berichten_muur AS BB
INNER JOIN
(SELECT * FROM vriendenlijst AS TT
WHERE TT.id_1='".mysqli_real_escape_string($dbcreat,$data->id)."'
OR TT.id_2='".mysqli_real_escape_string($dbcreat,$data->id)."') AS TTT
ON
(BB.gebruiker_id = TTT.id_1 OR
BB.gebruiker_id = TTT.id_2) AND
BB.pagina='overzicht'
") or die(mysqli_error($dbcreat));
?>
$berichten = mysqli_query($dbcreat,"SELECT * FROM berichten_muur AS BB
INNER JOIN
(SELECT * FROM vriendenlijst AS TT
WHERE TT.id_1='".mysqli_real_escape_string($dbcreat,$data->id)."'
OR TT.id_2='".mysqli_real_escape_string($dbcreat,$data->id)."') AS TTT
ON
(BB.gebruiker_id = TTT.id_1 OR
BB.gebruiker_id = TTT.id_2) AND
BB.pagina='overzicht'
") or die(mysqli_error($dbcreat));
?>
vrienden aanvragen en berichten plaatsen werkt nu ook op id.
Toevoeging op 14/03/2015 19:09:59:
maar nog steeds werkt het niet.
Gewijzigd op 14/03/2015 19:12:55 door Eeyk Vd noot
Tevens is er niets mis met de "verdeel en heers" strategie: deel je probleem op in deelproblemen die je afzonderlijk oplost. Ik snap de aversie voor meerdere queries niet.
Begin dus gewoon eerst eens met het opstellen van een array in PHP, waarin de gebruiker-id's van jouw vrienden zitten.
Deze bouwsteen kun je vervolgens toepassen in andere onderdelen, bijvoorbeeld queries.
bijvoorbeeld de vrienden pagina is ook opgebouwd met de zelfde soort constructie.
Toevoeging op 14/03/2015 19:50:11:
Hoe bedoel je eigenlijk met array's? of zit ik nou totaal ergens anders aan te denken?
Code (php)
zo iets?
Toevoeging op 14/03/2015 20:00:54:
ik gebruik nu
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$berichten = mysqli_query($dbcreat,"SELECT * FROM berichten_muur");
$toegestaan = 1;
while($object = mysqli_fetch_object($berichten){
$gebruikersnaam = $object->gebruikers_id;
if($vrienden->id_1 == $gebruikersnaam or $vrienden->id_2 == $gebruikersnaam or $data->id == $gebruikersnaam AND $toegestaan = 40){
$toegestaan++;
}else{}
}
?>
$berichten = mysqli_query($dbcreat,"SELECT * FROM berichten_muur");
$toegestaan = 1;
while($object = mysqli_fetch_object($berichten){
$gebruikersnaam = $object->gebruikers_id;
if($vrienden->id_1 == $gebruikersnaam or $vrienden->id_2 == $gebruikersnaam or $data->id == $gebruikersnaam AND $toegestaan = 40){
$toegestaan++;
}else{}
}
?>
als tijdelijke oplossing en kom ik er ooit achter zou het mooi zijn.
Gewijzigd op 14/03/2015 20:10:26 door Eeyk Vd noot
De lijst van jouw vrienden.
Ik type toch geen Chinees?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$mijnVrienden = array();
$res = mysqli_query(
$dbcreat,
'SELECT user_id_1, user_id_2
FROM vriendenlijst
WHERE (user_id_1 = '.$mijnUserId.' OR user_id_2 = '.$mijnUserId.')
AND bevestigd = 1'
);
// bouw die lijst nou eens
while ($row = mysqli_fetch_assoc($dbcreat, $res)) {
// overschrijf gewoon alle keys, zodat je een array met unieke gebruiker id's overhoud
$mijnVrienden[$row['user_id_1']] = true;
$mijnVrienden[$row['user_id_2']] = true;
}
// geef resultaat vrij
mysqli_free_result($res);
// verwijder jezelf als vriend van jezelf
unset($mijnVrienden[$mijnUserId]);
?>
$mijnVrienden = array();
$res = mysqli_query(
$dbcreat,
'SELECT user_id_1, user_id_2
FROM vriendenlijst
WHERE (user_id_1 = '.$mijnUserId.' OR user_id_2 = '.$mijnUserId.')
AND bevestigd = 1'
);
// bouw die lijst nou eens
while ($row = mysqli_fetch_assoc($dbcreat, $res)) {
// overschrijf gewoon alle keys, zodat je een array met unieke gebruiker id's overhoud
$mijnVrienden[$row['user_id_1']] = true;
$mijnVrienden[$row['user_id_2']] = true;
}
// geef resultaat vrij
mysqli_free_result($res);
// verwijder jezelf als vriend van jezelf
unset($mijnVrienden[$mijnUserId]);
?>
Vervolgens kun je met array_keys($mijnVrienden) je queries opbouwen.
Zorg wel dat $mijnVrienden niet leeg is voordat je deze in constructies als "... IN (...)" gebruikt. Zoals hier boven al is beschreven.
Wel ff $mijnUserId en user_id_1 en user_id_2 aanpassen aan whatever jij gebruikt in je code uiteraard...
Om eerlijk te zijn, als je dit niet volgt vraag ik mij eigenlijk hardop af waarom je dan wel aan een klus als het bouwen van een soort van community bezig bent.
Gewijzigd op 14/03/2015 21:04:26 door Thomas van den Heuvel
ik ga er mee aan de slag! ik hoop dat het werkt.
Nogmaals bedankt.
ik ben bezig met een soort van 'community' voor Nederlanders en belgen.
Waar men foto's, video's kan delen en met elkaar contact kan opnemen, ect.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT B.*
FROM berichten_muur AS B
INNER JOIN (
SELECT IB.id
FROM berichten_muur AS IB
WHERE IB.gebruikersnaam = ?
U N I O N ALL // zonder die spaties... phphulp lijkt een stomme anti sql-injection blacklist te hebben -.-
SELECT IB.id
FROM berichten_muur AS IB
INNER JOIN vriendenlijst AS V
ON V.naam1 = IB.gebruikersnaam
WHERE V.gebruikersnaam = ?
U N I O N ALL
SELECT IB.id
FROM berichten_muur AS IB
INNER JOIN vriendenlijst AS V
ON V.naam2 = IB.gebruikersnaam
WHERE V.gebruikersnaam = ?
) AS IDS
ON IDS.id = B.id
ORDER BY een_datum_lijkt_me_handig
FROM berichten_muur AS B
INNER JOIN (
SELECT IB.id
FROM berichten_muur AS IB
WHERE IB.gebruikersnaam = ?
U N I O N ALL // zonder die spaties... phphulp lijkt een stomme anti sql-injection blacklist te hebben -.-
SELECT IB.id
FROM berichten_muur AS IB
INNER JOIN vriendenlijst AS V
ON V.naam1 = IB.gebruikersnaam
WHERE V.gebruikersnaam = ?
U N I O N ALL
SELECT IB.id
FROM berichten_muur AS IB
INNER JOIN vriendenlijst AS V
ON V.naam2 = IB.gebruikersnaam
WHERE V.gebruikersnaam = ?
) AS IDS
ON IDS.id = B.id
ORDER BY een_datum_lijkt_me_handig
probeer dit eens...
Joinen op integers (altijd 4 bytes) is fijner voor een database dan joinen op strings (varchars zijn variabel in lengte, hoeveel bytes per teken hangt af van de encoding. het kan zijn dat 'dos' als 12 bytes kost om op te slaan.)
vervang het veld gebruikersnaam is tabel berichten_muur dus aub door een id en haal de gebruikers naam op via een join...
Hoe langer je wacht hoe moeilijker het wordt die fout te verbeteren.
PS. het GROUP BY gedeelte van mijn pseudo code was erg belangrijk...
PPS. PosqlgreSQL > MySQL
Gewijzigd op 14/03/2015 22:02:48 door Dos Moonen
met alles wat ik doe, iedere manier.
alles komt dubbel vrienden aantal = jou bericht dubbel.
dus 4 vrienden = 4x jou bericht zichtbaar.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
$vrienden_bericht = mysqli_query($dbcreat,
"SELECT * FROM `vriendenlijst` WHERE (`naam_1`='".mysqli_real_escape_string($dbcreat,$data->login)."' or `naam_2`='".mysqli_real_escape_string($dbcreat,$data->login)."') AND `bevestigd`='1' LIMIT 0,2500") or die(mysqli_error($dbcreat));
while($ovj = mysqli_fetch_object($vrienden_bericht)){
$berichten = mysqli_query($dbcreat,"
SELECT B.*
FROM berichten_muur AS B
INNER JOIN (
SELECT IB.id
FROM berichten_muur AS IB
WHERE IB.gebruiker_id = '".mysqli_real_escape_string($dbcreat,$ovj->id_1)."' or IB.gebruiker_id = '".mysqli_real_escape_string($dbcreat,$ovj->id_2)."'
U NION ALL
SELECT IB.id
FROM berichten_muur AS IB
INNER JOIN vriendenlijst AS V
ON V.id_1 = IB.gebruiker_id
WHERE V.id_1 = '".mysqli_real_escape_string($dbcreat,$ovj->id_1)."'
U NION ALL
SELECT IB.id
FROM berichten_muur AS IB
INNER JOIN vriendenlijst AS V
ON V.id_2 = IB.gebruiker_id
WHERE V.id_2 = '".mysqli_real_escape_string($dbcreat,$ovj->id_2)."'
) AS IDS
ON IDS.id = B.id
ORDER BY B.datum DESC") or die(mysqli_error($dbcreat));
}
?>
$vrienden_bericht = mysqli_query($dbcreat,
"SELECT * FROM `vriendenlijst` WHERE (`naam_1`='".mysqli_real_escape_string($dbcreat,$data->login)."' or `naam_2`='".mysqli_real_escape_string($dbcreat,$data->login)."') AND `bevestigd`='1' LIMIT 0,2500") or die(mysqli_error($dbcreat));
while($ovj = mysqli_fetch_object($vrienden_bericht)){
$berichten = mysqli_query($dbcreat,"
SELECT B.*
FROM berichten_muur AS B
INNER JOIN (
SELECT IB.id
FROM berichten_muur AS IB
WHERE IB.gebruiker_id = '".mysqli_real_escape_string($dbcreat,$ovj->id_1)."' or IB.gebruiker_id = '".mysqli_real_escape_string($dbcreat,$ovj->id_2)."'
U NION ALL
SELECT IB.id
FROM berichten_muur AS IB
INNER JOIN vriendenlijst AS V
ON V.id_1 = IB.gebruiker_id
WHERE V.id_1 = '".mysqli_real_escape_string($dbcreat,$ovj->id_1)."'
U NION ALL
SELECT IB.id
FROM berichten_muur AS IB
INNER JOIN vriendenlijst AS V
ON V.id_2 = IB.gebruiker_id
WHERE V.id_2 = '".mysqli_real_escape_string($dbcreat,$ovj->id_2)."'
) AS IDS
ON IDS.id = B.id
ORDER BY B.datum DESC") or die(mysqli_error($dbcreat));
}
?>
Gewijzigd op 14/03/2015 22:47:45 door Eeyk Vd noot
Woops, de twee selects met joins hebben een group by clause nodig, of haal het 'ALL' weg.