2010-05-08 3 views
5

Y at-il bibliothèque de validation légère disponible pour PHP qui peut facilement vérifier si une chaîne ou une valeur spécifique est valable pour un type de base de données connue -bibliothèque de validation pour PHP/MySQL

Quelque chose comme ceci:

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

Merci!

+0

Personne ne le sait? Je ne peux pas être le premier à penser que cela pourrait être utile! – Industrial

+0

Le BOUNTY est activé! – Industrial

Répondre

3

La base de données INFORMATION_SCHEMA fait partie de la spécification ANSI 2003, vous pouvez donc l'utiliser à travers tout fournisseur DB qui le soutient (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()); 
} 

changement COLUMN_TYPE à DATA_TYPE si vous voulez juste "varchar" au lieu de "varchar (64)". Si vous avez besoin de plus, il y a beaucoup. IS_NULLABLE, numeric_precision, CHARACTER_SET_NAME, etc.

(Je ne sais pas j'utiliser utilise ce bien, les faire assez souvent des fonctions is_* sans appel de base de données supplémentaire Plus important encore, info_schema détient la la structure de chaque base de données sur le serveur, l'octroi de permissions de lecture sur ce serveur pourrait (devrait) être un gros problème.) Si vous êtes sur un hôte partagé, vous n'y aurez probablement jamais accès.)

MySQL- seulement alternatif: faire semblable mais avec DESCRIBE [table]. C'est assez explicite cependant, vous devrez pêcher vous-même le "bigint" dans "bigint (21) unsigned" si c'est tout ce que vous voulez.

+0

Comment cela peut-il valider si une valeur spécifique est une valeur pour un type de données spécifique? Cela ne renvoie que le type de données ... –

+0

C'était plus en réaction à la lecture d'autres réponses, pas sûr que je l'aurais marqué comme la réponse. Mais avec I_S/DESCRIBE vous pouvez au moins vérifier ce qui vient de la base de données, mais pas ce qui se passe. Personnellement je pense que le côté d'entrée serait un exercice total en futilité aussi longtemps que les types char/varchar/text/nvarchar/etc existent . – tadamson

1

Pas aussi loin que je sache. Vous pouvez, bien sûr, créer vos propres fonctions ou classes pour ce faire, en fonction des règles de votre type de base de données spécifique.

Désolé je ne peux pas être plus d'aide. (. Et heureux d'être instruits par tout autre utilisateur s'il y a une classe/fonctions là-bas)

+0

Merci Lucanos. Bien sûr, je peux écrire quelques lignes pour faire cela, mais je suppose que je ne suis pas le premier à en avoir besoin :) – Industrial

6

Ce n'est pas aussi simple que cela puisse paraître, votre fonction is_MEDIUMINT() pourrait facilement devenir:

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

Ensuite, vous rencontrez le problème des différents types de bases de données, SQLite, par exemple, n'a qu'un seul type INT alors que MySQL a au moins 5 (TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT), sans compter les alias (tels que INTEGER, BOOL, BOOLEAN et SERIAL) et f types de loat - qui seraient encore plus difficiles à implémenter en raison de l'argument de précision variable. Sachez que j'ignore encore plusieurs fonctionnalités cruciales telles que UNIQUE et les contraintes de clés étrangères qui ne pouvaient être validées que sur la base de données. Je ne comprends pas pourquoi vous pensez que de telles fonctions seraient utiles, parce que si vous pouviez configurer votre base de données pour travailler en mode strict et ensuite essayer simplement d'insérer les valeurs, si la requête échoue, vous savez que quelque chose ne va pas, citant le manuel MySQL:

en mode nonstrict, lorsqu'un out-of-plage de valeurs est attribuée à une colonne de type entier , MySQL stocke la valeur représentant le point de terminaison correspondant des données de colonne de type gamme. Si vous stockez 256 dans une colonne TINYINT ou TINYINT UNSIGNED, MySQL stocke respectivement 127 ou 255. Quel est le point de validation de la valeur avant l'insertion, de toute façon?

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

else { 
    // do what? 
} 

Si vous essayez d'éviter les erreurs d'exécution de la requête dans une transaction ou utilisez la syntaxe INSERT OR IGNORE.

1

Êtes-vous simplement à la recherche des fonctions is_* en PHP?

is_integer, is_float etc.

Il y a aussi get_type, mais il ne doit pas être utilisé pour le type de vérification

2

Jetez-le dans la base de données et vérifiez s'il renvoie des erreurs. Si ce n'est pas le cas, vos types sont assez bons. Cela signifie également que les dbms que vous utilisez géreront la valiation, ce qui signifie que vous n'avez pas besoin de mettre à jour toutes vos fonctions de validation quand ils décident de changer les leurs sur un coup de tête. Et vous ne remarquerez probablement pas cela jusqu'à ce que tout meure et que vous ne puissiez pas comprendre pourquoi. Moins vous avez de code à entretenir, plus votre vie est facile :)

Questions connexes