Archivo Explosivo: MySQL

FIAE – Datenbanken & SQL – Diverse SQL Befehle

Definitionen
– DB – Database
– DBS – Data Base System
– DBMS – Datenbankmanagementsystem
– DBS = DB + DBMS
– Systematische Beschreibung, Speicherung und Wiedergewinnung von Datenmengen
– DB – Database/Datenbank – enthält mehrere Tabellen
– Tabelle ist die logische Zusammenfassung von Datensätzen
– Datensatz: Zusammenfassung logischer Attribute
– Attribut – Zelleninhalt – kleinste Logische Einheit
– Zeichen: Kleinste speicherbare Einheit
– …

Probleme der Datenhaltung
– Datenredundanz
– Dateninkonsistenz
– Effiziens
– Datenschutz
– Datensicherheit

Drei-Ebenen-Konzept
Externe Ebene -> Konzeptionelle Ebene -> Interne Ebene

  • Konzeptionelle Ebene: Datenmodell aus der realen Welt
    • Logische Gesamtsicht auf die Datenbank
    • Festlegung der Datenoperationen
    • Beschreibung der Beziehungen (Integritätsbedingungen)
  • Interne Ebene
    • Physische Speicherung
    • DBMS
    • Speicherlogik
    • Zugriff über konzeptionelle Ebene
    • Endanwenderzugriff über externe Ebene
  • Externe Ebene
    • Anwenderebene
    • Zugriff auf DBS mit
      • Abfragesprache (DQL – Data Query Language)
      • Datenmanipulationssprache (DML – Data Manipulation Language)
      • Anwendung

Datenbanksysteme
– Dateisysteme
– Prärelationale Datenbanken
– Relationale Datenbanken
– Postrelationale Datenbanken
– Objektorientierte Datenbanken
– Mehrdimensionale Datenbanken
– Verteilte Datenbanken
– Zeitorientierte Datenbanken
– …

Vorteile Relationaler Datenbanken
– Redundanzfreie Speicherung
– Integrierte Kontrolle auch bei verteilten Systemen
– Multiuserbetrieb
– Hohe Performance
– Datenkapselung (Veränderung der Attribute durch Methode des Objekts)
– Methoden sind Bestandteile der Objekte (Klassen)
– Nachrichtenkommunikation (Objekte rufen sich gegenseitig auf)
– Referentielle Integrität
– …

Probleme bei Redundanzen
– Update Anomalies
– Insertion Anomalies
– Deletion Anomalies
– …

Grundsätze der Modellierung
– Keine Redundanzen
– Eindeutigkeit
– Keine Prozessdaten
Datenmodelle vermeiden Komplexität

Modelle
– Hierarchisches Modell: Jedes Datenobjekt hat genau einen Vorgänger (Bis auf die oberste Ebene)
– Netzwerkorientiertes Modell: Jedes Datenobjekt hat mindestens einen Vorgänger (Bis auf die oberste Ebene)
– Relationales Modell:
– Anordnung in zweidimensionalen Tabellen
– Jede Tabelle besitzt einen eindeutigen Relationsnamen
– Alle Zeilen einer Tabelle heißen Relation
– Jede einzelne Zeile heißt Tupel (Datensatz)
– Jede einzelne Zeile wird auch als Entität bezeichnet
– Spaltennamen sind die Attributnamen
– Alle Attributsnamen heißen Relationsschema
– …

Schlüsselarten
– Natürlicher Schlüssel
– Künstlicher Schlüssel (artificial)
– Primärschlüssel
– Fremdschlüssel
– Superschlüssel
– …

ERM – Entity Relationship Model
– Entität: Gegebene Größe, Objekt
– Rechteck/Quadrat: Entity-Typ
– Kreis: Attribut
– Raute: Beziehungstyp

Relationen
– 1:1 (one to one)
– 1:n (one to many)
– n:m (many to many)
– 1:1:1 (tripplet)

Relations Notation
– Chen Er-Notation (1976)
– Oracle Notation (Krähenfußdiagramm)
– …

-- Mehrzeilige Kommentare
/* Datenbanken anzeigen */

-- Einzeilige Kommentare
#Datenbanken anzeigen

-- Neue Datenbank erstellen:
CREATE DATABASE DATENBANKNAME;

-- Verfügbare Speicher-Engines anzeigen lassen
SHOW ENGINES;

-- Alle Datenbanken anzeigen
show databases;

-- Datenbank löschen
DROP DATABASE DATENBANKNAME;

-- Aktive Datenbank festlegen   
-- use DATENBANKNAME;

-- Tabelle erstellen
CREATE TABLE TABELLENNAME (...);

-- Tabelle erstellen mit mehreren Spalten
CREATE TABLE TABELLENNAME(SPALTE1 varchar(100), SPALTE2 varchar(100), SPALTE3 date, ...);

-- Tabellen in aktueller Datenbank anzeigen
SHOW TABLES;

-- Tabellenspalten anzeigen
SHOW COLUMNS FROM TABELLENNAME;

-- Tabelle löschen
DROP TABLE TABELLENNAME;

-- Daten in Tabelle einfügen
INSERT INTO TABELLENNAME(SPALTE1, SPALTE2, SPALTE3, ...) VALUES (WERT1, WERT2, WERT3, ...);
INSERT INTO TABELLE1 SET SPALTE = WERT, SPALTE2 = WERT2, ...;

-- Kompletten Inhalt der Tabelle anzeigen
SELECT * FROM TABELLENNAME;

-- Nur bestimmte Spalten anzeigen
SELECT SPALTE1, SPALTE2, SPALTE3 FROM TABELLENNAME;

-- Doppelte Zeilen zusammenfassen
SELECT DISTINCT * FROM TABELLENNAME;

-- Alle Datensätze anzeigen
SELECT ALL * FROM TABELLENNAME;

-- Nur bestimmte Zeilen anzeigen mit WHERE-Bedingungen
SELECT * FROM TABELLENNAME WHERE SPALTE1 = WERT1;

-- Auswahl von Zeilen mit LIKE-Bedingung
SELECT * FROM TABELLENNAME WHERE SPALTE1 LIKE "WERT1%";
-- % ist ein Platzhalter für beliebige Zeichen die vorkommen können
-- _ ist ein Platzhalter für genau 1 Zeichen

-- Alle Zeilen die ein Zeichen gefolgt von einem n haben und kein n am Ende des Feldes
SELECT * FROM TABELLENNAME WHERE SPALTE1 LIKE "%_n%" AND SPALTE1 NOT LIKE "%n";

-- Alle Zeilen die ein on oder ein an enthalten und am ende kein n haben
SELECT * FROM TABELLENNAME WHERE (SPALTE1 LIKE "%on%" OR SPALTE1 Like "%an%") AND SPALTE1 NOT LIKE "%n";

-- Einschränkung der Datensätze mit BETWEEN
SELECT * FROM TABELLENNAME WHERE SPALTE1 BETWEEN 1 AND 3;

-- Einschränkung der Datensätze mit IN
SELECT * FROM TABELLENNAME WHERE SPALTE1 IN("1981-06-24","1965-05-12","1992-07-24","1904-01-13");

-- Funktion zum Zählen von Werten
SELECT COUNT(SPALTE1) FROM TABELLENNAME;

-- Datensätze gruppieren
SELECT COUNT(*),SPALTE1 FROM TABELLENNAME GROUP BY SPALTE1;

-- Sortierung von Datensätzen für die Ausgabe
SELECT * FROM TABELLENNAME ORDER BY SPALTE1;

-- absteigend sortieren
SELECT * FROM TABELLENNAME ORDER BY SPALTE1 DESC;

-- aufsteigend sortieren
SELECT * FROM TABELLENNAME ORDER BY SPALTE1 ASC;

-- Mehrere Spalten sortieren
SELECT * FROM TABELLENNAME ORDER BY SPALTE1, SPALTE2, SPALTE3 ASC;

-- Sonderfall sortieren eines Enum-Feldes (Auflistungsfeld)
SELECT * FROM TABELLENNAME ORDER BY FIELD(SPALTE1, 'Wert1','Wert2','Wert3'), Spalte2 ASC;

-- Oder:
SELECT * FROM TABELLENNAME ORDER BY CONCAT(SPALTE1),SPALTE2;

-- Nicht alle Datensätze auf einmal anzeigen mit Limit
SELECT * FROM TABELLENNAME Limit 10;

-- Anfang des Limits festlegen
SELECT * FROM TABELLENNAME Limit 5;
SELECT * FROM TABELLENNAME Limit 0,5;
SELECT * FROM TABELLENNAME Limit 5,5;
SELECT * FROM TABELLENNAME Limit 10,5;
SELECT * FROM TABELLENNAME Limit 15,5;

- Umbenennen von Tabellenspalten bei der Ausgabe
SELECT SPALTE1ALT AS SPALTE1NEU FROM TABELLENNAME;

-- Funktionen in MySQL
-- zählen
COUNT(*);
-- MaximalWert
MAX(SPALTE1);
-- MinimalWert
MIN(SPALTE1);
-- Durchschnitt
AVG(SPALTE1);

-- Nur das Jahr anzeigen
SELECT DAY(SPALTE1) AS Tag, MONTH(SPALTE1) AS Monat, YEAR(SPALTE1) AS SPALTE1NEU FROM TABELLENNAME;

-- Datum formatieren
SELECT Name, DATE_FORMAT(SPALTE1,"%d.%m.%Y") AS datum FROM TABELLE WHERE SPALTE1 IS NOT NULL;

-- Einfache Abfragen über mehrere Tabellen
-- Wenn Spaltennamen bei mehreren Tabellen gleich sind schreibt man den Tabellennamen und einen Punkt davor

SELECT * FROM TABELLE1, TABELLE2;
SELECT * FROM TABELLE1, TABELLE2 WHERE BEDINGUNG1 = ERFÜLLUNG1 AND BEDINGUNG2 = ERFÜLLUNG2;

-- JOINS
-- INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, NATURAL JOIN, CROSS JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, 
-- Classic Join
SELECT * FROM TABELLE1, TABELLE2 WHERE BEDINGUNG1 = ERFÜLLUNG1;
SELECT * FROM TABELLE1, TABELLE2, TABELLE3 WHERE TABELLE1.SPALTE1 = TABELLE2.SPALTE2 AND TABELLE1.SPALTE1 = TABELLE3.SPALTE3;

-- Inner Join
SELECT * FROM TABELLE1 INNER JOIN TABELLE2 ON TABELLE1.SPALTE1 = TABELLE2.SPALTE2;

-- LEFT JOIN
SELECT * FROM TABELLE1 LEFT JOIN TABELLE2 ON TABELLE1.SPALTE1 = TABELLE2.SPALTE2;

 -- Löschen von Datensätzen
 -- Achtung kein Undo möglich
 DELETE FROM TABELLE WHERE BEDINGUNG = ERFÜLLUNG;

-- Zeilen aus verschiedenen Datenbanktabellen zusammenfügen
SELECT SPALTE1, SPALTE2 FROM TABELLE1 UNION SELECT SPALTE3,SPALTE4 FROM TABELLE2;

-- ...oder mehrere Abfragen auf eine Tabellen zusammenfügen
SELECT SPALTE1, SPALTE2 FROM TABELLE1 WHERE BEDINGUNG1 = ERFÜLLUNG1 UNION SELECT SPALTE3, SPALTE4 FROM TABELLE2 WHERE BEDINGUNG2 = ERFÜLLUNG2;

-- Unterabfragen
SELECT * FROM TABELLE1 WHERE BEDINGUNG1 = (SELECT MAX(SPALTE2) FROM TABELLE1);
SELECT (SELECT max(SPALTE1) FROM TABELLE1) AS "Neuer Bezeichner" ,SPALTE2,SPALTE3 FROM TABELLE1;
SELECT *,concat(ROUND(SPALTE1/(SELECT MAX(SPALTEX) FROM TABELLE1)*100, 0), "%") AS 'Neuer Bezeichner' FROM TABELLE1;

-- ErzeugerCode einer Tabelle anzeigen
SHOW CREATE TABLE TABELLE1;

-- Zeichenkodierung in Mysql umstellen
SET NAMES "CP850";

-- Variablen von MySQL anzeigen
SHOW VARIABLES;

-- Nachträgliches anpassen von Tabellenstrukturen (Datentyp)
ALTER TABLE TABELLE1 MODIFY SPALTE DATENTYP(DEFINITION);

-- Umbenenen von Spalten
ALTER TABLE TABELLE1 CHANGE SPALTE-ALT SPALTE-NEU DATENTYP(DEFINITION);

-- Hinzufügen einer neuen Spalte nach einer anderen Spalte
ALTER TABLE TABELLE1 ADD NEUE-SPALTE DATENTYP(DEFINITION) NOT NULL DEFAULT 0 AFTER ALTE-SPALTE;

-- Index erstellen
CREATE INDEX INDEXNAME ON TABELLE1(SPALTE1);

-- Index löschen
DROP INDEX INDEXNAME ON TABELLE1;

-- Rechtevergabe
GRANT SELECT ON DATENBANK.TABELLE TO BENUTZERNAME@HOST;

-- Neuer Benutzer
CREATE USER 'BENUTZERNAME'@'%' IDENTIFIED BY 'PASSWORT';

-- Rechte für den neuen Benutzer angeben
GRANT ALL ON DATENBANK.* TO BENUTZERNAME@'%';
GRANT ALL ON *.* TO BENUTZERNAME@'%';

-- Rechtetabelle neu einlesen
FLUSH PRIVILEGES;

-- Rechte anzeigen
SHOW GRANTS;
SHOW GRANTS FOR BENUTZERNAME@HOST;

-- Rechte entziehen
REVOKE SELECT ON DATENBANK.* FROM BENUTZERNAME@HOST;
REVOKE ALL ON *.* FROM BENUTZERNAME@HOST;

-- Transaktionen
START TRANSACTION;
SELECT * FROM TABELLE1;
SELECT * FROM TABELLE2;
COMMIT;

START TRANSACTION;
UPDATE TABELLE1 SET wert = wert - 500 WHERE BEDINGUNG = ERFÜLLUNG;
UPDATE TABELLE2 SET wert = wert + 500 WHERE BEDINGUNG = ERFÜLLUNG;
SELECT * FROM TABELLE1;
SELECT * FROM TABELLE2;

-- Transaktion rückgängig machen
ROLLBACK;

-- It's a kind of magic... ;-)
SELECT DISTINCT
titel.nummer AS 'Track',
titel.name  AS 'Titel', 
album.bezeichnung AS 'Album', 
label.name AS 'Label', 
interpret.name AS 'Künstler',
genre.bezeichnung AS 'Genre'
FROM album
LEFT JOIN titel ON album.ean = titel.album_ean
LEFT JOIN interpret ON interpret.id = titel.interpret_id 
LEFT JOIN label ON album.ean = label.album_ean
LEFT JOIN genre ON genre.bezeichnung = titel.genre_bezeichnung
WHERE interpret.name LIKE '%Pink%'
ORDER BY titel.id ASC;

Weiterer Artikel zu Datenbanken:blog.phaziz.com/fiae-oop-objektorientierte-programmierung-normalisierung-in-relationalen-datenbanken/

MySQL Dokumentation: dev.mysql.com/doc/

Permalink
26. Januar 2017
AllgemeinFIAEMySQLProgrammierung
Archivo Explosivo: MySQL

Constructr CMS 3.0

ConstructrCMS (https://github.com/phaziz/ConstructrCMS-3) based on FatFree-Framework, Materialize CSS, MySQL/PDO, jQuery/Javascript and Passion!

That’s it for now (Version 3.0 / 2015-07-29):

– Page-Management
– Create, edit, re-order/order, activate/deactivate and delete Pages
– Page specific CSS- and JS-Content
– Markdown Content-Management with Live-Preview
– Create, edit, re-order/order, activate/deavtivate and delete Content-Elements
– Template-Management
– EASY PHP-Templates
– Asset-Management (Uploads) with Live-Preview
– Add, edit, delete, Uploads
– User Management
– Create, edit, delete User-Accounts
– User Rights-Management
– Activate/Deactivate UserRight
– User Password resetting

INSTALLATION:
– VISIT THE INSTALLER AT http://yourdomain.tld/CONSTRUCTR-CMS-SETUP/

CHANGELOG
– 2015-07-29 AutoInsert Markdown for Files / little Bugfixes and minor Features
– 2015-07-28 Webinstaller / little Bugfixes and minor Features
– 2015-07-23 Grande Update IV…
– 2015-03-23 Grande Update III…
– 2015-03-21 Grande Update II…
– 2015-03-19 Grande Update…
– 2015-03-18 Initial commit

Archivo Explosivo: MySQL
ConstructrCMS 2.0

Constructr CMS 2.0

Bald ist es soweit – Constructr CMS Version 2.0 auf Basis eines neuen PHP-Frameworks (FatFree)…

weiterlesen >

Archivo Explosivo: MySQL
PHP PDO

PDO in Slim

Schreibt doch keiner mehr pures MySQL mit den entsprechenden PHP-Funktionen… Deshalb eine Anbindung im PHP PDO Style in Slim:

In der index.php im Root-Level wird PDO eingebunden und instanziert:



    $HOSTNAME = "DATENBANK_HOST";
    $DATABASE = "DATENBANK";
    $USERNAME = "BENUTZERNAME";
    $PASSWORD = "PASSWORD";

    try
    {
        $DBCON = new PDO("mysql:host=" . $HOSTNAME . ";dbname=" . $DATABASE,$USERNAME,$PASSWORD,
            array
            (
                PDO::ATTR_PERSISTENT => true
            )
        );

        $DBCON -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    }
    catch (PDOException $e)
    {
        die();
    }

Danach kann PDO in den gewünschten Routen benutzt werden:


    ...
    try {
        $ORDERS = $DBCON -> prepare('SELECT * FROM ...;');
        $ORDERS -> execute();
    } catch (PDOException $e) {
        echo $e -> getMessage();
        die();
    }
Archivo Explosivo: MySQL
Idiorm & Paris

Slim Framework und Datenbanken

Wie wahrscheinlich bei jedem andern Framework, gibt es auch bei Slim mehrere Möglichkeiten eine Datenbankanbindung herzustellen.

Natives SQL, Anbindung per PDO, oder eine Anbindung durch ein ORM der Wahl. Wenn es um ORMs geht, kann ich nur eine Empfehlung für die Kombination Idiorm & Paris von Jamie Matthews aussprechen. Wobei Idiorm die Rolle des objekt-relationalen-Mapping’s und Query-Builder’s übernimmt und Paris das „Active Record“-Pattern implementiert. Beide sehr klein und äußerst flink ;-)

Um dieses dynamische Duo mit Slim zu verbinden, müssen die entsprechenden Dateien von Paris & Idiorm heruntergeladen werden und in der Verzeichnisstruktur des Projekts abgelegt werden. In der Index-Datei des Projekts können diese Klassen dann inkludiert und konfiguriert werden:


    ...
    require 'Helper/idiorm.php';
    require 'Helper/paris.php';
    ...

    ORM::configure('mysql:host=MEIN_DATENBANK_HOST;dbname=MEINE_DATENBANK');
    ORM::configure('username','BENUTZERNAME');
    ORM::configure('password','PASSSWORT');
    ORM::configure('logging','false');

    // Primärschlüssel der eingebundenen Tabellen definieren
    ORM::configure('id_column_overrides', array
        (
            'logs' => 'lg_id',
            'tabelle2' => 'primary_id2',
            ...
        )
    );
    ...

Wenn dies ohne Fehlermeldungen im Browser abgeschlossen ist, kann man das Duo in den gewünschten Routen verwenden und seine Abfragen damit gestalten:


    ...
    $LOG = Model::factory('Logs')->create();
    if($LOG instanceof Logs){
        $LOG -> log_timestamp = date('Y-m-d H:i:s');
        $LOG -> log_user_id = $_USERID;
        $LOG -> log_username = $_USERNAME;
        $LOG -> log_txt = 'Logging...';
        $LOG->save();
    }
    ...

Paris und Idiorm auf GitHub.

Archivo Explosivo: MySQL

„Remember Me Safely – Secure Long-Term Authentication Strategies“

„Remember Me Safely – Secure Long-Term Authentication Strategies“ – ein sehr empfehlenswerter Beitrag von Scott Arciszewski auf Resonant Core über Langzeit Authentifizierungs-Mechanismen in PHP/MySQL. Resonant Core – immer wieder lesenswert und sehr informativ.

Permalink
3. Februar 2015
MySQLPHPProgrammierung
Archivo Explosivo: MySQL

Constructr CMS

Ist wieder online mit der aktuellen Version: http://constructr-cms.org

Archivo Explosivo: MySQL
ConstructrCMS 1.04.0

Constructr CMS

Constructr CMS