Hoi beste php'ers,

ik ben nog niet heel lang bezig met php maar heb toch een wens. Gaat om het maken van een query voor 'n kruistabel te laten weergeven. Poosje geleden heb ik me hier ook al me beziggehouden maar ik kan me helaas niet in verdiepen doordat ik kennis niet op niveau heb om dit te kunnen maar ook tijd speelt een rol.

ik ben op zoek naar iemand die me hierbij wil helpen. Dit hoeft uiteraard niet kosteloos te zijn. Ga graag met iemand daarover in onderhandeling buiten het forum om.

Wat is de vraag?

ik heb in een database drie tabellen. tabel medewwerkers, tabel rollen en een tabel waarin een relatie staat tussen die twee.
wat ik nu graag zou willen is dat een dmv een SQL opdracht de waarden van tabel medewerkers verticaal wordt weergegeven en de waarden van tabel rollen horizontaal wordt weergeven. Daar waar een match tussen die twee zitten zou het mooi zijn dat via een symbool (plusje ofzo) wordt getoond op het scherm.

Ik heb geen idee hoe dit werkt vandaar dat ik de vraag hier parkeer. Hoop dat iemand me hier mee wil helpen
Kunnen we onderling de vraag fine tunen waar nodig..

Alvast bedankt,
Dirk
om als laatste te beginnen... dat realiseer ik maar om de code voor mij even zo simpel als mogelijk te houden heb ik even voor die methodiek gekozen:-) anders wordt het een en weer schrollwerk :-)

Maar dan de vraag wat is een mock-up in html? geparste html? een simpele diff? Lijkt me een eea design tool. Ik vermoed dat daar dan ook weer alle kanten uit kan.

[size=xsmall]Toevoeging op 17/08/2019 17:23:30:[/size]

Thomas van den Heuvel op 17/08/2019 15:53:01

Waar komt de </tr> op regel 51 vandaan?

Het makkelijkste is gewoon de broncode te bekijken van de uitgedraaide HTML (Ctrl-U in de meeste browsers).

Naar alle waarschijnlijkheid zit er een fout in de opmaak van de HTML.




die </tr> op regel 51 lijkt me idd ook teveel. Heeft geen toegevoegde waarde.
Maar een fout opsporen met de <ctrl>+u optie is met blote oog een pittig klus de code wordt dus danig achter elkaar aangekwakt op beeld getoond dat het speuren met loep gaat worden. Maar ik zal het eens een kladbok gaan dumpen en eea gaan orden want zo is het niet te doen :-)

Ongetwijfeld ergens opmaakvautje ... :-)
Een mock-up is een tijdens de ontwerp- of productiefase op schaal of op ware grootte gemaakt model van een ontwerp of product. In de software-industrie komt het begrip tevens voor bij het vroeg in het ontwikkelproces testen van de gebruikersinterface van het software-ontwerp.

Met een diff kan je vergelijken wat de verschillen zijn tussen twee stukken text of scripts. Er zijn ook speciale sites die dit kunnen, zoals DiffChecker.
Je kan ook de geparste HTML (in een volledig HTML-document) laten testen door de W3 Validator.
Code helemaal doorlopen overbodige codering er even uitgehaald en dor W3 Validator gehaald. Die geeft nu het resultaat "Document checking completed. No errors or warnings to show."

De code zonder foutmelding (aldus de validator) ziet er als volgt uit.


<!DOCTYPE html>

<html lang="nl">

<head>
<meta charset="UTF-8">
<title>Kruistabel rol - medewerker</title>
</head>

<body>

<?php
require_once('../inc/connect.php');

$sqlUitlezen = mysqli_query($connection, 
$sql = "SELECT	
		CONCAT(idm_person.CALLNAME, ' ', idm_person.MX_LASTNAME, ' <br>(', idm_person.EMPLOYEENUMBER, ')' ) naam,
		idm_person.MSKEYVALUE_MEDEWERKER,
		idm_role.MSKEYVALUE_ROL,
		idm_role.DISPLAYNAME rol,
		idm_role.ROLETYPE
		
	FROM `idm_person`
		
	LEFT JOIN `idm_person2role` 
		ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
		
	LEFT JOIN `idm_role`
		ON idm_role.MSKEYVALUE_ROL = idm_person2role.MSKEYVALUE_ROL

	WHERE idm_person.REF_OU = 'OU:60000203'

	ORDER BY idm_role.ROLETYPE, idm_role.MSKEYVALUE_ROL
	");
	
					
$data = mysqli_fetch_all($sqlUitlezen, MYSQLI_ASSOC);
			
	foreach($data as $rij) {
	$namen[$rij['rol']] = $rij['rol'];
	$draai[$rij['naam']][$rij['rol']] = true;
	}
		echo '<table>' . PHP_EOL;
		echo '<tr><th></th>';
		
	foreach($draai as $key=>$rol) {
		echo '<th>' . $key . '</th>';
	}
		echo '</tr>';
	   
	foreach ($namen as $naam) {
		echo '<tr><td>'. $naam . '</td>' . PHP_EOL;
		foreach($draai as $key=>$rol) { 
			if(isset($draai[$key][$naam])) {
				echo '<td>?</td>';
			}else{
				echo '<td></td>';
			}
		}
		echo '</tr>';
	}
		echo '</table>';
?>	

</body>
</html>


Niet dat ik er iets verder mee gekomen ben.. op paar kleine dingetjes na... want de output is onveranderd.
Als ik de screenshot bekijk, heb je niet gewoon een rol zonder naam? Er is een immers een right die gewoon gekoppeld is.

Kijk anders eens met print_r() naar de inhoud van je rechten/roles boom?
En kijk of dit overeenkomt met je tabel.

<?php
echo "<pre>".print_r($data,true)."</pre>";
?>
Ik had ook heel even gedacht dat er een rol zonder naam zou zijn. Dit is niet het geval. Tabel rollen in de database er op nageslagen en alles is daar gevuld. Dat blijkt ook als ik het overzicht genereer maar dan voor een andere afdeling (OU)...



hieronder een deel van de voorgestelde print_r()

Array
(
[0] => Array
(
[naam] => naam1 wegehaald ivm privacy
(018411)
[MSKEYVALUE_MEDEWERKER] => 100.005756
[MSKEYVALUE_ROL] =>
[rol] =>
[ROLETYPE] =>
)

[1] => Array
(
[naam] => Dirk Huizinga
(008475)
[MSKEYVALUE_MEDEWERKER] => 100.002201
[MSKEYVALUE_ROL] => ROLE:OU:50000597:ALGEMEEN
[rol] => Algemeen
[ROLETYPE] => OU
)

[2] => Array
(
[naam] => naam1 wegehaald ivm privacy
(010780)
[MSKEYVALUE_MEDEWERKER] => 100.003205
[MSKEYVALUE_ROL] => ROLE:OU:50000597:ALGEMEEN
[rol] => Algemeen
[ROLETYPE] => OU
)

dit loopt helemaal door tot nummer 226. Dus die lap tekst bespaar ik jullie maar :-)
opmerking is dat ik namen van medewerkers heb weggehaald maar die staan er wel hoor.

wat mij opvalt is dat array [0] wel een naam, mskeyvalue_medewerker heeft maar de mskeyvalue_rol blijf legen. Dit wordt echter wel vanaf array [1] gevuld..

ik raak het overzicht kwijt en ik probeer voorzichtig wat dingetjes maar tot nu toe geen resultaat... blijft een zoekklus
Maar deze lege record zie je niet in de query terug?
nope. Eea nog uitgeprobeerd van andere afdeling.. Maar het lijkt er op dat iedere eerst genoemde persoon een leef rol heeft terwijl dit in de werkelijkheid niet is.

[size=xsmall]Toevoeging op 18/08/2019 10:51:21:[/size]

Ergens gebeurt er iets wat niet klopt. Kan alleen de vinger niet op de zere plek liggen. Vanmorgen een vergelijking gehouden met het resultaat van de kruistabel t.o.v. het bronbestand.

Daarbij maakte ik de conclusie dat bij alleen de eerste genoemde persoon de rolnaam niet wordt weergegeven. de match is er wel zodat het lijkt dat het een lege rol is. Maar dat is niet zo. Als ik in het bronbestand kijkt mist hij in de kruistabel inderdaad één rol.

Van alle daaropvolgende personen kloppen de matches wel. Maar tja, daarmee heb ik de oplossing nog niet gevonden.
Ik zit ook te kijken, maar hij loopt m.i. toch echt de array af vanaf het begin, zonder dergelijke berekeningen. Want er staat normaal niks boven Achmea Algemeen?
Nee daar staat echt niks.... dat de lege regel nu bovenaan staat heeft m.i. te maken dat ik in mijn SELECT een ORDER BY doe.

Vanmorgen dit ook op de oorspronkelijke van JAN R (zie begin topic) toegpast en daar heb ik ook die blanco regel. Dacht dat het daarmee te maken had omdat ik eea had omgedraaid omdat ik verticaal de rollen wil en horizontaal de personen. Maar dat is enige wijziging in de tabelopbouw.. Ik weet niet of het correct is gebeurt maar ik had wel resultaat. Toen dacht ik dat het met LEFT JOINS te maken had. In de oorspronkelijk code wordt er namelijk allleen JOIN gebruikt maar wanneer ik dat dat toepas blijf ik maar een zandloper behouden en gebeurt er niet veel. (op het oog dan he).. En het gekke is dat alleen dit euvel voorkomt bij de eerste genoemde persoon.
De foreach loopt alle records af, dus als je door een JOIN issue een waarde mist, dan zou je dat ook in je query moeten zien.

Reageren