2010-09-02 9 views
1

J'utilise PDO et les instructions préparées, mais je ne peux pas sembler obtenir des résultats lorsque en comparant un champ ENUM avec un entier.PDO ne peut pas comparer mysql ENUM en utilisant des entiers dans les instructions préparées

Exemple:

$db = new PDO('mysql:host=localhost;dbname=****', '***', '***'); 
$s = $db->prepare('SELECT id FROM t2 WHERE lang = ?'); 

$s->execute(array('en')); // Works    
print_r($s->fetchAll()); 

$s->execute(array(2)); // Does not work    
print_r($s->fetchAll()); 

Je teste contre ce tableau:

DROP TABLE IF EXISTS t2; 
CREATE TABLE t2 (
    id int(10) NOT NULL AUTO_INCREMENT, 
    lang enum('no','en','fr') NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
INSERT INTO t2 (id, lang) VALUES (NULL , 'en'); 

Toute idée sur la façon d'obtenir ce travail?

Je convertis à PDO, et je préfère ne pas réécrire toutes les constantes, les énumérations et les requêtes dans mon application :(

+0

Très bien. Je vais me creuser un gros trou et je ne sortirai pas tant que toutes les ENUM n'auront pas été remplacées par des clés étrangères intelligentes. * soupir * – Joernsn

Répondre

2

2 est pas un élément ENUM valide. Il est aussi simple que cela.

la raison pour laquelle il travaille dans MySQL brut quand vous lang = 2, est qu'il est d'exposer le mécanisme de stockage sous-jacent de la liste (essentiellement c'est juste une valeur normalisée, mais la normalisation est cachée de vous par la colonne ENUM).

Je suggère de ne pas essayer de faire cela MySQL cache l'implémentation pour une raison. e que l'utilisation 2 pour la comparaison est rien de plus qu'un magic number ...

1

langue ne doit pas être un ENUM, enfait ne pas utiliser énumérations à tous les utiliser à la place des tables recherche/type distinct:

create table languages 
(
    lang_id tinyint unsigned not null auto_increment primary key, 
    name varchar(255) unique not null 
) 
engine=innodb; 

create table customers 
(
    cust_id int unsigned not null auto_increment primary key, 
    lang_id tinyint unsigned not null, 
    foreign key (lang_id) references languages(lang_id) 
) 
engine=innodb; 

Vous devez également savoir que l'ajout d'une nouvelle valeur à la définition ENUM nécessite que MySQL reconstruise toute la table, ce qui n'est pas optimal pour les grandes tables!

+0

Merci! ircmaxell a eu le pourquoi et vous avez le comment. Je vous aime. – Joernsn

+0

vous êtes les bienvenus :) –

Questions connexes