Eine Funktion mehrere Optionen
Jnnbo
- mysql
- php
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?
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
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) {
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);
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
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.
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?
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();
[.....]
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.
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