2010-05-08 11 views
5

C'è qualche convalida biblioteca leggero disponibile per PHP che facilmente può controllare se una stringa o un valore specifico è valida per un tipo di database noto -biblioteca di convalida per PHP/MySQL

Qualcosa di simile a questo:

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

Grazie!

+0

Nessuno sa questo? Non posso essere il primo a pensare che questo possa tornare utile! – Industrial

+0

Il BOUNTY è acceso! – Industrial

risposta

3

Il database INFORMATION_SCHEMA è parte della specifica ANSI 2003, così si potrebbe utilizzare quello attraverso qualsiasi fornitore DB che lo supporta (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()); 
} 

Change tipo_colonna a DATA_TYPE se si vuole solo "varchar" invece di "varchar (64)". Se avete bisogno di più, c'è un sacco:. IS_NULLABLE, NUMERIC_PRECISION, CHARACTER_SET_NAME, ecc

(Non sono sicuro mi piacerebbe utilizzare personalmente uso questo, però, i is_* funzioni di solito fa abbastanza senza una chiamata di database aggiuntivo Ancora più importante, detiene l'info_schema struttura di ogni database sul server, quindi concedere le autorizzazioni di lettura potrebbe essere un grosso problema. Se si è su un host condiviso, probabilmente non si avrà alcun accesso.)

MySQL- solo alternato: fare simili ma con DESCRIBE [table]. È piuttosto esplicito però, dovrai "pescare" il "bigint" in "bigint (21) senza firma" se questo è tutto ciò che desideri.

+0

Come può questo convalidare se un valore specifico è un valore per un tipo di dati specifico? Questo restituisce solo il tipo di dati ... –

+0

Questo è stato più in reazione alla lettura di altre risposte, non sono sicuro che l'avrei contrassegnato come La risposta. Ma con I_S/DESCRIBE puoi almeno controllare cosa proviene dal database, solo non quello che sta succedendo. Personalmente penso che il lato input sarebbe un esercizio totale di futilità fintanto che esistono tipi char/varchar/text/nvarchar/etc . – tadamson

1

Non per quanto ne so. È possibile, naturalmente, creare le proprie funzioni o classi per fare ciò, in base alle regole del proprio tipo di database specifico.

Siamo spiacenti, non posso essere più di aiuto. (. E felice di educare da tutti gli altri utenti, se c'è una classe/funzioni là fuori)

+0

Grazie Lucanos. Naturalmente, posso scrivere alcune righe per farlo, ma supporrò che non sia il primo ad aver bisogno di questo :) – Industrial

6

Questo non è così semplice come sembra, la funzione is_MEDIUMINT() potrebbe facilmente diventare:

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

Poi si esegue nel problema di diversi tipi database, SQLite per esempio ha una sola INT tipo mentre MySQL ha almeno 5 (TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT), senza contare alias (come INTEGER, BOOL, BOOLEAN e SERIAL) e f tipi di loat - che sarebbero ancora più difficili da implementare a causa dell'argomento di precisione variabile. Ricorda che sto ancora ignorando diverse funzionalità cruciali come UNIQUE e Vincoli chiave esterna che potrebbero essere convalidati solo sul DB.

Non capisco perché pensi che tali funzioni sarebbero utili, perché se potessi impostare il tuo database per lavorare in modalità rigorosa e poi semplicemente provare ad inserire i valori, se la query fallisce sai qualcosa non va, citando il manuale MySQL:

In modalità nonstrict, quando un out-of-range valore viene assegnato a una colonna intero, MySQL memorizza il valore rappresenta la corrispondente endpoint del tipo di dati colonna gamma. Se si memorizza 256 in una colonna TINYINT o TINYINT UNSIGNED, MySQL memorizza 127 o 255, rispettivamente.

Qual è il punto di convalida del valore prima dell'inserimento?

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

else { 
    // do what? 
} 

se si sta cercando di evitare gli errori di eseguire la query in una transazione o utilizzare la sintassi INSERT OR IGNORE.

1

Stai cercando solo le funzioni is_* in PHP?

is_integer, is_float ecc.?

C'è anche get_type, ma non dovrebbe essere usato per il tipo di controllo

2

Gettarlo nel database e vedere se restituisce errori. Se non lo fa, i tuoi tipi sono abbastanza buoni.

Ciò significa anche che il dbms che si sta utilizzando gestirà la valutazione, il che significa che non è necessario aggiornare tutte le funzioni di convalida quando decidono di cambiarle per un capriccio. E molto probabilmente non lo noterai fino a quando tutto non muore e non riesci a capire perché. Meno codice hai per mantenere te stesso, più facile è la tua vita :)