MySQLi opstartproblemen
Zelf probeer ik hetvolgende, ik heb deze mysqli query gemaakt:
$settingquery = mysqli_query($connect_mysql, "SELECT * FROM `usersettings` WHERE `user_id` = '".$user['id']."'");
$setting = mysqli_fetch_assoc($settingquery);
Nu wil ik eigenlijk niet steeds opnieuw dezelfde query maken om elke keer een andere info op te vragen.
Ik wil bijvoorbeeld in dat tabel de informatie van bijvoorbeeld setting_id de POB tonen, hoe kan ik dit het beste doen zonder de volgende query:
$settingquery = mysqli_query($connect_mysql, "SELECT * FROM `usersettings` WHERE `user_id` = '".$user['id']."' AND `setting_id` = 'POB'");
$setting = mysqli_fetch_assoc($settingquery);
Alvast bedankt voor de hulp
Dus dan kan je alles van die persoon al ophalen, zodat je die per setting kan benaderen:
$setting['use_tracker']
$setting['refresh_newspage_automatically']
etc....
Gewijzigd op 20/03/2020 16:34:53 door - Ariën -
Ik haal het van een persoon op maar:
er zijn voor die persoon meerdere rijen.
Bijvoorbeeld een rij met: POB en BDAY
Hetgeen wat ik wil bereiken is, met één query meerdere rij value's ophalen bijvoorbeeld:
Hier de POB: $settings['setting_id'] = POB = Vlissingen (staat in table)
Hier de BDAY: $settings['setting_id'] = 'BDAY' = datum (staat in table)
Beiden dus losse rijen
Edit:
Het is niet nodig om het voorgaande bericht integraal te quoten.
Gewijzigd op 20/03/2020 16:53:33 door - Ariën -
Dan zijn we er toch al? het is niet dat elke aanroep een nieuwe query aanmaakt.
Dan moet ik toch bij elke row de query opnieuw uitvoeren bijvoorbeeld:
$settingquery = mysqli_query($connect_mysql, "SELECT * FROM `usersettings` WHERE `user_id` = '".$user['id']."' AND `setting_id` = 'POB'");
$setting = mysqli_fetch_assoc($settingquery);
Of is er nog een snellere manier?
Elke setting type is een aparte regel trouwens
Gewijzigd op 20/03/2020 16:57:45 door - Ariën -
Je slaat de hele array met *alle* settings van de gebruiker op in $settings. Of is die lijst echt gruwelijk groot met vele honderden records?
Gewijzigd op 20/03/2020 16:59:47 door - Ariën -
Elke setting is één row dus je hebt voor alle gebruikers een database waar per setting één aparte regel is, ik wil per aparte regel werken dus als ik de regel POB wil hebben moet ik dus op basis van id en setting_id de info uit die regel tonen, het is dus niet dat alle settings in één regel staan.
Ik zag eerder iets van $settings->POB->input1 maar weet niet hoe dat precies werkt
Gewijzigd op 20/03/2020 17:04:55 door - Ariën -
Gooi $setting anders eens door print_r() en zie wat er in zit.
En graag niet steeds het voorgaande bericht volledig quoten a.u.b. want dat is nergens voor nodig. ;-)
Gewijzigd op 20/03/2020 17:07:38 door - Ariën -
Dat betekent dus dat ik bij elke ophaling van de setting één query dien uit te voeren?
Dat is toch niet erg....
..of gaat het om vele honderden?
Gewijzigd op 20/03/2020 17:11:08 door - Ariën -
Het probleem waar je waarschijnlijk tegen aanloopt is dat je dan een lusje moet maken waarmee je alle records inleest in een array of een class.
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
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
<?php
// default settings
$settings = [
'POB' => 0,
'BDAY' => 1
];
// run query
$result = mysqli_query($connect_mysql, "SELECT * FROM usersettings WHERE user_id=" . $user['id']);
if($result === false) {
throw new Exception(mysql_error($connect_mysql));
exit;
}
// overschrijf settings
while($row = mysqli_fetch_assoc($result)) {
$settings[$row['setting_id']] = $row['setting_value']; // IK WEET NIET WELKE KOLOMNAMEN JE HEBT DUS VERANDER settings_value naar een bestaande kolomnaam.
}
// voor deze test laat even het resultaat zien
echo '<pre>' . print_r($settings, true) . '</pre>';
// normaal gebruik
if($settings['POB'] == 0) {
// doe iets
}
?>
// default settings
$settings = [
'POB' => 0,
'BDAY' => 1
];
// run query
$result = mysqli_query($connect_mysql, "SELECT * FROM usersettings WHERE user_id=" . $user['id']);
if($result === false) {
throw new Exception(mysql_error($connect_mysql));
exit;
}
// overschrijf settings
while($row = mysqli_fetch_assoc($result)) {
$settings[$row['setting_id']] = $row['setting_value']; // IK WEET NIET WELKE KOLOMNAMEN JE HEBT DUS VERANDER settings_value naar een bestaande kolomnaam.
}
// voor deze test laat even het resultaat zien
echo '<pre>' . print_r($settings, true) . '</pre>';
// normaal gebruik
if($settings['POB'] == 0) {
// doe iets
}
?>
Zie phpmyadmin dit bedoelde ik Ariën ;-)
Toevoeging op 20/03/2020 17:16:42:
@frank zie: De afbeelding
Toevoeging op 20/03/2020 17:16:42:
@frank zie: De afbeelding
Gewijzigd op 20/03/2020 17:13:43 door Christian Snijders
Ik zie het, je hebt meerdere velden.
En dan vraag ik mij af waarom je genummerde velden hebt?
Wat als je straks 7 velden hebt? Ga je dan je hele structuur aanpassen?
Mijn advies: Werk in de lengte, en niet in de breedtte. Dus maak gewoon extra rijen per setting en value aan.
Dan hoef je ook niet zo lastig te doen en kan je onbeperkt uitbreiden.
Gewijzigd op 20/03/2020 17:35:25 door - Ariën -
En wat is de reden voor value1 tm 5?
@Frank dat is om meer informatie te vergaren zoals extra instellingen, dus per setting kan ik extra info toevoegen zoals bijvoorbeeld een taal.
Dit oogt zeker niet genormaliseerd.
Als je hier toch een bepaalde hierarchie in wil maken dan zou je dat misschien nog in de naamgeving kunnen doen, bijvoorbeeld birth.place, birth.date et cetera. Maar dit zijn dan meer profielgegevens dan "instellingen" (settings) van een gebruiker, en die stop je dan in aparte kolommen van een profieltabel ofzo, in plaats van in een apart record.