2013-01-21 5 views
1

J'essaye de créer une table en utilisant PHP, PDO et MySQL. Pour les besoins de mon application, le nom de la table doit être une variable.PHP MySQL CREATE TABLE

Voici mon code:

$request = $pdo->prepare("CREATE TABLE IF NOT EXISTS :table (
     `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
     `parent_id` bigint(20) unsigned NOT NULL, 
     `position` bigint(20) unsigned NOT NULL, 
     `left` bigint(20) unsigned NOT NULL, 
     `right` bigint(20) unsigned NOT NULL, 
     `level` bigint(20) unsigned NOT NULL, 
     `title` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, 
     `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, 
     `content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, 
     PRIMARY KEY (`id`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;"); 
$request->execute(array(
    'table'=>$uuid)); 

je ne peux pas utiliser ": table" dans l'instruction MySQL ?? Actuellement, je écrit:

[...] 
CREATE TABLE IF NOT EXISTS `$uuid` 
[...] 

Cela fonctionne, mais cela semble bizarre pour moi ^^ » est-ce la seule solution à mon problème?

+0

Quelle est la sortie de 'var_dump ($ uuid);'? – rekire

+0

Que se passe-t-il lorsque vous essayez d'exécuter la version avec: table? – DWright

+0

@rekire $ uuid contient le résultat de uniqid ("", true) que j'utilise pour générer des ID aléatoires – FWoelffel

Répondre

4

Vous ne pouvez pas transmettre le nom de la table en tant que paramètre. Si vous voulez créer une table avec un nom de variable, vous devez utiliser une requête dynamique.

+0

Je ne comprends pas ... ^^ 'J'ai juste besoin de créer une table chaque fois que quelqu'un s'inscrit sur mon site web (un nouvel utilisateur = une nouvelle table). Les requêtes dynamiques sont-elles vraiment ce dont j'ai besoin? Comment le feriez-vous? – FWoelffel

+5

"un nouvel utilisateur = une nouvelle table" pire design. Inclure le champ 'UserId' qui fait référence à votre table d'utilisateurs PK. –

+0

Hokobyan Je sais que c'est un très mauvais design. Mais je manque de temps pour ce projet et cela semble être la version la plus simple. J'ai une table qui contient tous mes utilisateurs et chaque utilisateur peut stocker des fichiers en ligne et y accéder à travers une "arborescence". Chaque utilisateur a donc une table (comme celle que j'essaye de créer en utilisant le nom de la variable) dans laquelle les fichiers sont stockés. Le nom de la table correspond à l'identifiant de l'utilisateur. – FWoelffel

1
$pdo->query("CREATE TABLE IF NOT EXISTS userfiles (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id` int unsigned NOT NULL, 
    `parent_id` bigint(20) unsigned NOT NULL, 
    `position` bigint(20) unsigned NOT NULL, 
    `left` bigint(20) unsigned NOT NULL, 
    `right` bigint(20) unsigned NOT NULL, 
    `level` bigint(20) unsigned NOT NULL, 
    `title` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, 
    `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, 
    `content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8"); 

Ceci est la seule façon appropriée de gérer de telles situations.
Ces questions sont très basiques.
et votre configuration actuelle est comme une voiture avec des roues carrées.
Malgré votre manque de temps, vous devez faire une table unique.
Sinon, vous perdrez BEAUCOUP plus de temps et finirez par avoir la bonne conception mais après des douleurs innombrables