<?php
class Permissions
{
private $db;
/*
* schon mal sagen das es ein string wird
* sonst prüft er den datentyp beim setzen
*/
private $userTab = "";
private $modTab = "";
public function __construct(mysqli $db, $userTab, $modTab)
{
$this->db = $db;
$this->modTab = trim($modTab);
$this->userTab = trim($userTab);
}
public function addMod($name)
{
/*
* $var = "text" . $andere . "text"
* ist n tacken schneller
*
* Und ID ist bestimmt auto_increment.
* weglassen in PHP und mySQL die arbeit
* überlassen ;)
*/
$sql = "INSERT INTO " . $this->modTab . "
(`name`)
VALUES
('" . $name . "')";
$this->db->query($sql);
/*
* deprecated : if($this->db->affected_rows <= 0)
* errno ist 0 (somit FALSE) wenn alles glatt
* läuft. besser als ihn zählen zu lassen
*/
if($this->db->errno)
{
throw new Exception("Cannot create section " . $name);
}
return true;
}
public function delMod($ident)
{
$id = $this->getId($ident, $this->modTab);
/**
* string "..." . $var . "..."
* siehe oben
*/
$sql = "DELETE
FROM
" . $this->modTab . "
WHERE
id = " . $id;
$this->db->query($sql);
/**
* siehe oben
*/
if($this->db->errno)
{
/**
* $id? hab eigentlich $ident erwartet ^^
*/
throw new Exception("Cannot delete Mod ".$id);
}
return true;
}
public function getMods()
{
/**
* kennst ja nun die tricks und
* die schleife:
* $mods[] = $row;
* das übernimmt [id] und [name]
* von $row und brauch kein zähler
*/
}
public function addUser($fields = array(), $values = array())
{
/*
* nun wird die größe öfter gebraucht
* daher in variable speichern
*/
$i = count($fields);
$j = count($values);
/*
* hab mal gelesen === ist 10% schneller
* geht hier gut da der typ passt
*/
if( $i === $j)
{
$sql = "INSERT INTO " . $this->userTab . " (";
/*
* die trinität ()? : ; ist
* langsamer als ein if
*/
if ($i)
{
/*
* nicht konform aber " geht
* immernoch schneller als '
*/
$sql .= "`" . implode("`, `", $fields) . "`";
/*
* so bleibt $fields auch ein array
* und musst nicht umgecastet werden
* auf einen string - was wieder zeit
* brauch
*/
}
$sql .= ") VALUES (";
if ($j) {
$sql .= "'" . implode("', '", $values) . "'";
}
$sql .= ")";
}
else
{
throw new Exception("Invalid user data.");
}
$this->db->query($sql);
/*
* siehe oben
*/
if($this->db->errno)
{
throw new Exception("Cannot create user.");
}
}
/*
* bei den folgenden funktionen reichen
* die oben erklärten tricks:
* delUser($ident)
* getUser($ident)
*/
public function getPerms($ident)
{
$id = $this->getId($ident, $this->userTab);
// $sql = ...... - übliche optimierung durch "..." . $var . "..."
if ( $result = $this->db->query($sql) )
{
/*
* im query ist nur perm gefragt
* von daher reicht die schnellste
* variante zum auslesen: fetch_row
*/
$array = $result->fetch_row();
// get perm from array
$perm = $array[0];
}
else
{
throw new Exception("Cannot get permissions of user " . $userId);
}
/*
* hier die schon optimierte
* schleife
*/
return $mods;
}
public function calcPerms($mods)
{
$perms = 0;
// create binary permission data
foreach($mods as $id)
{
/*
* binärer ODER-Vergleich
* Bsp. einer hat recht 4 und 8:
* Recht 4 -> 0100
* ODER
* Recht 8 -> 1000
* ergibt
* Recht 12-> 1100
* usw.
*/
$perms |= $id;
}
return $perms;
}
public function check($user, $mod)
{
$userId = $this->getId($user, $this->userTab);
// bei $sql = ... noch übliche sache mit dem string machen:
if ( $result = $this->db->query($sql) )
{
/*
* wieder mit fetch_row()
*/
$array = $result->fetch_row();
// get perm from array
$perms = $array[0];
}
else
{
throw new Exception("Cannot get permissions of user {$userId}.");
}
/*
* ein bisschen variablen
* und speicher sparen:
*/
$perms >>= $this->getId($mod, $this->modTab);
/*
* nun steht das recht was man
* prüfen will ganz "vorn"
* im binären.
* bsp. :
* recht 12-> 1100
* hat er recht 4? ($this->getId liefert 2)
* 12 >> 2 -> 110
* ist am ende eine 1?
* 110 & 1 -> 0 (FALSE)
*/
/*
* true, false macht der sich schon
* wieder eine trinität weniger ;)
*/
return $perms & 1;
}
private function getId($ident, $table)
{
if( is_numeric($ident) )
{
// direkt rausspringen
return $ident;
}
else
{
// übliche sache noch mit string machen
$sql = "SELECT
`id`
FROM
{$table}
WHERE
name = '{$ident}'
LIMIT 1";
if ( $result = $this->db->query($sql) )
{
// fetch_row
$array = $result->fetch_row();
// direkt return
return $array[0];
}
else
{
return false;
}
}
}
}
?>