[RESOLU] Problème SQL.

Eléphant du PHP | 290 Messages

13 mars 2014, 11:52

Bonjour,

J'essaye de valider une table créée dans une base de donnée sur phpmyadmin en local.

Malgré de nombreux essais de validation, je tombe toujours au moment de sauvegarder
sur un message comme:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNSIGNED NULL, `numeromobile` VARCHAR(15) UNSIGNED NULL, `adresseemail` VARCHAR(35) CHA' at line 1

J'ai apparemment un ou des problème(s) de langage SQL mais même après avoir bien cherché, je ne trouve pas ce qui cloche.
Avec UNSIGNED et NULL en même temps, ma valeur peut être vide ou non et ce n'est pas un nombre négatif si elle est vide.
Je ne vois pas pourquoi ce serait contradictoire.
VARCHAR(35) est une chaîne de caractères de longueur variable (pouvant contenir normalement 255 caractères
au plus mais ici je limite à 35).
Pourquoi est-ce que ça devrait poser problème?
Quant à ligne 1, je ne comprends pa non plus pourquoi le serveur local fait référence à la première ligne.

Du coup, je ne peux pas valider ma table.
Je ne sais pas si quelqu'un peut m'aider.

Je dois dire avoir quelques difficultés d'adaptation avec le serveur en local.
Durant ma phase d'entraînement pour faire mon site, j'ai travaillé sur un "faux site"
directement avec phpmyadmin sur un serveur hébergé OVH et j'ai pu créer
des tables sans problèmes, ainsi que manipuler un peu dans tous les sens
des données sur mon serveur.
Du coup, j'ai l'impression que je n'aurais pas ces problèmes si je travaillais sur ma table directement à partir d'un serveur
distant, mais je souhaite éviter ça car maintenant je travaille sur mon vrai site.

Je sollicite souvent votre aide ces derniers temps, mais je garde bien en tête
que si je peux renvoyer l'ascenseur un jour ou l'autre je le ferai
(sûrement quand je serai meilleur) :wink:

ViPHP
xTG
ViPHP | 7331 Messages

13 mars 2014, 13:02

Peux-t-on voir ton create table complet ?

Eléphant du PHP | 290 Messages

13 mars 2014, 18:10

Je l'ai scanné et en voulant l'envoyer, le fichier PDF n'a pas été autorisé à partir.
Changer d'extension (par exemple .txt) brouille le fichier.
Je peux soit l'envoyer par e-mail, soit réécrire la table dans un message.
A moins que tu as une autre idée par faire passer le fichier via un message du forum.

Eléphant du PHP | 290 Messages

13 mars 2014, 18:31

NOM TYPE TAILLE/VALEUR DEFAUT Interclassement Attributs null Index

nomutilisateur SERIAL 10 Aucune UTF8_general_ci Primary
motdepasse SERIAL 8 Aucune UTF8_general_ci Primary
firmeouinon TEXT 3 Aucune UTF8_general_ci binary
nomfamille TEXT 25 Aucune UTF8_general_ci
prenom TEXT 25 Aucune UTF8_general_ci
sexe TEXT 5 Aucune UTF8_general_ci binary V (encoche)
age VARCHAR 3 Aucune V (encoche)
numerotelephone VARCHAR 15 Aucune unsigned V (encoche)
numeromobile VARCHAR 15 Aucune unsigned V (encoche)
adresseemail VARCHAR 35 Aucune UTF8_general_ci
numerorue CHAR 2 Aucune unsigned
nomrue TEXT 25 Aucune UTF8_general_ci
codepostal CHAR 15 Aucune UTF8_general_ci unsigned
ville TEXT 25 Aucune UTF8_general_ci
pays TEXT 25 Tel que défini: UTF8_general_ci
France

Moteur de stockage:
InnoDB (ce n'a pas été écrit par moi)

Interclassement:
UTF8_general_ci

Eléphant du PHP | 290 Messages

13 mars 2014, 18:32

C'est pas terrible, je vais refaire avec une feuille Excel.

Eléphant du PHP | 290 Messages

13 mars 2014, 19:02

Bon, j'ai refait le fichier en mode Excel mais le site du forum
n'accepte pas les fichiers Excel non plus.

Je réessaye avec WORD cette fois...

Eléphant du PHP | 290 Messages

13 mars 2014, 19:24

Le fichier WORD que j'ai crée n'est pas autorisé non plus. :evil:
Je ne sais plus quoi faire.
Soit je t'envoie ma table par adresse e-mail, si tu arrives à lire mon tableau
en sachant que dans les quatres premières colonnes que sont Nom, Type, Taille/Valeur
et Défaut tous les champs ont une valeur, qu'ensuite...
...pour interclassement il y a quatre champs vide: age, numerotelephone,
numeromobile et adresseemail, que dans attributs il y a seulement six champs remplis
(BINARY pourfirmeouinon et pour sexe, UNSIGNED pour numerotelephone, numeromobile,
numerorue et codepostal, qu'il y a que quatre champs cochés pour null: sexe, age,
numerotelephone et numero mobile - ces champs correspondent à des champs facultatifs
pour l'utilisateur dans le formulaire du site et qu'il y a la PRIMARY dans Index pour nomutilisateur
et motdepasse, et rien pour tous les autres champs.
Soit tu as une meilleure idée.

Eléphant du PHP | 290 Messages

13 mars 2014, 19:27

Je veux dire soit je t'envoie la table par email soit tu essayes de lire le tableau un peu destructuré
qui se trouve un peu plus haut en prenant en compte mon dernier message.

ViPHP
xTG
ViPHP | 7331 Messages

13 mars 2014, 21:00

Moi tout ce que j'ai demandé c'est la requête que tu tentes d'exécuter et qui échoues...
A savoir vu la tête une requête CREATE TABLE.

Mammouth du PHP | 2278 Messages

13 mars 2014, 21:02

Ce que demande xtg c'est la formule employée pour créer la table:
Imaginons:
<?PHP
$requete = "CREATE table......";
print "<br>:$requete:<br>";
die();
?>
et tu envoies un copier/coller de l'affichage, que tu peux tester dans phpmyadmin....
au passage que vient fiche ce CHA:
`numeromobile` VARCHAR(15) UNSIGNED NULL, `adresseemail` VARCHAR(35) CHA'
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 504 Messages

13 mars 2014, 21:12

Bonjour,

Quand tu crées ta base, tu comprends ce que tu fais ou tu as juste fais un copié collé ?

J'ai du mal a comprendre:

1/ nomutilisateur SERIAL 10 Aucune UTF8_general_ci Primary
motdepasse SERIAL 8 Aucune UTF8_general_ci Primary ??

pourquoi mettre un mot de passe en clef primaire ??

2/ SERIAL, je l'ai vu dans le progresql, mais pas en mysql. D'ailleurs si tu regardes sur une création de table, je crois que ce type de donnée n'est pas proposée.

3/ codepostal CHAR 15 Aucune UTF8_general_ci unsigned : pourquoi mettre unsigned ?? unsigned va te changer la capacité de stockage. D'ailleurs a verifier si c'est vraiment compatible avec CHAR. pour des codes postaux INT ou BigINT suffit (BIGINT stocke les nombres entiers entre -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807)

4/ nomrue TEXT 25: Seulement 25 caracteres pour un nom de rue. Mon adresse ne rente pas par exemple. pas top pour l'utilisateur.



Bref, je ne vois pas la logique de cette table.

Eléphant du PHP | 290 Messages

14 mars 2014, 00:09

Merci à vous deux pour votre aide.
Ça commence à aller mieux, je vais réessayer tout seul demain
Avec ce que vous m'avez dit dans un premier temps.

Merci Sirakawa pour la précision, je n'avais pas compris.
A vrai dire, je n'ai jamais fait passé par l'étape CREATE table à partir d'un script PHP,
mais à partir de phpmyadmin en cliquant sur l'icône SQL.
Ça doit revenir au même (ça marchait d'ailleurs très bien quand j'avais des tables hébergées)
mais je n'écris effectivement pas de script pour cette étape.
Sur phpmyadmin en local, j'ai cliqué sur un bouton créer une bd à laquelle j'ai donné un nom,
puis sur un bouton créer une table à laquelle j'ai donné un autre nom.
Mais je ne suis pas passé par le bouton SQL dans phpmyadmin pour écrire
CREATE table à la main, et du coup j'ai complètement oublié que je faisais comme
ça avant. Je vais tout d'abord "refaire des révisions sur ce point" dans un premier temps
faire des corrections si nécessaire. J'ai peu être zappé une étape clef.

J'ai l'impression de comprendre ce que je fais quand je crée ma base, ce qui est différent de vraiment
comprendre je suis d'accord. Mais je ne veux jamais faire quoi que ce soit au hasard.

Quand aux questions de Damien:

1) Pourquoi un mot de passe en clef primaire? En effet, plus je repense à cette question,
plus je trouve ça moi-même incohérent. J'ai d'abord trouvé nomutilisateur très bien comme clef primaire
(et je trouve toujours ça très bien) et alors je me suis dit que deux utilisateurs peuvent avoir un même
nom d'utilisateur du fait d'un mauvais hasard, j'ai donc décidé de coupler cette clef primaire avec une
autre clef primaire, et j'ai pensé simplement à ce que l'utilisateur rentre après son nom d'utilisateur:
son mot de passe.

2) J'ai appris SERIAL dans php et MySQL pour les nuls. SERIAL comprend AUTO_INCREMENT, ce dont je vais
avoir besoin. Je sais qu'on peut choisir AUTO_INCREMENT dans une liste déroulante lorsqu'on crée une table
dans phpmyadmin hébergé chez OVH, donc je pense que ça doit être possible aussi sur phpmyadmin en local.
Si vous savez comment on fait ça m'intéresse

3) codepostal CHAR 15 unsigned. Tu veux dire que comme en gros unsigned va multiplier par 2 ma capacité de stockage,
c'est contradictoire avec une valeur fixe dont le nombre maximum de caractères est figé (ici à15 caractères).

4) je ne pensais pas que les noms de rues pouvaient être si longs. Bon, je vais mettre nomrue TEXT 100 pour
prendre large.

Quand à la présence du CHA dont parle Sirakawa, je vais regarder ça à nouveau.

Merci déjà pour tout ça. Ça me permet d'avancer.

Eléphant du PHP | 290 Messages

14 mars 2014, 13:55

J'ai réessayé de construire la table directement à partir phpmyadmin en local.

J'ai écrit:

CREATE TABLE 'inscription' (
nomutilisateur char(10) NOT NULL utf8_general_ci AUTO_INCREMENT PRIMARY KEY,
motdepasse char(8) NOT NULL utf8_general_ci,
firmeouinon text(3) NOT NULL binary utf8_general_ci,
nomfamille text(25) NOT NULL utf8_general_ci,
prenom text(25) NOT NULL utf8_general_ci,
sexe text(5) utf8_general_ci,
age char(3) utf8_general_ci,
adresseemail varchar(35) NOT NULL utf8_general_ci,
numerotelephone varchar(15) utf8_general_ci UNSIGNED,
numeromobile varchar(15) utf8_general_ci UNSIGNED,
numerorue char(3) NOT NULL utf8_general_ci,
nomrue text(100) NOT NULL utf8_general_ci UNSIGNED,
codepostal bigint(15) NOT NULL utf8_general_ci,
ville text(25) NOT NULL utf8_general_ci UNSIGNED,
pays text(25) NOT NULL default'France' utf8_general_ci,
);

On me répond:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''registration' ( login char(10) NOT NULL utf8_general_ci AUTO_INCREMENT PRIMARY' at line 1

Qu'est-ce que vous en dites?

ViPHP
xTG
ViPHP | 7331 Messages

14 mars 2014, 14:17

J'en dis que l'erreur parle de la table registration et que tu nous montres la requête de création de la table inscription. :mrgreen:
A ma connaissance il n'y a pas encore de traducteur automatique dans Phpmyadmin. :P

Mammouth du PHP | 504 Messages

14 mars 2014, 14:57

bjr,

Je rebondis sur ce que je disais hier, si tu veux vraiment te mettre au mysql, il conviendrait de d'apprendre sur des tutos ou des bouquins. Ce n'est pas péjoratif, on est tous passer par là.

Toute action sur mysql et définition des types de données ont une action sur sa performance. Tes choix de types et de valeurs me font bondir :evil: , c'est tellement incohérent...

La doc http://dev.mysql.com/doc/refman/5.0/fr/ ... types.html

1/ nomutilisateur char(10) -> apparement, c'est pour des sociétés. je mets comme nom utilisateur, mon nom et prenom, je suis limité à 10 caracteres. ça ne rentre pas ! De plus, CHAR définit un nombre d'octets définis, pas variables. Donc si, on mets 10 et que la donnée entrée prends 4, ça comptera quand meme pour 10.

2/ codepostal bigint(15) NOT NULL utf8_general_ci,
il ne sert à rien de mettre bigint dans ton cas. Un code postal en france est au plus de 5 chiffres donc inutile gacher des octect pour ça.
Mets simplement int (5) ça suffira.

3/ firmeouinon text(3): Text, comme cela dit c'est du texte. (avec des paragraphes par exemple). Un nom de firme ou de société ne sera jamais un paragraphe ou un chapitre.

Bref, il y a tout à reprendre sur ce point.