2009-11-27 5 views
1

J'ai une table mysql identifiant, nom, sexe, religion d'âge (enum ('HIN', 'CHR', 'MUS'), catégorie (enum ('IND', 'AMR', 'SPA «) où 2 derniers sont ENUM et mon type de données code était drupalUtilisation de enum dans drupal

$sql="SELECT * FROM {emp} WHERE age=".$age." and religion=".$rel." and category=".$categ; 

    $result=db_query_range($sql,0,10); 

    while($data=db_fetch_object($result)) 
    { 
     print $data->id." ".$data->name."<br>"; 
    } 

Je reçois aucun résultat ou une erreur. J'essaie autre requête avec chaque champ et tous sont très bien, sauf en utilisant ENUM.

for ex: $sql='SELECT * FROM {emp} WHERE religion="'.$rel.'"'; 

Y at-il un problème dans l'utilisation du type de données enum dans drupal

Répondre

5

Enum n'est pas quelque chose que je crois Drupal peut faire avec l'API de schéma, qui est ce que vous voulez utiliser dans la plupart des cas pour les modules et autres. Il vous manque aussi une fin) dans votre référence, mais je suis sûr que vous l'avez bien fait quand vous avez fait la table.

Enum est uniquement une contrainte intégrée dans la base de données lors de l'insertion de valeurs. Donc, si vous essayez d'insérer une valeur invalide, vous allez insérer une chaîne vide à la place. Cela n'aura donc aucun effet sur l'interrogation de Drupal pour obtenir des données. Il n'a pas non plus d'effet lorsque Drupal insère des valeurs autres que la conversion de valeurs invalides en chaînes vides. Vous pourriez vouloir vérifier vos données, pour voir si c'est comme prévu. Vous pourriez ne recevoir aucun résultat car votre requête ne correspond à rien.

Une autre chose est la façon dont vous construisez vos requêtes est un gros NO NO, car il est très peu sûr. Ce que vous devez faire est la suivante:

db_query("SELECT ... '%s' ...", $var); 

Drupal remplacera% s avec votre var et assurez-vous qu'il n'y a pas d'injection SQL et d'autres choses désagréables. % s indique que la variable var est une chaîne, utilisez% d pour ints et il y en a quelques autres dont je ne me souviens pas tout à l'heure. Vous pouvez avoir plusieurs espaces réservés comme celui-ci, et ils seront insérés dans l'ordre, un peu comme la fonction t.

+2

+1 - D'accord. Quelques notes supplémentaires: (1) 'db_query()' et 'db_query_range()' peuvent accepter n'importe lequel de ces% modificateurs:% s,% d,% f,% b et %%. L'explication de leur signification est dans la documentation de PHP: http://www.php.net/manual/en/function.sprintf.php, tandis que '%%' est remplacé par un simple%. (2) A moins que votre module ne soit appelé 'emp' et qu'il s'agisse de votre seule table (dans laquelle votre exemple est correct), il est bon de coder les tables avec le nom de votre module, par exemple:' mymodule_emp'. – mac

3

Seconding Googletorps vous conseille sur l'utilisation de requêtes paramétrées (+1). Cela serait non seulement plus sûr, mais aussi plus facile à repérer les erreurs;)

Votre requête originale manque certaines citations autour de vos valeurs de comparaison (chaîne). Ce qui suit devrait fonctionner (Notez les guillemets simples ajoutés):

$sql = "SELECT * FROM {emp} WHERE age='" . $age . "' and religion='" . $rel . "' and category='" . $categ . "'"; 

Le droit façon de le faire serait quelque chose comme ceci:

$sql = "SELECT * FROM {emp} WHERE age='%s' and religion='%s' and category='%s'"; 
$args = array($age, $rel, $categ); 
$result = db_query_range($sql, $args ,0 , 10); 
// ... 
+0

J'ai effectivement remarqué les disparus »et était un peu perplexe, mais je pensais que c'était juste des fautes de frappe à l'époque. Était tôt le matin et tout;) bon point thouhg - +1 – googletorp

Questions connexes