Jnnbo: Eine Funktion mehrere Optionen

Moin,

ich muss leider meine Funktion umstellen, da einer der für mich telefoniert nicht sehen soll, welche Kunden ich bereits angelegt habe.

Meine Funktion sieht derzeit so aus:

	function kundenUebersicht($mysqli) {
		$stmt = $mysqli->prepare("SELECT kd_id, kd_code, kd_userID, kd_status, kd_firma, kd_anrede, kd_name, kd_vorname, kd_zusatz, kd_strasse, kd_plz, kd_ort, kd_telefon, kd_handy, kd_fax, kd_email, kd_url, kd_packstationen, kd_notiz, kd_ip, kd_datum, ud_Uid, ud_vorname, ud_name, user_code, user_type 
					   FROM web_kunden
					   LEFT JOIN web_users_detail ON web_users_detail.ud_Uid = web_kunden.kd_userID
					   LEFT JOIN web_users ON web_users.user_code = web_kunden.kd_userID
		");
		$stmt->execute();
		$stmt->bind_result($kd_id, $kd_code, $kd_userID, $kd_status, $kd_firma, $kd_anrede, $kd_name, $kd_vorname, $kd_zusatz, $kd_strasse, $kd_plz, $kd_ort, $kd_telefon, $kd_handy, $kd_fax, $kd_email, $kd_url, $kd_packstationen, $kd_notiz, $kd_ip, $kd_datum, $ud_Uid, $ud_vorname, $ud_name, $user_code, $user_type);
		$stmt->store_result();
	 	
		if($stmt->num_rows() >  0) {     
			while ($stmt->fetch()){
				$kundenUebersicht[] = array( 
					'kd_id' 		=> $kd_id, 
					'kd_code' 		=> $kd_code, 
					'kd_userID' 		=> $kd_userID, 
					'kd_status' 		=> $kd_status, 
					'kd_firma' 		=> $kd_firma, 
					'kd_anrede' 		=> $kd_anrede, 
					'kd_name' 		=> $kd_name, 
					'kd_vorname' 		=> $kd_vorname,
					'kd_zusatz'		=> $kd_zusatz, 
					'kd_strasse' 		=> $kd_strasse, 
					'kd_plz' 		=> $kd_plz, 
					'kd_ort' 		=> $kd_ort, 
					'kd_telefon' 		=> $kd_telefon,
					'kd_handy'		=> $kd_handy,
					'kd_fax'		=> $kd_fax, 
					'kd_email' 		=> $kd_email, 
					'kd_url' 		=> $kd_url, 
					'kd_packstationen' 	=> $kd_packstationen, 
					'kd_notiz'		=> $kd_notiz,
					'kd_ip' 		=> $kd_ip, 
					'kd_datum' 		=> $kd_datum,
					'ud_Uid'		=> $ud_Uid,
					'ud_vorname'		=> $ud_vorname,
					'ud_name'		=> $ud_name,
					'user_code'		=> $user_code,
					'user_type'		=> $user_type
				);
			}
			return $kundenUebersicht;
			}
	}

Damit lese ich einfach alle Daten aus, klappt auch sowiet. Der Aufruf sieht so aus:

$kundenUebersicht = kundenUebersicht($mysqli);

Jetzt möchte ich gerne wenn sich ein Admin einloggt alle Daten habe und wenn sich ein User einloggt, dann nur die, die ihm gehören.

Die Rechte stecken in: $object->user_type (mitarbeiter, administrator)

Der UserCode steckt in: $object->user_code

Wenn ein User kommt, dann müsste ich meiner Funktion dieses mit übergeben: WHERE kd_userID=?

Wenn ein Admin kommt, der brauch kein WHERE, da kann die Funktion bleiben wie sie ist.

Wie würdet ihr nun an die Sachen ran gehen?

  1. Hallo

    Moin,

    ich muss leider meine Funktion umstellen, da einer der für mich telefoniert nicht sehen soll, welche Kunden ich bereits angelegt habe.

    $kundenUebersicht = kundenUebersicht($mysqli);
    

    Jetzt möchte ich gerne wenn sich ein Admin einloggt alle Daten habe und wenn sich ein User einloggt, dann nur die, die ihm gehören.

    Die Rechte stecken in: $object->user_type (mitarbeiter, administrator)

    Der UserCode steckt in: $object->user_code

    Wenn ein User kommt, dann müsste ich meiner Funktion dieses mit übergeben: WHERE kd_userID=?

    Wenn ein Admin kommt, der brauch kein WHERE, da kann die Funktion bleiben wie sie ist.

    Setze den Query in Abhängigkeit von user_type unterschiedlich zusammen oder halte in der Funktion beide Queries vor und wähle – mit der selben Abhängigkeit – einen davon aus.

    Tschö, Auge

    --
    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
    1. Hallo Auge,

      Setze den Query in Abhängigkeit von user_type unterschiedlich zusammen oder halte in der Funktion beide Queries vor und wähle – mit der selben Abhängigkeit – einen davon aus.

      du meinst der Funktion ein paar Optionen übergeben und dann so auswerten?

      function kundenUebersicht($mysqli, $UserCode=false, $UserRechte=false) {
      
    2. Hallo Auge,

      bin ich damit auf dem richtigen Weg?

      	function kundenUebersicht($mysqli, $UserCode=false, $UserRechte=false) {
      		$select = "SELECT kd_id, kd_code, kd_userID, kd_status, kd_firma, kd_anrede, kd_name, kd_vorname, kd_zusatz, kd_strasse, kd_plz, kd_ort, kd_telefon, kd_handy, kd_fax, kd_email, kd_url, kd_packstationen, kd_notiz, kd_ip, kd_datum, ud_Uid, ud_vorname, ud_name, user_code, user_type 
      									FROM web_kunden
      									LEFT JOIN web_users_detail ON web_users_detail.ud_Uid = web_kunden.kd_userID
      									LEFT JOIN web_users ON web_users.user_code = web_kunden.kd_userID";
      		
      		
      		if ($UserCode == 'mitarbeiter') {
      		
      			if ($UserCode) {
      				$stmt = $mysqli->prepare($select . "WHERE kd_userID =?" );
      				$stmt->bind_param("s", $UserCode);
      			} else {
      				$stmt = $mysqli->prepare($select);
      			}
      		
      		}
      		$stmt = $mysqli->prepare($select);
      [......]
      

      Der Aufruf dann so:

      $kundenUebersicht = kundenUebersicht($mysqli, $object->user_code, $object->user_type);
      
      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        bin ich damit auf dem richtigen Weg?

        
        > 			if ($UserCode) {
        > 				$stmt = $mysqli->prepare($select . "WHERE kd_userID =?" );
        
        vergiss das Leerzeichen nicht im Statement vor dem WHERE
        
        
        > 				$stmt->bind_param("s", $UserCode);
        > 			} else {
        > 				$stmt = $mysqli->prepare($select);
        > 			}
        
        

        Ich würde das trotzdem anders machen. Heute unterscheidest Du nur zwischen Administratoren und Mitarbeitern, morgen darf Mitarbeiter 2 nicht im Kundenstamm von Mitarbeiter 7 und 8 rumfummeln usw.

        Außerdem bietet sich für eine Kapselung von (vertikalen) Zugriffsrechten immer eine Strored Routine an. Da kann man dann auch Logging fürs Select einbauen. Horizontale Zugriffsrechte kann man auch direkt über das Berechtigungssystem von MySQL regeln, wenn es richtig hart werden soll und dies ebenfalls in der Strored Routine verankern.

        Das hat dann den Vorteil, dass man mit beliebigen APIs auf das DBMS zugreifen kann und für alle die gleichen Regeln gelten.

        Spirituelle Grüße
        Euer Robert
        robert.r@online.de

        --
        Möge der wahre Forumsgeist ewig leben!
        1. Hallo robertroth,

          Ich würde das trotzdem anders machen. Heute unterscheidest Du nur zwischen Administratoren und Mitarbeitern, morgen darf Mitarbeiter 2 nicht im Kundenstamm von Mitarbeiter 7 und 8 rumfummeln usw.

          ich habe dein Posting schon gelesen. Nur mir geht es derzeit darum dass mein „Mitarbeiter“ telefonieren kann und meine Daten nicht sieht. Dass meine Berechtigungen nicht ganz optimal sind weiß ich. Auch hast du eine Interessante Option „Usergruppen“ angesprochen, an die ich selber noch gar nicht gedacht habe.

          Aber ich muss ein Schritt nach dem anderen gehen. Nebenher muss auch bisschen Geld rein kommen, daher jetzt erstmal die schnelle Variante.

        2. Hallo robertroth,

          ich verstehe es nicht wirklich, meine Funktion rufe ich so auf:

          $kundenUebersicht = kundenUebersicht($mysqli, $object->user_code, $object->user_type);
          

          In $object->user_code steht der Code und in $object->user_type steht entweder mitarbeiter oder administrator. Hab beides per echo getestet.

          In meiner Funktion

          function kundenUebersicht($mysqli, $UserCode=false, $UserRechte=false) {
          [.....]
          		if ($UserCode == 'administrator') {
          		
          			if ($UserCode) {
          				$stmt = $mysqli->prepare($select . "WHERE kd_userID =?" );
          				$stmt->bind_param("s", $UserCode);
          			} else {
          				$stmt = $mysqli->prepare($select);
          			}
          		
          		}
          

          Wird dieser Bereich überhaupt nicht mehr berücksichtigt, aber warum? Übergebe ich irgendwie die Werte falsch?

          1. Hallo robertroth,

            ok, ich glaube ich habe es. Meine Test war erfolgreich:

            	function kundenUebersicht($mysqli, $UserCode=false, $UserRechte=false) {
            		$select = "SELECT 
            				kd_id, 
            				kd_code, 
            				kd_userID, 
            				kd_status, 
            				kd_firma, 
            				kd_anrede, 
            				kd_name, 
            				kd_vorname, 
            				kd_zusatz, 
            				kd_strasse, 
            				kd_plz, 
            				kd_ort, 
            				kd_telefon, 
            				kd_handy, 
            				kd_fax, 
            				kd_email, 
            				kd_url, 
            				kd_packstationen, 
            				kd_notiz, 
            				kd_ip, 
            				kd_datum, 
            				ud_Uid, 
            				ud_vorname, 
            				ud_name, 
            				user_code, 
            				user_type 
            					
            			FROM web_kunden
            			LEFT JOIN web_users_detail ON web_users_detail.ud_Uid = web_kunden.kd_userID
            			LEFT JOIN web_users ON web_users.user_code = web_kunden.kd_userID";
            
            		if ($UserRechte == 'mitarbeiter') {
            		
            			if ($UserCode) {
            				$stmt = $mysqli->prepare($select . " WHERE kd_userID =?" );
            				$stmt->bind_param("s", $UserCode);
            			} else {
            				$stmt = $mysqli->prepare($select);
            			}
            		
            		} else {
            				$stmt = $mysqli->prepare($select);
            			}
            		
            		$stmt->execute();
            [.....]
            
          2. Tach!

            Wird dieser Bereich überhaupt nicht mehr berücksichtigt, aber warum? Übergebe ich irgendwie die Werte falsch?

            Solche Fragen beantwortet dir das Debugging. Kontrollausgaben mit var_dump() sind das einfachste Mittel.

            dedlfix.

  2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

    ich muss leider meine Funktion umstellen, da einer der für mich telefoniert nicht sehen soll, welche Kunden ich bereits angelegt habe.

    Wie würdet ihr nun an die Sachen ran gehen?

    Ich würde erst einmal das Datenmodell durchdenken und dann den Aufwand abschätzen. Ggf. musst Du die reine Datentabelle aufteilen in diejenigen Daten, die jeder sehen darf und solche, die nur bevorzugte User sehen dürfen.

    Um vertikale Rechte verwalten zu können, benötigst Du im Prinzip für jeden User, der einen Datensatz sehen darf, in einer Berechtigungstebelle die ID des Datensatzes und die die ID des Users. Es könnten ja mehrere User berechtigt sein. Außerdem könntest Du auch mit Gruppen arbeiten, damit Du nicht jeden User individuell behandeln musst.

    Spirituelle Grüße
    Euer Robert
    robert.r@online.de

    --
    Möge der wahre Forumsgeist ewig leben!