2010-05-08 13 views
5

¿Hay alguna biblioteca de validación de peso ligero disponible para PHP que fácilmente puede comprobar si una cadena o valor específico es válida por un conocido tipo de base de datos -biblioteca de validación para PHP/MySQL

Algo como esto:

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

¡Gracias!

+0

¿Nadie que sepa de esto? ¡No puedo ser el primero en pensar que esto podría ser útil! – Industrial

+0

¡El BOUNTY está encendido! – Industrial

Respuesta

3

La base de datos INFORMATION_SCHEMA es parte de la especificación ANSI 2003, lo que podría utilizar que a través de cualquier proveedor de base de datos que soporta (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()); 
} 

Cambio tipo_columna a DATA_TYPE si lo que desea "varchar" en lugar de "varchar (64)". Si necesita más, hay muchas cosas:. IS_NULLABLE, NUMERIC_PRECISION, CHARACTER_SET_NAME, etc.

(No estoy seguro de que haría uso personalmente uso esto, sin embargo, las funciones is_* por lo general hace lo suficiente sin una llamada de base de datos adicional que es más importante, mantiene el info_schema estructura de cada base de datos en el servidor, por lo que otorgarle permisos de lectura podría (debería) ser un gran problema. Si está en un host compartido, probablemente no tendrá acceso a él.)

MySQL- solo alternativo: haz lo mismo pero con DESCRIBE [table]. Aunque es bastante explícito, tendrás que pescar "bigint" en "bigint (21) unsigned" tú mismo si eso es todo lo que quieres.

+0

¿Cómo puede esto validar si un valor específico es valioso para un tipo de datos específico? Esto solo devuelve el tipo de datos ... –

+0

Eso fue más como reacción a la lectura de otras respuestas, no estoy seguro de haberlo marcado como La respuesta. Pero con I_S/DESCRIBE puede al menos comprobar lo que viene de la base de datos, simplemente no lo que está entrando. Personalmente, creo que el lado de entrada sería un ejercicio total en vano, siempre y cuando existan los tipos char/varchar/text/nvarchar/etc. . – tadamson

1

No es lo que yo sé. Podría, por supuesto, crear sus propias funciones o clases para hacer esto, según las reglas de su tipo de base de datos específico.

Lo siento, no puedo ser más ayuda. (. Y feliz de educar por cualquier otro usuario si hay una clase/funciones por ahí)

+0

Gracias Lucanos. Por supuesto, puedo escribir algunas líneas para hacer esto, pero supongo que no soy el primero en necesitarlo :) – Industrial

6

Esto no es tan simple como parece, su función is_MEDIUMINT() podría convertirse fácilmente en:

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

Entonces se encuentra con el problema de los diferentes tipos de bases de datos, SQLite, por ejemplo, tiene un solo INT tipo, mientras que MySQL tiene al menos 5 (TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT), sin contar los alias (como INTEGER, BOOL, BOOLEAN y SERIAL) y f tipos de loat - que serían aún más difíciles de implementar debido al argumento de precisión variable. Ten en cuenta que todavía ignoro varias características cruciales como UNIQUE y Foreign Key Constrains que solo se podían validar en la base de datos.

No entiendo por qué piensas que tales funciones serían útiles, porque si pudieras configurar tu base de datos para trabajar en modo estricto y luego simplemente intentaras insertar los valores, si la consulta falla, sabes que algo está mal, citando el Manual MySQL:

En modo no estricta, cuando un fuera de la gama valor se asigna a una columna de número entero, MySQL almacena el valor que representa la correspondiente punto final del tipo de datos de columna distancia. Si almacena 256 en una columna TINYINT o TINYINT SIN CARGO, MySQL almacena 127 o 255, respectivamente.

¿Cuál es el punto de validar el valor antes de la inserción de todos modos?

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

else { 
    // do what? 
} 

Si usted está tratando de evitar errores de ejecutar la consulta en una transacción o utilizar la sintaxis INSERT OR IGNORE.

1

¿Estás buscando las funciones is_* en PHP?

is_integer, is_float etc.?

Existe también get_type, pero no se debe utilizar para la comprobación de tipos

2

Tírelo en la base de datos y vea si devuelve errores. Si no es así, tus tipos son lo suficientemente buenos.

Esto también significa que los dbms que está utilizando manejarán la validación, lo que significa que no tiene que actualizar todas sus funciones de validación cuando decidan cambiar la suya por capricho. Y probablemente no lo notarás hasta que todo muera y no puedas resolver por qué. Cuanto menos código tengas que mantenerte, más fácil será tu vida :)

Cuestiones relacionadas