<?php
/**
* Created by PhpStorm.
* User: Fabian Kramer
* Date: 25.12.2016
* Time: 18:15
*/
error_reporting(E_ALL);
ini_set("display_errors", 1);
define('Dir',__DIR__);
require_once(Dir.'/PDO.Class.php');
define("HOST", "localhost");
define("USER", "drb");
define("PASSWORD", "zensiert");
define("DATABASE", "drb");
if(isset($_POST["Username"], $_POST["Password"]))
{
Connection::Connect(HOST, USER, PASSWORD, DATABASE);
$Query = "SELECT COUNT(*) as Counter FROM benutzer WHERE Benutzername= :User AND Passwort= :Password";
$Params = array(':User' => $_POST["Username"], ':Password' => $_POST["Password"]);
$Result = Connection::Execute($Query, $Params);
if($Result[0]["Counter"] == 0) echo "Fehler";
else echo "Login Erfolgreich";
}else echo "Keine Daten empfangen";
Alles anzeigen
und
<?php
/**
* Created by PhpStorm 9.0.1
* User: Fabian
* Date: 21.02.2016
* Time: 11:47
* Project: D3 Page
* Filename: PDO.Class.php
*/
class Connection{
/**
* Protected damit diese Variabele nicht von außen Manipulierbar ist.
* Wird später zu einem Instanz-Object was von der Vordefinierten PDO-PHP Klasse kommt.
*/
protected static $Database;
public static function Connect($Host, $User, $Password, $database = null){
try{
/**
* Wenn die $database übergeben wurde, dann wird beim Herstellen der Verbindung
* auch gleich die Datenbank ausgewählt.
*
* $database = (wenn) ? dann : sonst;
*/
$database = ($database) ? ';dbname=' . $database : '';
/**
* Neue Instanz der vordefinierten PDO-PHP-Klasse
*
* @params
*
* Parameter werden Übergeben:
* Parameter1: Host und Optional der Datenbanknam
* Parameter2: Benutzername
* Parameter3: Passwort
*/
self::$Database = new PDO('mysql:host=' . $Host . $database, $User, $Password);
/**
* Beim erstellen ist nichts Schief gelaufen.
* Denn bei einem Fehler hätte die Klasse eine Exception ausgeführt.
* Die Verbindung wurde Hergestellt.
*/
return;
}catch (PDOException $e){
/**
* Beim Erstellen einer neien Instanz der Klasse ist ein Fehler aufgetreten.
*
* Abfragen der Daten aus dem Speicher:
*
* Error Message: $e->getMessage()
* Error Code: $e->getCode()
* Error File: $e->getFile()
* Error Line: $e->getLine()
*
*
* Wir haben die Fehlermeldung abgefangen mit der (Exception || Catch) Methode und werfen Sie nach "draußen"
*/
SystemException::ShowException($e);
}
}
public static function Disconnect(){
/**
* Wir setzen die Datenbank auf NULL wodurch der __destruct() der PHP Klasse ausgeführt wird.
*/
self::$Database = null;
}
public static function Execute($SQL, $Params = null){
/**
* Parameter:
*
* $SQL: (String) irgendeine SQL Abfrage! Multiple Queries werden von PDO nicht Unterstützt.
* $Params: (Array) enthält die in der SQL-Query verwendeten Platzhalter und deren Werte.
* Beispiel: $Params = array("name" => "Fabian", "limit" => 1)
*
* Hier erstellen wir eine Kopie von $Params. Die Kopie wird später für Fehler genutzt
*/
$Params_Copy = $Params;
/**
* Die SQL-Query wird Vorbereitet.
*/
$Connection = self::$Database->prepare($SQL);
/**
* Die vordefinierte Query steckt nun als Object in der Variable $Connection.
* Für genaueres Siehe: http://php.net/manual/de/pdo,prepare.php
*
* $Bind_Param: Momentan nur um Platzhalter bei einem Limit nutzen zu können.
* Platzhalter: wie z.B. LIMIT : X, :Y müssen Gebunden werden.
*
* Grund:
*
* Die SQL-Anweisung LIMIT erwartet einen Integer(Ganzzahl) ohne bindParam() wird aber ein String in die Query (an dessen Platzhalter) eingefügt.
* Wir würden also einen Fehler bekommen, da LIMIT "1", "10" nicht valid ist.
* Für genaueres Siehe: http://php.net/manual/de/pdostatement.bindparam.php
*
* $Bind_Param = (wenn) ? Dann : Sonst;
*/
$Bind_Param = ($Params !== null and (strpos($SQL, ' LIMIT :') !== false or strpos($SQL, ' limit :') !== false)) ? true : false;
/**
* Wenn der Array §Params übergeben wurde wird er auf True gesetzt
*/
if($Bind_Param and is_array($Params)){
/**
* Für jedes in $Params als $Key => &$val
* (& bewirkt, das wir $Val als Referenz übernehmen)
* Genaueres zum Thema PDO:: Konstanten Siehe: Http://php.net/manual/de/pdo.constants.php
*/
foreach($Params as $Key => &$Val){
if(is_string($Val))
$Connection->bindParam($Key, $Val, PDO::PARAM_STR);
elseif(is_bool($Val))
$Connection->bindParam($Key, $Val, PDO::PARAM_BOOL);
elseif (is_null($Val))
$Connection->bindParam($Key, $Val, PDO::PARAM_NULL);
elseif (is_numeric($Val))
$Connection->bindParam($Key, $Val, PDO::PARAM_INT);
}
/**
* $Params wird nicht mehr Gebraucht
*/
$Params = null;
}
/**
* Ausführen der SQL-Anweisung
* $Params ist Entwerder ein Array oder NULL.
* Übergabe von NULL zu ->execute() kommt keinem mitgegeben Parameter gleich
*/
if(!$Connection->execute($Params)){
/**
* Beim Ausführen ist ein Fehler aufgetreten
* Der Fehler Steckt in $Connection->errorInfo()
* $Connection->errorInfo() gibt ein Array zurück, Siehe: http://php.net/manual/de/pdo.errorinfo.php
*
* 0 | SQLSTAT error code ( a five characters aplhanumeric identifier defined in the ANSI SQL standard)
* 1 | Driver-specific error code.
* 2 | Driver-specific error message.
*
*
* Es wird ein String gesetzt, der diesen Array auseinander nimmt.
*/
$Error_Info = $Connection->errorInfo();
$SQL_State = $Error_Info[0];
$ErrorCode = $Error_Info[1];
$ErrorMessage = $Error_Info[2];
/**
* Um mit dem Fehler etwas anfangen zu können, Bezeichen wir diese Werte im String
*/
$SQL_State = '(SQLSTATE:' . $SQL_State . ')';
$ErrorCode = '(ErrorCode:' . $ErrorCode . ')';
$ErrorMessage = '(ErrorMessage:' . $ErrorMessage . ')';
/**
* ErrorCode zusammenfügen
*/
$Error = $SQL_State . '|' . $ErrorCode . '|' . $ErrorMessage;
/**
* Um Später auch zu Wissen, bei welcher Query dieser Fehler auftrat, setzen wir-
* die $SQL und $ParaCopy hinten dran.
*
* Überflüssige Leerzeilen in der SQL Entfernen
*/
$SQL = preg_replace('/\s+/', ' ', $SQL);
/**
* Aus dem Array $Params_Copy einen String erstellen
*/
$Params_String = '';
if($Params_Copy){
foreach($Params_Copy as $K => $v){
$Params_String .=($Params_String === '') ? '' : '; ';
$Params_String .=((strpos($K, ':') !== False) ? '' : ':') . $K . ' => ' . $v;
}
}
$Error .= 'Query: ' . $SQL . 'Params: ' .$Params_String;
/**
* Jetzt geben wir den Fehler aus.
* ACHTUNG! in den Parametern §Params könnten Benutzerdaten wie Passwörter enthalten sein!
* Daher sollte der Hier ertellte und Ausgegebene Error-String nicht ausgegeben Werden!
*/
SystemException::ShowCustomException($SQL_State, $ErrorCode, $ErrorMessage);
}
/**
* Beim Ausführen von ->execute() trat kein Fehler auf.
* Jetzt holen wir uns alle Datensätze (Zeilen) die wir bekommen können.
* Dabei setzen wir $result ersteinmla auf NULL.
* Wenn nichts zu holen gab (Wir waren nicht in derh While-Schleife, dann gibt er NULL aus)
*/
$result = null;
while($row = $Connection->fetch(PDO::FETCH_ASSOC)){
/**
* Beim Ersten durchlauf setzen wir $result als Array
*/
if($result === null)
$result = array();
/**
* Sammeln wir die Daten im Array $result
*/
$result[] = $row;
}
/**
* Hier setzen wir $Connection auf null (Nicht unbedingt Notwendig)
*/
$Connection = null;
/**
* Fertig; Wir geben §result nun als Array zurück.
*/
return $result;
}
public static function LasInsertID(){
/**
* Hier stellen wir die Vordefinierte Klasse von PDO zur verfügung.
*/
return self::$Database->lastInsertId();
}
}
Alles anzeigen