tutorials.de Buch-Aktion 05/2012
Like Tree4Danke
  • 1 Beitrag von CPoly
  • 1 Beitrag von Lime
  • 1 Beitrag von CPoly
  • 1 Beitrag von CPoly
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
461
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von suntrop
    suntrop suntrop ist offline Mitglied Brokat
    Registriert seit
    Dec 2001
    Ort
    Köln
    Beiträge
    452
    Mein kleines Projektmanagement-Tool übersteigt gerade meine aktuellen Fähigkeiten Folgendes … ich will zu jedem Projekt speichern, ob entweder alle oder nur bestimmte Personen Zugriff haben. Leider kann ich das nicht so richtig in SQL dolmetschen.

    In der Tabelle für Projekte habe ich ein ENUM mit 'all', 'privat', 'selected'. Erstgenanntes sollte klar sein. Zweite Erlaubnis soll nur dem User Zugriff geben, der das Projekt erstellt hat. Und Selected soll in einer anderen Tabelle gespeicherte Zugriffsrechte heranziehen.

    Mein Problem ist jetzt, dass ich nicht weiß wie ich beim Auslesen Punkt 2 und 3 prüfe und entsprechende Resultate aus der DB hole.

    Das hier ist mein aktueller Versuch
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    SELECT id, title
     
    IF(
        p_projects.permission = selected,
            INNER JOIN project_permissions
                ON p_project_permissions.project_id = p_projects.id
            
            WHERE p_project_permissions.user_id = $USERID
    )
     
    IF(
        p_projects.permission = privat,
            WHERE p_projects.created_by_user_id = $USERID
    )
     
     
    FROM `p_projects`

    Bitte nicht schimpfen, ist mein erster Versuch mit IF ELSE unter MySQL

    Wäre super, wenn mir jemand helfen könnte.

    Grüße
    suntrop
     

  2. #2
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Willst du jetzt Abfragen, ob ein bestimmter Nutzer auf ein bestimmten Projekt zugreifen kann? Oder was soll als Ergebnis kommen?
     

  3. #3
    Avatar von suntrop
    suntrop suntrop ist offline Mitglied Brokat
    Registriert seit
    Dec 2001
    Ort
    Köln
    Beiträge
    452
    Das Ergebnis soll sein, dass ich eine Liste aller Projekte erhalte, auf die ein bestimmter User (kommt per PHP, im Code $USERID) Zugriff hat.
     

  4. #4
    Avatar von Lime
    Lime Lime ist offline frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    374
    INNER JOIN project_permissions
    ON p_project_permissions.project_id = p_projects.id


    Also mir fällt da vor allem auf, dass du zwar die gleiche Tabelle meinst, die aber unterschiedlich heißen?
    Desweiteren liest du gar nicht die Art der Rechte/die Rechte selber aus...
    Habs auch nicht so mit Mysql, deswegen kann ich dir auch nicht direkt eine Lösung anbieten.
    €: Theoretisch kann der Ersteller ja immer auf sein Projekt zugreifen, oder?
    €2: Wo findet man die Rechte, die ein bestimmter User hat? Das wäre bei einer selected-permissions Abfrage hilfreich.
    €3:
    jetzt begreif ich auch so langsam, was du machen willst...
    €3:
    mal ein Versuch
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    SELECT id, title 
    FROM `p_projects`
    IF(
        p_projects.permission = selected,
            INNER JOIN p_project_permissions
                ON p_project_permissions.project_id = p_projects.id
            
            WHERE p_project_permissions.user_id = '".$USERID.'"
    )
     
    IF(
        p_projects.permission = privat,
            WHERE p_projects.created_by_user_id = '".$USERID."'
    )

    inner join nach dem FROM...

    gruß
    Geändert von Lime (12.11.11 um 20:30 Uhr)
     

  5. #5
    Avatar von suntrop
    suntrop suntrop ist offline Mitglied Brokat
    Registriert seit
    Dec 2001
    Ort
    Köln
    Beiträge
    452
    Sorry, das sind die selben Tabellen, nur das Prefix fehlt.
    Richtig, der Ersteller soll immer auf sein Projekt Zugreifen dürfen.

    Hier mal meine anderen Versuche …

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    SELECT p_projects.id, title, permission, project_id, user_id
    FROM  `p_projects`
     
    LEFT JOIN p_project_permissions
      ON ( p_project_permissions.project_id = p_projects.id )
     
     
     
    /*
    IF( p_projects.permission = selected,user_id=2,1=1)
     
    IF( p_projects.permission = selected, WHERE user_id = 2) 
     
    WHERE
      CASE  WHEN p_projects.permission = 'selected'  THEN  user_id = 2 END
     
    */
     

  6. #6
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Ich denke für diesen Fall wäre ein UNION wesentlich besser als diese IF-Abfragen.

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    
    SELECT id, title FROM p_projects WHERE permissions = 'all'
    UNION
    SELECT id, title FROM p_projects WHERE permissions = 'privat' AND created_by_user_id = $USERID
    UNION
    SELECT id, title FROM p_projects
    JOIN (project_permissions) ON (p_project_permissions.project_id = p_projects.id AND p_project_permissions.user_id = $USERID)
    WHERE permissions = 'selected'


    Edit: Und falls im Falle von "selected" der Ersteller nicht nochmal extra in der permissions Tabelle auftaucht, kannst du das auch noch mit rein nehmen.


    Code sql:
    1
    2
    3
    4
    5
    6
    7
    
    SELECT id, title FROM p_projects WHERE permissions = 'all'
    UNION
    SELECT id, title FROM p_projects WHERE permissions IN ('privat', 'selected') AND created_by_user_id = $USERID
    UNION
    SELECT id, title FROM p_projects
    JOIN (project_permissions) ON (p_project_permissions.project_id = p_projects.id AND p_project_permissions.user_id = $USERID)
    WHERE permissions = 'selected'
    Geändert von CPoly (12.11.11 um 20:52 Uhr)
    suntrop bedankt sich. 

  7. #7
    Avatar von Lime
    Lime Lime ist offline frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    374
    Für was genau willst du die Projekte auslesen?
    Liest der Benutzer SEINE Projekte aus?
    Liest du die Projekte von bestimmten Benutzern aus (control panel)?
    Liest ein anderer Benutzer die Projekte aus (auch von anderen Benutzern), wo er dran arbeiten kann?

    kompliziert ich weis...

    €:
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    
    SELECT id, title FROM p_projects WHERE permissions = 'all'
    UNION
    SELECT id, title FROM p_projects WHERE permissions = 'privat' AND created_by_user_id = $USERID
    UNION
    SELECT id, title FROM p_projects
    JOIN (p_project_permissions) ON (p_project_permissions.project_id = p_projects.id AND p_project_permissions.user_id = $USERID)
    WHERE permissions = 'selected'
    nur den einen tabellennamen richtiggestellt....
    suntrop bedankt sich. 

  8. #8
    Avatar von suntrop
    suntrop suntrop ist offline Mitglied Brokat
    Registriert seit
    Dec 2001
    Ort
    Köln
    Beiträge
    452
    Mit dem €3 Code erhalte ich diese Fehlermeldung …

    SELECT id, title
    FROM p_projectsIF( p_projects.permission = selected,
    INNER JOIN p_project_permissions ON p_project_permissions.project_id = p_projects.id
    WHERE p_project_permissions.user_id =1 )
    LIMIT 0 , 30

    MySQL meldet:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF(
    p_projects.permission = selected,
    INNER JOIN p_project_permissio' at line 3

    … außerdem logt verliert PHPMyAdmin die Verbindung zur Datenbank****** Das hatte ich bisher auch noch nicht
     

  9. #9
    Avatar von Lime
    Lime Lime ist offline frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    374
    Ok, das ist nicht gut. also hab damit jetzt nicht viel Erfahrung, könnte mir nur einen Formatierungsfehler vorstellen.

    SELECT id, title
    FROM p_projects
    IF( p_projects.permission = selected,
    INNER JOIN p_project_permissions ON p_project_permissions.project_id = p_projects.id
    WHERE p_project_permissions.user_id =1 )
    LIMIT 0 , 30

    vor dem IF war kein Abstand drin..., aber obs daran liegt? Ich bastel zu wenig mit Mysql, dass ich solche fehler ausschließen könnte...
     

  10. #10
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    An der Stelle wo ihr das "IF" habt, wird eben keines erwartet. Es wird z.B. ein WHERE erwartet. So kann man das IF nicht verwenden.
     

  11. #11
    Avatar von suntrop
    suntrop suntrop ist offline Mitglied Brokat
    Registriert seit
    Dec 2001
    Ort
    Köln
    Beiträge
    452
    Super! Das mit dem UNION funktioniert

    Besten Dank an euch beide für die Unterstützung!

    Das mit dem IF muss ich mir nochmal ansehen, warum das an dieser Stelle nicht verwendet werden darf. Und UNION muss ich mir in jedem Fall auch ansehen
     

  12. #12
    Avatar von Lime
    Lime Lime ist offline frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    374
    Ich kuck mir UNION auch mal an, kenn ich selber auch noch nicht.
    Meine Abfragen waren entweder total simpel - oder eben auch total "deppad". Ne Abfrage, die man nur mit Nachdenken lösen könnte, hatte ich selber noch nie. Immer gleich die voll gestörten Probleme mit sehr extravaganten Lösungen...

    PS: Darf man Erfahren, was das Projekt (über Projekte) für ein Projekt ist? (wer bietet mehr Projekt-Wörter in einem Satz? )
     

  13. #13
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    UNION ist nichts weiter als die Vereinigung der Ergebnisse mehrerer getrennter Abfragen zu einer. Zu beachten ist, dass die Anzahl und der Typ der jeweiligen Felder der Abfragen identisch sind.
    Lime bedankt sich. 

  14. #14
    Avatar von Lime
    Lime Lime ist offline frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    374
    Also theoretisch könnte man drei Abfragen vereinen, wenn jetzt zwei Abfragen jeweils ein Ergebnis ausspucken (dass Ergebnis ist beide Male dasselbe), kommt das Ergebnis dann zwei Mal oder nur einmal raus?
     

  15. #15
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Wenn zwei Abfragen ein identisches Ergebnis liefern, bekommst du das zwei mal. Das ist ja bei einem normalen SELECT genauso. Du kannst wie bei SELECT ein DISTINCT benutzen, um es eindeutig zu machen.
    Lime bedankt sich. 

Ähnliche Themen

  1. Einen bestimmten Wert übergeben
    Von Alice im Forum PHP
    Antworten: 22
    Letzter Beitrag: 15.05.10, 01:02
  2. Antworten: 2
    Letzter Beitrag: 29.01.09, 14:13
  3. Antworten: 1
    Letzter Beitrag: 03.02.06, 13:47
  4. Bei bestimmten Wert <select>-Feld generieren...
    Von Sebigf im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 15.09.05, 17:11
  5. einen Bestimmten wert aus der Datenbank lesen
    Von stefanrichardmueller im Forum PHP
    Antworten: 4
    Letzter Beitrag: 06.08.04, 23:10