Hi SELFPHP-Community,
folgendes Problem beschäftigt mich jetzt schon einige Stunden.
Ich habe folgende Tabellen:
Mitgliedertabelle (auf das wesentlichste gekürzt):
PHP-Code:
CREATE TABLE IF NOT EXISTS `tce__members` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`firstname` varchar(255) COLLATE latin1_general_cs NOT NULL,
`surname` varchar(255) COLLATE latin1_general_cs NOT NULL,
`login_available` enum('0','1') COLLATE latin1_general_cs NOT NULL DEFAULT '0',
`notes-active` enum('0','1') COLLATE latin1_general_cs NOT NULL DEFAULT '0'
);
Außerdem gibts noch eine Administartorentabelle mit den selben Feldern bis auf 'login_avaliable'. Dort heißt es 'active'.
Tabelle mit den Notizen:
PHP-Code:
CREATE TABLE IF NOT EXISTS `tce__notes` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`text` mediumtext COLLATE latin1_general_cs NOT NULL,
`color` tinyint(3) unsigned NOT NULL DEFAULT '3',
`entry_by_group` enum('0','1') COLLATE latin1_general_cs NOT NULL,
`entry_by_id` bigint(20) unsigned NOT NULL,
`entry_datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_update_datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_update_by_group` enum('0','1') COLLATE latin1_general_cs NOT NULL DEFAULT '0',
`last_update_by_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`last_update_remote_adress` varchar(15) COLLATE latin1_general_cs NOT NULL DEFAULT '000.000.000.000'
);
Tabellen mit den Einträgen dafür wer die jeweilge Notiz sehen darf und wer davon sie auch ändern darf.
PHP-Code:
CREATE TABLE IF NOT EXISTS `tce__notes-visible_for` (
`id` int(255) unsigned NOT NULL AUTO_INCREMENT,
`note_id` bigint(20) unsigned NOT NULL,
`user_group` enum('0','1') COLLATE latin1_general_cs NOT NULL,
`user_id` bigint(20) unsigned NOT NULL
);
Die Struktur der Tabelle 'tce__notes-editable_for' ist zu dieser identisch.
Ich versuche jetzt schon seit Stunden einen JOIN hinzubekommen welcher aber nicht das gewünschte Resultat liefert.
Jede Person welche Zugang zu dem Administrationsbereich hat, um den es hier geht, kann wenn es in derem Profil aktiviert wurde die Notizen-Funktion nutzen.
In dem Formular zum anlegen einer neuen Notiz gibt es eine Auswahliste in der man die entsprechenden Vereinsmitglieder bzw. Administratoren auswählen kann welche zur Verfügung stehen (Abhängig davon ob die Person Zugang hat und die Funktion für diese aktiviert wurde). Diese Auswahl wird dann in der Tabelle 'tce__notes-visible_for' abgespeichert.
In dem Formular zum ändern der Notiz gibt es eine Auswahlliste über die man einstellen kann wer von denen die die Notiz sehen dürfen diese auch ändern dürfen.
Man soll aber nur die Personen auswählen können welche auch die Notiz sehen können.
Und da dachte ich mir jetzt dass ich die entsprechende User-Tabelle (Mitglieder oder Admins) über einen Join mit der 'tce__notes-visible_for' "Verbinde".
Da ich bisher noch nicht sehr viel mit JOINs gearbeitet habe (bei denen hatte ich nur Glück, denke ich), stehe ich jetzt gehörig auf dem Schlauch. Die Erklärung im MySQL-Manual zu den JOINs hilft mir nicht wirklich.
Mir ist noch nicht klar was der MySQL-DBMS-Server da genau macht wenn man einen oder mehrere JOINs in das Statement einbaut.
Meine bisherigen hauptsächlichen Erfahrungen mit MySQL beziehen sich auf einfachste SELECTs (Und Sub-SELECTs), INSERTs, UPDATEs und DELETEs. Damit kam ich bisher immer aus.
Hier mal mein bisheriger Versuch:
PHP-Code:
SELECT
`".MYSQL_TABLE_MEMBERS."`.`id`,
`".MYSQL_TABLE_MEMBERS."`.`firstname`,
`".MYSQL_TABLE_MEMBERS."`.`surname`
FROM
`".MYSQL_TABLE_MEMBERS."`
LEFT JOIN
`".MYSQL_TABLE_NOTES_VISIBLE_FOR."`
ON
(
(`".MYSQL_TABLE_NOTES_VISIBLE_FOR."`.`user_group` = '0') &&
(`".MYSQL_TABLE_NOTES_VISIBLE_FOR."`.`user_id` = `".MYSQL_TABLE_MEMBERS."`.`id`) &&
(`".MYSQL_TABLE_NOTES_VISIBLE_FOR."`.`note_id` = '{$return['note']['id']}')
)
WHERE
(
(`".MYSQL_TABLE_MEMBERS."`.`login_available` = '1') &&
(`".MYSQL_TABLE_MEMBERS."`.`notes-active` = '1')
)
ORDER BY
`".MYSQL_TABLE_MEMBERS."`.`surname` ASC,
`".MYSQL_TABLE_MEMBERS."`.`firstname` ASC
Die Konstanten die mit "
MYSQL_TABLE_" beginnen, beinhalten den Namen der jeweiligen Tabelle.
Da es sich um Code innerhalb einer Methode handelt erstelle ich das Array $return um darin Rückgabewerte abzuspeichern und dann zum Schluss per RETURN zurückzugeben.
Sowohl die Konstanten als auch die genutzten Variablen und Arrays werden korrekt an die Methode bzw. innerhalb der Methode über-/weitergegeben und haben auch die korrekten Daten/Informationen als Inhalt/Wert.
Der Error-Level steht während der Entwicklung grundsätzlich auf "
E_ALL | E_STRICT".
Meldungen irgendwelcher Art erscheinen keinen.
Es wird z.B. der Name eines Mitglieds in der Auswahlliste für das Ändern angezeigt obwohl das Mitglied nicht für das anzeigen ausgewählt wurde.
Meine Vermutung geht nun dahin dass der JOIN nicht stimmt und daher Resultate liefert die nicht kommen dürfen.
Bei den Mitgliedern ist zum Testen bei mir auf meinem Entwicklungsserver einem einzigen Mitglied der Zugang und die Notizenfunktion aktiviert worden.
Ich hoffe Ihr habt eine Idee.
Vielleicht sehe ich ja auch einfach den Wald vor lauter Bäumen nicht, oder habe einfach nur einen Denkfehler.
Kai aka Knight1