Ik heb een string voor elk lid aangemaakt met de ID's van medeleden die hij wil volgen.


$value = "3-7-11-2-6-";
$result= explode("-", $value);
foreach($result as $newvalue){

$sql = "SELECT * FROM markers WHERE id ='$newvalue'";
if (!$result = $mysqli->query($sql)) 
{
	echo "<li>Sorry, er zijn problemen met de website.";
}
else
{
$record = $result->fetch_assoc();
	echo "<br>".$record['cb'];
	echo "<br>".$record['id'];
	echo "<br>".$record['name'];

}
}	


Dit gedeelte werkt..
Maar nu moet ik het sluitend maken naar de datatable toe.
Dit moet aansluiten op:


// DB table to use
$table = 'markers';
 
// Table's primary key
$primaryKey = 'id';
 
// Array of database columns which should be read and sent back to DataTables.
// The `db` parameter represents the column name in the database, while the `dt`
// parameter represents the DataTables column identifier. In this case simple
// indexes

$columns = array(
	array( 'db' => 'cb', 'dt' => 'cb' ),
	array( 'db' => 'id', 'dt' => 'id' ),	
	array( 'db' => 'name', 'dt' => 'name' ),
        .
        .
        .
   );

require( 'ssp.class.php' );
 
echo json_encode(
    SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns )
);


Is dit te doen, of kan ik beter aan de clientside de oplossing zoeken?
Bedankt vast voor het meedenken..
Wat? Nee. Records maken doe je op afroep. Als een lid daadwerkelijk een ander lid volgt.

Het verschil tussen jouw en mijn oplossing? Deze zul je merken in het gebruik. Probeer de eerdergenoemde vraagstukken eens (eenvoudig) te beantwoorden met jouw opzet. En kijk dan nog eens naar hoe je dat doet met mijn opzet.

Hoe krijg ik via een koppeltabel dat nu in 1 record naar mijn datatable toe?

Dit volg ik niet helemaal? De volgers-relatie is een een-op-veel relatie. Het is dan vrij normaal dat dit zich uit in meerdere records in de koppeltabel, zowel voor iemand die andere leden volgt alsook dat een lid gevolgd kan worden door meerdere andere leden.

Een database is bedoeld om data gestructureerd op te slaan. Maar ook om hier daarna weer makkelijk data uit op te vragen al naar gelang er een bepaalde informatiebehoefte is. Wat jij doet is de data versleuteld opslaan in de database, zodat dit een brok data wordt waar een database zelf niet zoveel mee kan omdat je deze in een eigen alternatief formaat opslaat.

Vergelijk dit met een spreadsheet waarbij je alle volgers-informatie in één cel dumpt. De structuur is dan ver te zoeken... Ook een oplossing met meerdere kolommen in eenzelfde tabel ("maximaal X gebruikers") is geen goede oplossing. Beschouw de koppeltabel als een apart tabblad in de spreadsheet waarin elke regel bestaat uit een lid die een ander lid volgt. In plaats van de tabelstructuur aan te passen als je onverhoopt op een gegeven moment besluit dat iemand meerdere volgers kan hebben hoef je dan enkel een of meer records toe te voegen, aan de structuur verandert niets. Ook kun je regels opleggen aan deze koppeltabel zodat deze geen duplicaten bevat. Zo heb je dus ook nog eens inherente sanity checks op de integriteit van je data.
Bedankt voor het aanhoren steeds van mijn geneuzel en gezeur, haha.

Hier een voorbeeld waar ik naar toe weil...
Alleen is dit clientside.
Ik kan dit wel ombouwen naar gegevens van database.
En dat werkt ook wel.
Maar een aantal functies verwijst naar de Ajax lijst ( ajax.data)
En die krijg ik in mijn onervarenheid niet herschreven.

In het voorbeeld zit wel een klein foutje in het vergelijken.
Maar als voorbeeld werkt het wel.

Er zijn al wat gecheckte checkboxen (komen normaal van database).
Door te submitten komen uitsluitend de gegevens van gecheckte leden in een tweede tabel.
De verzameltabel is verder gewoon te sorteren. En ook in te zoeken.
De verzameltabel kun je verder andere vrienden aanvinken of verwijderen.
Met submit komen de nieuwe gegevens in de vriendentabel.
En bij submit moeten de nieuwe gegevens weer opgenomen worden of aangevuld in een (koppel) tabel (of string)'

Ik heb zelf ook al een werkende serverside opzet met checkboxen, maar krijg dat niet gesorteerd.
Dan heeft het geen nut om leden de hele record af te laten zoeken naar aangevinkte checkboxen.
Voor datatables kan ik alleen op complexe manier queries toevoegen.
Datatables gaat uit van 1 record die uitgelezen wordt. En er zijn allerlei mogelijkheden om Clientside
de data te wijzigen en te beinvloeden, al dan niet met API's of toevevoegingen vanuit CSS.

Gelet op voorgaande heb ik dus gezocht naar een record met uitsluitend de gegevens van vrienden,
om die rechtstreeks te plaatsen in de vriendentabel.
Dat wordt denk ik met mijn kennis een veel te complex verhaal.

De koppeling van user_id's naar vrienden_id's moet in ieder geval gelegd worden.
Ik snap echter helaas nog steeds niet waar je nu de gegevens vastlegt met die koppelingen.
Ik deed dat in een tabel in de database waar ik de user_id's vastlegde met de vrienden_id's.
Hoe moet dat dan met een koppeltabel?
Los van het feit dat ik slechts 1 record kan uitdraaien naar datatable.
Wel eventueel andere voor een tweede of derde datatable tabel.

http://www.pctraverse.nl/DataTables-1.10.11/examples/server_side/simpleZZZ.php

Een concept moet je los zien van een (of meerdere) technische oplossing(en).

Het volgende is een compleet standalone script wat ik (eigenlijk tegen beter weten in) in elkaar heb gezet.

Ik zou zeggen, ga hier eens mee spelen en behandel dit soort problemen in afzondering, anders zie je mogelijk door de bomen het bos niet meer.

Disclaimer: er kunnen een heleboel dingen anders en beter, de onderstaande code dient enkel ter illustratie van het concept "koppeltabel".

<?php
// Noot: nog beter zouden constraints en foreign keys zijn in de koppetabel uiteraard.
/*
CREATE TABLE personen (
   per_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   per_naam VARCHAR(255)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE volgers (
    vol_persoon_id INT UNSIGNED NOT NULL,
    vol_volgt_persoon_id INT UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO personen (per_naam) VALUES ('Henk'), ('Piet'), ('Klaas'), ('Marij'), ('Els'), ('Bob'), ('Justin'), ('Mark'), ('Hanna'), ('Jan'), ('Steven'), ('Kim');
*/


// Wie ben ik? Komt normaal uit een sessie of wat dan ook.
$myUserId = 1; // Henk

$db = new mysqli('hostName', 'userName', 'password', 'databaseName');
$db->set_charset('utf8');

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // Noot: de volgende queries in een transactie uitvoeren zou beter zijn uiteraard.
    // Gooi koppeltabel leeg voor deze gebruiker.
    $db->query(
        "DELETE
        FROM volgers
        WHERE vol_persoon_id = '".$db->real_escape_string($myUserId)."'"
    );

    // Voeg volgers opnieuw toe.
    if (isset($_POST['personen'])) {
        foreach ($_POST['personen'] as $id) {
            $db->query(
                "INSERT INTO volgers (
                    vol_persoon_id, vol_volgt_persoon_id
                ) VALUES (
                    '".$db->real_escape_string($myUserId)."',
                    '".$db->real_escape_string($id)."'
                )"
            );
        }
    }

    // Ververs pagina (voorkomt dubbelposts, niet dat dat in dit geval iets uitmaakt maar goed).
    header('Location: '.$_SERVER['SCRIPT_NAME']);
    exit;
}

// Hulpfunctie.
function escape($in) {
    return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}

// Alles UTF-8.
header('Content-Type: text/html; charset=UTF-8');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>friend me?</title>
<style type="text/css">
body { font-family: sans-serif; font-size: 10pt; }
</style>
</head>

<body>
<form action="<?php echo escape($_SERVER['SCRIPT_NAME']) ?>" method="post" accept-charset="UTF-8"><?php
    // Welke personen zijn er allemaal en wie volg ik?
    // Dit zou je ook kunnen opsplitsen in meerdere eenvoudigere queries.
    $res = $db->query(
        "SELECT p.per_id, p.per_naam, v.vol_volgt_persoon_id
        FROM personen p
        LEFT JOIN volgers v ON (v.vol_persoon_id = '".$db->real_escape_string($myUserId)."' AND v.vol_volgt_persoon_id = p.per_id)
        WHERE p.per_id <> '".$db->real_escape_string($myUserId)."'
        ORDER BY p.per_naam"
    );
    while ($row = $res->fetch_assoc()) {
        $id      = escape($row['per_id']);
        $name    = escape($row['per_naam']);
        $checked = ($row['vol_volgt_persoon_id'] == NULL ? '' : ' checked="checked"');
        ?><p>
            <input type="checkbox" name="personen[]" id="personen_<?php echo $id ?>" value="<?php echo $id ?>"<?php echo $checked ?>>
            <label for="personen_<?php echo $id ?>"><?php echo $name ?></label>
        </p><?php
    }
    ?><div>
        <button type="submit">opslaan</button>
    </div>
</form>
</body>
</html>
Bedankt Thomas.
Ga er zeker mee aan de gang.
Ik meld me wel weer!

[size=xsmall]Toevoeging op 16/06/2016 21:48:59:[/size]

Snel even gekeken tussen het voetballen door.

De bedoeling is me nu duidelijk.
Als ik echter de user 1 verwijder uit de database blijft de volgerstabel van 1 toch bestaan.
Wanneer ik een volger verwijder, dan verdwijnt deze wel uit de lijst, maar bij de checkboxen blijven de namen wel vermeld.
Als ik de verwijderde volger weer aanvink dan gebeurt er uiteraard niks.
Verander ik user naar 2, dan wordt dat ook netjes weerrgegeven.

Maar ik bestudeer het nog wel verder.
Bedankt in ieder geval voor het script.




[size=xsmall]Toevoeging op 17/06/2016 11:52:25:[/size]

Lijkt me ook logisch dat de volgerlijst blijft vestaan als lid wordt verwijderd.
Via administrator paneel zal dat meegenomen moeten worden neem ik aan.
Hans De Ridder op 16/06/2016 20:32:54

Als ik echter de user 1 verwijder uit de database blijft de volgerstabel van 1 toch bestaan.

Niet als je met een FOREIGN KEY het juiste type relatie legt. Een relationele database kan dankzij een ON DELETE CASCADE afhankelijke tabellen automatisch bijwerken: verwijder je een gebruiker uit de hoofdtabel, dan worden meteen alle records van die gebruiker uit de afhankelijke tabel verwijderd.
Precies. Ik heb dit initieel bewust achterwege gelaten omdat dit mogelijk wat ver voerde. Maar wat @Ward zegt, door nog wat extra voorzieningen aan te brengen in de koppeltabel kun je deze automatisch opschonen wanneer een lid verwijderd wordt, hier is dan geen aparte DELETE-query op de volgers-tabel voor nodig.

Wanneer ik een volger verwijder, dan verdwijnt deze wel uit de lijst, maar bij de checkboxen blijven de namen wel vermeld.

Dit lijkt mij niet meer dan logisch. Als je stopt met het volgen van een lid houdt dat niet in dat dat lid ook weggekieperd wordt. Er wordt enkel een relatie tussen twee leden verbroken, er wordt geen lid verwijderd.

Als ik de verwijderde volger weer aanvink dan gebeurt er uiteraard niks.

Niet totdat je het formulier opnieuw submit in ieder geval. Wijzigingen in de database worden pas doorgevoerd nadat je de informatie hebt teruggestuurd naar de server.

Lijkt me ook logisch dat de volgerlijst blijft vestaan als lid wordt verwijderd.
Via administrator paneel zal dat meegenomen moeten worden neem ik aan.

Zoals aangegeven kun je dit ondervangen zodat deze tabel automatisch bij wordt gewerkt indien er een lid wordt verwijderd. Deze extra voorzieningen zorgen er dus automatisch voor dat de data in de volgers-tabel consistent is en blijft.

Dit doe je als volgt:
ALTER TABLE volgers ADD FOREIGN KEY (vol_persoon_id) REFERENCES personen(per_id) ON DELETE CASCADE;
ALTER TABLE volgers ADD FOREIGN KEY (vol_volgt_persoon_id) REFERENCES personen(per_id) ON DELETE CASCADE;

Indien je dan een persoon verwijdert die volgers had of zelf andere personen volgde zullen de bijbehorende records in de volgers-tabel automatisch opgeschoond worden.
phpMyAdmin accepteerde de laatste toevoegingen niet.
Heb even de volledige tabellen opnieuw aangemaakt met de FOREIGN erbij.
Werkt exact zo als jullie hebben aangegeven.
Klasse, bedankt...

Heb nu toch nog misschien een domme vraag, haha

Ik heb natuurlijk de tabel met de basisgegevens die ik laat verschijnen,
eventueel aangevuld met andere tabelgegevens (social media, googlemaps, etc.)
De gegevens voor de koppeltabel (die nu via INSERT komen) moet ik halen uit mijn
basisgegevens? Of is het de bedoeling dat die basisgegevens onderdeel zijn van de koppeltabel?

basistabel:

user_id (primary key) - Voornaam - Achternaam - Gebruikersnaam - Wachtwoord - Email - Geb. Datum



phpMyAdmin accepteerde de laatste toevoegingen niet.

Dit kwam waarschijnlijk omdat je tabellen waren aangemaakt met de (standaard) storage engine MyISAM. Deze tabellen lenen zich niet echt voor administratieve systemen omdat deze (nog) geen gebruik kunnen maken van voorzieningen als transacties en foreign keys. Met MyISAM als storage engine hangen je tabellen letterlijk als los zand aan elkaar en is er geen enkele waarborging voor referentiële integriteit van je data. De storage engine InnoDB doet dit alles wel.

Bij het opstellen van je database zul je je moeten afvragen welke storage engine en ook welke character encoding je gebruikt voor de definitie van je tabellen. Dit moeten weloverwogen keuzen (of liever gezegd: ontwerpbeslissingen) zijn. Dit is geen syntactic sugar die je achter je CREATE TABLE statement plakt; je moet tot op zekere hoogte weten wat dit betekent en wat voor implicaties dit heeft.

Ik beschouw een database als het fundament van mijn applicatie. Heb je een slecht fundament, dan vervalt de rest (de applicatie) al snel tot een bouwval.

De gegevens voor de koppeltabel (die nu via INSERT komen) moet ik halen uit mijn
basisgegevens?

Je kunt deze query uitbouwen door de volgers van de huidige gebruiker in de query te serialiseren middels de MySQL-functie GROUP_CONCAT. Vervolgens dien je te groeperen op het user id. Omdat het voor kan komen dat een gebruiker geen volgers heeft is het verstandig om een LEFT JOIN op de volgers-tabel te doen, anders levert je query op je basisgegevens mogelijk geen resultaat op.

Voortbordurend op het oorspronkelijke voorbeeld ziet de query er bijvoorbeeld als volgt uit:
SELECT per_naam, GROUP_CONCAT(vol_volgt_persoon_id) AS volgt
FROM personen
LEFT JOIN volgers ON (vol_persoon_id = per_id)
WHERE per_id = X
GROUP BY per_id

Waar X een persoon id is. In het SELECT-deel kun je andere basisgegevens opvragen.

Stel dat Henk (id 1) Klaas (id 3), Justin (id 7) en Hanna (9) volgt dan levert dit:
mysql> SELECT per_naam, GROUP_CONCAT(vol_volgt_persoon_id) AS volgt
    -> FROM personen
    -> LEFT JOIN volgers ON (vol_persoon_id = per_id)
    -> WHERE per_id = 1
    -> GROUP BY per_id;
+----------+-------+
| per_naam | volgt |
+----------+-------+
| Henk     | 9,7,3 |
+----------+-------+
1 row in set (0.00 sec)

Vervolgens kun je de "volgt" kolom exploden op een komma, nadat je hebt gecontroleerd of de waarde ongelijk aan NULL is (in het geval dat deze persoon geen volgers heeft).
De database staat standaard op InnoDB.
Hij meldde iets over kon niet editen of toevoegen in child.

Oke, de nieuwe toelichting kan ik nog volgen.
Maar even terug naar de wijze waarop de koppeltabel tot stand komt.
Daar staan namen, id's, etc.
Die gegevens daarvoor komen ergens vandaan.
Ik neem aan van de basis gegevens zoals ik aangaf.
Of is mijn tabel 'basis' dezelfde als jij noemt 'personen', maar dan met meer gegevens?

user_id (primary key) - Voornaam - Achternaam - Gebruikersnaam - Wachtwoord - Email - Geb. Datum


Je zult deze koppeltabel moeten koppelen aan je basistabel inderdaad.

In de koppeltabel komen precies twee kolommen voor. Beide verwijzen naar user id's in je basistabel (of zouden dit moeten doen).

In de koppeltabel staat enkel informatie over wie wie volgt.

Reageren