2010-05-08 3 views
5

Gibt es eine leichte Validierung Bibliothek für PHP zur Verfügung, die leicht zu überprüfen, ob eine bestimmte Zeichenfolge oder Wert für eine bekannte Datenbank ist gültig -Validation-Bibliothek für PHP/MySQL

Etwas wie folgt aus:

if (is_MEDIUMINT($var)) { 
     $this->db->insert($anothervar); 
} 

Danke!

+0

Niemand, der davon weiß? Ich kann nicht der Erste sein, der denkt, dass das nützlich sein könnte! – Industrial

+0

Die BOUNTY ist eingeschaltet! – Industrial

Antwort

3

Die INFORMATION_SCHEMA Datenbank Teil der ANSI 2003-Spezifikation ist, so könnte man auf einem beliebigen DB-Anbieter verwenden, die, die es unterstützt (MySQL, PostgreSQL , SQLite, MSSQL 2k5 +).

/*public static*/ function is_dbtype($table, $column, $type) { 
    $db = (...)::getInstance(); // assuming PDO 
    $sql = 'SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS '. 
     'WHERE TABLE_NAME = :table AND COLUMN_NAME = :column'; 
    $st = $db->prepare($sql); 
    $st->execute(array(':table' => $table, ':column' => $column)); 
    return ($type == $st->fetchColumn()); 
} 

ändern column_type DATA_TYPE wenn Sie nur "varchar" wollen statt "varchar (64)". Wenn Sie mehr benötigen, gibt es viel. IS_NULLABLE, NUMERIC_PRECISION, CHARACTER_SET_NAME usw.

(nicht sicher, würde ich persönlich benutze diese zwar verwenden, die is_* Funktionen in der Regel genug tun, ohne einen zusätzlichen Datenbank-Aufruf Noch wichtiger ist, info_schema die hält Wenn Sie sich auf einem gemeinsam genutzten Host befinden, haben Sie wahrscheinlich überhaupt keinen Zugriff darauf.)

MySQL- nur alternierend: tue ähnlich, aber mit DESCRIBE [table]. Es ist jedoch ziemlich explizit, du musst den "bigint" in "bigint (21) unsigned" selbst ausgraben, wenn das alles ist, was du willst.

+0

Wie kann dies überprüft werden, wenn ein bestimmter Wert ein Wert für einen bestimmten Datentyp ist? Dies gibt nur den Datentyp zurück ... –

+0

Das war mehr als Reaktion auf das Lesen anderer Antworten, nicht sicher, ob ich es als die Antwort markiert hätte. Aber mit I_S/DESCRIBE können Sie zumindest überprüfen, was aus der Datenbank kommt, nur nicht das, was reingeht. Ich persönlich denke, die Eingabeseite wäre eine sinnlose Übung, solange die Typen char/varchar/text/nvarchar/etc existieren . – tadamson

1

Nicht so weit ich weiß. Sie könnten natürlich Ihre eigenen Funktionen oder Klassen erstellen, basierend auf den Regeln Ihres spezifischen Datenbanktyps.

Sorry, ich kann nicht mehr Hilfe sein. (. Und glücklich durch andere Benutzer erzogen werden, wenn es eine Klasse ist Funktionen/draußen)

+0

Danke Lucanos. Natürlich kann ich dafür ein paar Zeilen schreiben, aber ich nehme an, dass ich nicht der Erste bin, der das braucht :) – Industrial

6

Das ist nicht so einfach, wie es scheint, Ihre is_MEDIUMINT() Funktion könnte leicht werden:

is_MEDIUMINT() 
is_MEDIUMINT_NULL() 
is_MEDIUMINT_NOTNULL() 
is_MEDIUMINT_UNSIGNED() 
is_MEDIUMINT_UNSIGNED_NULL() 
is_MEDIUMINT_UNSIGNED_NOTNULL() 

Dann Sie in das Problem von verschiedenen Datenbanken Typen ausführen, SQLite beispielsweise nur eine INT Typ während MySQL mindestens 5 (TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT) hat, nicht Aliase (wie INTEGER, BOOL, BOOLEAN und SERIAL) Zählen und f Loat-Typen - was aufgrund des Arguments variable precision noch schwieriger zu implementieren wäre. Beachten Sie, dass ich immer noch einige wichtige Funktionen wie UNIQUE und Fremdschlüsseleinschränkungen ignoriere, die nur in der DB validiert werden können.

Ich verstehe nicht, warum Sie solche Funktionen für nützlich halten würden, denn wenn Sie Ihre Datenbank so einrichten könnten, dass sie im strikten Modus arbeitet und dann einfach versucht, die Werte einzufügen. Wenn die Abfrage fehlschlägt, wissen Sie, dass etwas nicht stimmt. Angabe das MySQL Handbuch:

In nicht strikten Modus wird, wenn ein out-of-Range-Wert in eine integer-Spalte zugeordnet ist, speichern MySQL den Wert den entsprechenden Endpunkt des Spaltendatentypen repräsentiert Angebot. Wenn Sie 256 in einer TINYINT oder TINYINT UNSIGNED Spalte speichern, speichert MySQL 127 bzw. 255.

Worin liegt der Sinn der Validierung des Wertes vor dem Einfügen?

if (is_MEDIUMINT($var)) { 
    $this->db->insert($anothervar); 
} 

else { 
    // do what? 
} 

Wenn Sie versuchen, Fehler führen Sie die Abfrage in einer Transaktion oder verwenden Sie die INSERT OR IGNORE Syntax zu vermeiden.

1

Suchen Sie nur nach is_* Funktionen in PHP?

is_integer, is_float usw.?

Es gibt auch get_type, aber es sollte nicht für Typ

Kontrolle verwendet werden
2

Werfen Sie es in die Datenbank und sehen Sie, ob es Fehler zurückgibt. Wenn nicht, sind Sie gut genug.

Dies bedeutet auch, dass die von Ihnen verwendeten dbms die Valiation verarbeiten, was bedeutet, dass Sie nicht alle Ihre Validierungsfunktionen aktualisieren müssen, wenn Sie sich entscheiden, diese nach Belieben zu ändern. Und das merken Sie wahrscheinlich erst, wenn alles vorbei ist und Sie nicht herausfinden können, warum. Je weniger Code du selbst pflegen musst, desto einfacher ist dein Leben :)

Verwandte Themen