php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 14-11-2008, 19:06
sql_newbie_67
 Newbie
Links : Onlinestatus : sql_newbie_67 ist offline
Registriert seit: Nov 2008
Beiträge: 20
sql_newbie_67 ist zur Zeit noch ein unbeschriebenes Blatt
Question [SQL allgemein] leere strings verbieten

hi

ist es denn möglich beim erstellen einer tabelle für eine spalte anzugeben, das man keine leeren strings einfügen darf. also nicht NULL sonder ""

ich will einfach verhindern das jemand ausversehen leere einträge macht. aber bisher habe ich nichts gefunden womit das gehen könnte. man kann es zwar mit php oder javascript abfragen, aber es wäre schöner es direkt an der quelle zu verbieten

habt ihr ne idee? danke!
Mit Zitat antworten
  #2 (permalink)  
Alt 14-11-2008, 19:33
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

http://dev.mysql.com/doc/refman/5.1/...e-trigger.html
Mit Zitat antworten
  #3 (permalink)  
Alt 14-11-2008, 19:43
sql_newbie_67
 Newbie
Links : Onlinestatus : sql_newbie_67 ist offline
Registriert seit: Nov 2008
Beiträge: 20
sql_newbie_67 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ok also ich weis jetzt wie man den trigger erstellt. aber wie sieht die abfrage aus die ich dann machen muss.
Code:
CREATE TRIGGER triggername
BEFORE INSERT ON tabellenname
FOR EACH ROW IF(spaltenname='') EXIT
so ähnlich???

ich hab grad noch woanders gelesen, das es auch eine check funktion gibt, die man direkt hinter der spalte einfügen kann. aber ich kann in der mysql doku nichts darüber finden. kann es sein das die doku ziemlicher mist ist? man findet irgendwie nie was man sucht

Geändert von sql_newbie_67 (14-11-2008 um 20:21 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 14-11-2008, 21:16
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

CHECK kannst du vergessen, denn AFAIK es wird nicht beachtet bei allen storage engines.

TRIGGER würde ich AFTER INSERT prüfen und ggf. löschen, denn BEFORE nützt dir nichts, es sei denn du packst dein INSERT in einer Transaction, dann kannst du in BEFORE INSERT ein Variable setzten und anschliessend abhängig davon entweder COMMIT oder ROLLBACK ausführt.
Mit Zitat antworten
  #5 (permalink)  
Alt 14-11-2008, 21:38
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Wenn man es direkt beim CREATE TABLE an die Spaltendefinition anhängen kann, dann findet man es hier bei CREATE TABLE. Dort liest man aber "The CHECK clause is parsed but ignored by all storage engines." Bringt dir also nichts.

So ein EXIT wie in deinem Beispiel gibt es nicht. Das INSERT wird auf jeden Fall ausgeführt. Es sei denn, es tritt ein Fehler auf.
Diesen Umstand mußt du ausnutzen. Du mußt einen Fehler provozieren. Wie das geht (und wie man dabei sogar eine sinnvolle Fehlermeldung bekommen kann), wird hier beschrieben.

Wenn du es so machst, wie asp2php vorgeschlagen hat, weiß deine Applikation nicht, dass die Daten nicht (mehr) in der DB sind.
Mit Zitat antworten
  #6 (permalink)  
Alt 14-11-2008, 21:48
sql_newbie_67
 Newbie
Links : Onlinestatus : sql_newbie_67 ist offline
Registriert seit: Nov 2008
Beiträge: 20
sql_newbie_67 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

okay. und wie genau würde der befehl dann aussehen?

Code:
CREATE TRIGGER triggername
AFTER INSERT ON tabellenname
FOR EACH ROW DELETE FROM tabellenname where spaltenname=''

Geändert von sql_newbie_67 (14-11-2008 um 22:03 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 14-11-2008, 21:50
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Wozu versuchst du Teile der Programmlogik in die Datenbank auszulagern? Das macht alles doch nur unnötig kompliziert und fehleranfällig.
Mit Zitat antworten
  #8 (permalink)  
Alt 14-11-2008, 22:03
sql_newbie_67
 Newbie
Links : Onlinestatus : sql_newbie_67 ist offline
Registriert seit: Nov 2008
Beiträge: 20
sql_newbie_67 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

naja ich bin noch kein profi in sachen datenbank, und dachte, GERADE weil ich in der datenbank explizit dinge verbiete, vermeide ich eventuell fehler, zb indem ich in php vergesse eine abfrage zu machen

die tatsache, das das aber anscheinend niemand so zu machen scheint macht mich doch etwas stutzig
Mit Zitat antworten
  #9 (permalink)  
Alt 14-11-2008, 22:19
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Wenn du es in PHP vergisst, aber PHP glaubt, dass der Eintrag erfolgreich war, können die merkwürdigsten Situationen entstehen. zB. PHP sagt "alles OK", aber Eintrag ist nicht in der Datenbank. Was machst du jetzt? Du musst sowohl die Logik in der Datenbank als auch die Logik im Programm auf Fehler überprüfen => doppelter Aufwand.

Oder was ist, wenn sich die Überprüfungen widersprechen? zB. du kommst irgendwann mal drauf, dass du eine Überprüfung ändern willst (zb. Felder dürfen jetzt doch leere Strings enthalten). Dann musst du es sowohl im PHP-Code, als auch in der Datenbank ändern => doppelter Aufwand, doppelte Fehlerquelle. Du könntest auf einer Seite darauf vergessen oder irrtümlich was falsches eintragen. Der Fehler fällt nicht sofort auf, weil PHP nicht unbedingt eine Fehlermeldung werfen muss.
Mit Zitat antworten
  #10 (permalink)  
Alt 14-11-2008, 22:30
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Lass dir nix einreden...
Oberstes Ziel einer Datenbank sollte dessen Integrität sein.

Das MySQL derartige Dinge nur unzureichend unterstützt ist ein echtes Manko!
Aber gerade weil es nur so unzureichend unterstützt wird, würde ich es bei MySQL echt sein lassen... ggf. ein paar Transaktionen verwenden und den Rest per PHP machen.

Wenn die Datenbank jedoch vernünftige Constraints/Checks anbieten würde, wie es z.B. bei PostgreSQL oder Oracle der Fall ist, sollte man das in jedem Fall nutzen!
Der Zeitaufwand um einen Fehler in der Applikation zu finden ist deutlich geringer, als Daten wieder konsistent zu bringen, weil die Applikation aufgrund eines Fehlers munter falsche Daten in die DB geschoben hat.
Mal ganz abgesehen davon, dass es Datenbanken gibt, die von mehreren Applikationen verwendet werden. Da wäre es schon fast fahrlässig jeder Applikation intern das Prüfen auf Konsistenz aufzuerlegen... die sind niemals alle auf dem gleichen Level.
Mit Zitat antworten
  #11 (permalink)  
Alt 14-11-2008, 22:33
sql_newbie_67
 Newbie
Links : Onlinestatus : sql_newbie_67 ist offline
Registriert seit: Nov 2008
Beiträge: 20
sql_newbie_67 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ich bin davon ausgegangen das es halt einen ganz simplen befehl gibt, so wie check. und das dann im falle der verletzung ein fehlercode zurückgegeben wird den ich mit php dann weiterverarbeiten kann. das wäre für mich die denkbar sauberste variante

aber anscheinend gibt es so eine funktion nicht. der tip von onemorenerd kann zwar klappen, aber ich fühl mich nicht so wohl dabei.

ich denke einfach, wenn man erst so einen komplizierten weg gehen muss um so eine einfache sache zu erreichen, dann kann das nicht so gut sein

also was soll ich machen? einfach in php die abfrage machen?

Zitat:
Lass dir nix einreden... Oberstes Ziel einer Datenbank sollte dessen Integrität sein. Das MySQL derartige Dinge nur unzureichend unterstützt ist ein echtes Manko! Aber gerade weil es nur so unzureichend unterstützt wird, würde ich es bei MySQL echt sein lassen... ggf. ein paar Transaktionen verwenden und den Rest per PHP machen. Wenn die Datenbank jedoch vernünftige Constraints/Checks anbieten würde, wie es z.B. bei PostgreSQL oder Oracle der Fall ist, sollte man das in jedem Fall nutzen! Der Zeitaufwand um einen Fehler in der Applikation zu finden ist deutlich geringer, als Daten wieder konsistent zu bringen, weil die Applikation aufgrund eines Fehlers munter falsche Daten in die DB geschoben hat. Mal ganz abgesehen davon, dass es Datenbanken gibt, die von mehreren Applikationen verwendet werden. Da wäre es schon fast fahrlässig jeder Applikation intern das Prüfen auf Konsistenz aufzuerlegen... die sind niemals alle auf dem gleichen Level.
ich dachte immer mysql wäre die absolute referenz in sachen datenbanken. ist dem dann etwa nicht so? wieso werden solche einfachen sachen nicht unterstützt lohnt es sich auf zb postgresql umzusatteln?

Geändert von sql_newbie_67 (14-11-2008 um 22:39 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 14-11-2008, 22:37
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von sql_newbie_67

ich dachte immer mysql wäre die absolute referent in sachen datenbanken...
Hahaha ... das ist der beste Witz des Tages

... andere DBMS nehmen ... dann hast du mehr vom Leben
Mit Zitat antworten
  #13 (permalink)  
Alt 14-11-2008, 22:40
sql_newbie_67
 Newbie
Links : Onlinestatus : sql_newbie_67 ist offline
Registriert seit: Nov 2008
Beiträge: 20
sql_newbie_67 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

nunja überall hört und sieht man von mysql, somit denkt man sich, das verwenden alle und das muss das beste sein. aber ich fange langsam an zu zweifeln
Mit Zitat antworten
  #14 (permalink)  
Alt 14-11-2008, 22:43
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von sql_newbie_67
nunja überall hört und sieht man von mysql, somit denkt man sich, das verwenden alle und das muss das beste sein. aber ich fange langsam an zu zweifeln
Das kommt davon weil MySQL für die meisten Provider einfach zu handhaben ist und daher bei jedem Webspace angeboten wird und somit ziemlich weit verbreitet. Aber das Ding hat nicht alles, was eine anspruchvolle Applikation braucht. Doch für eine Website reicht es alle mal.
Mit Zitat antworten
  #15 (permalink)  
Alt 14-11-2008, 22:47
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von asp2php
Aber das Ding hat nicht alles, was eine anspruchvolle Applikation braucht. Doch für eine Website reicht es alle mal.
Also ich stoße auch bei Websiten mehr oder weniger regelmäßig auf Dinge, die ich vermisse...
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:00 Uhr.