Problème Identification, Connexion

Problème Identification, Connexion - PHP - Programmation

Marsh Posté le 08-01-2009 à 23:28:07    

Bonjour à tous,
Je suis en train de réaliser un site internet pour un travail maison pour l'IUT informatique.
Qui consiste à créer une bibliothèque avec un accès membre, et l'on doit s'inscrire.
Ne prêtez pas attention au Design, je m'en préoccuperai plus tard.
Mon site est le suivant : http://dormeur.info.iut.u-bordeaux [...] iption.php
Je trouve deux erreurs que je ne sais résoudre, j'ai beau retourner dans tout les sens, rien de rien.
J'en appelle à vos talents pour résoudre mon problème.
Voici le code qui est en question :
 

Code :
  1. $reqInsertion = "Insert into Lecteur ( ) values (".$NumeroLec.", ".$nom.", ".$prenom.", ".$adr.", ".$dateN.", ".$ville.", ".$dep.", ".$codeP.", ".$pays.", ".$numTel.", ".$pwd.", ".$confPwd.", ".$log.", ".$mail.", ".$cb." )";
  2.    odbc_exec($conn, $reqInsertion);


Code :
  1. <form class="formulaire" method="post" action="inscription.php">
  2.                         <p> Nom <input type="text" size="20" name="nom"/></p>
  3.   <p> Prénom <input type="text" size="20" name="prenom"/></p>
  4.   <p> Mot de Passe <input type="password" size "20" name="pwd" /> </p>
  5.   <p> Confirmation <input type="password" size "20" name="confPwd" /> </p>
  6.   <p> Login <input  type="text" size "20" name="log" /> </p>
  7.   <p> Adresse e-mail <input type="text" size="20" name="email"/></p>
  8.   <p> Sexe H <input type="radio" name="sexe" value="H"/>
  9.      F <input type="radio" name="sexe" value="F"/></p>
  10.   <p> Date Naissance 
  11.    <td class="profilCase3"> <select name="bday">
  12.                            [Raccourci du code de Date Naissance]
  13.                          </td>
  14.   <p> Ville <input type="ville" size="20" name="ville"/></p>
  15.   <p> Département <input type="text" size="20" name="departement"/></p>
  16.   <p> Code Postal <input type="text" size="20" name="codepostal"/></p>
  17.   <p> Pays <input type="text" size="20" name="pays"/></p>
  18.   <p> Numéro de téléphone <input type="text" size="20" name="numtel"/></p>
  19.   <p> Code Bancaire <input type="text" size="16" name="CB"/></p>
  20.   <p> Adresse <input type="text" size="20" name="adresse"/></p>
  21.   <p> <input type="submit" value="Valider"/> </p>
  22.            </form>


 
Avec cette contrainte (regarde Lecteur à droite)
http://img.rock-hosting.com/img/SchemaBiblixoj.gif
 
Les erreurs sont donc les suivantes :
 
Notice: Undefined index: codepostal in D:\Inetpub\wwwroot\etd\jbeau\TM\inscription.php on line 97
 
Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Le nom "c" n'est pas autorisé dans ce contexte. Les expressions valides sont des constantes, des expressions constantes et (dans certains contextes) des variables. Les noms de colonnes ne sont pas autorisés., SQL state 37000 in SQLExecDirect in D:\Inetpub\wwwroot\etd\jbeau\TM\inscription.php on line 40
 
La première erreur que je ne comprends vraiment pas  :??:


Message édité par ozone--24 le 08-01-2009 à 23:28:27
Reply

Marsh Posté le 08-01-2009 à 23:28:07   

Reply

Marsh Posté le 09-01-2009 à 08:56:35    

Tu n'a pas échappé les valeurs, tu les mets comme ça à l'arrache dans ta requête. Les valeurs de type string doivent être entourées de quotes, et les apostrophe doivent être échappées (voir suivant SGBD).
 
Security & SQL 101

Reply

Marsh Posté le 09-01-2009 à 09:43:10    

J'ai donc mis des simple quotes au lieu des doubles et maintenant j'ai cette erreur :
Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Une valeur explicite de la colonne identité de la table 'Lecteur' ne peut être spécifiée que si la liste des colonnes est utilisée et si IDENTITY_INSERT est défini sur ON., SQL state 23000 in SQLExecDirect in D:\Inetpub\wwwroot\etd\jbeau\TM\inscription.php on line 40
 
avec cette ligne de code :  
    $reqInsertion = "Insert into Lecteur values (".$NumeroLec.", '.$nom.', '.$prenom.', '.$adr.', '.$dateN.', '.$ville.', '.$dep.', '.$codeP.', '.$pays.', '.$numTel.', '.$pwd.', '.$confPwd.', '.$log.', '.$mail.', '.$cb.')";
    odbc_exec($conn, $reqInsertion);
 
Merci pour ta réponse

Reply

Marsh Posté le 09-01-2009 à 10:14:21    

$reqInsertion = "Insert into Lecteur values ($NumeroLec, '$nom', '$prenom', '$adr', '$dateN', '$ville', '$dep', '$codeP', '$pays', '$numTel', '$pwd', '$confPwd', '$log', '$mail', '$cb')";  
 
Le plus simple quand tu as ce genre d'erreur, c'est de faire un echo de $reqInsertion !
 
Ensuite, si tu ne comprends toujours pas, copier/coller de la trace dans phpmyadmin par exemple...
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-01-2009 à 10:16:59    

Cette ligne :
$reqInsertion = "Insert into Lecteur values (".$NumeroLec.", '.$nom.', '.$prenom.', '.$adr.', '.$dateN.', '.$ville.', '.$dep.', '.$codeP.', '.$pays.', '.$numTel.', '.$pwd.', '.$confPwd.', '.$log.', '.$mail.', '.$cb.')";  
C'est quand même un peu n'importe quoi ...
 
Insert into Lecteur values (1, '.toto.', '.titi.', '.6 square des bouffons.', ....
 


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-01-2009 à 12:03:32    

Merci pour ton aide, j'ai fait ce que tu m'as demandé donc ceci :  

Code :
  1. $reqInsertion = "Insert into Lecteur ( [N°], Prénom,Nom ,Adresse ,DateNaissance, Ville, Département, CodePostal, Pays, [N°TélPersonnel], Photographie, Password, Login, email, cb) values ('".$NumeroLec."', '$nom', '$prenom', '$adr', '$dateN', '$ville', '$dep', '$codeP', '$pays', '$numTel', '$pwd', '$confPwd', '$log', '$mail', '$cb')";
  2. odbc_exec($conn, $reqInsertion);


J'obtiens cette erreur.

Code :
  1. Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Impossible d'insérer une valeur explicite dans la colonne identité de la table 'Lecteur' quand IDENTITY_INSERT est défini à OFF., SQL state 23000 in SQLExecDirect in D:\Inetpub\wwwroot\etd\jbeau\TM\inscription.php on line 41


J'ai donc mis un :

Code :
  1. echo $reqInsertion;

et mis la ligne suivante en commentaire et j'obtiens ça :
 
Insert into Lecteur ( [N°], Prénom,Nom ,Adresse ,DateNaissance, Ville, Département, CodePostal, Pays, [N°TélPersonnel], Photographie, Password, Login, email, cb) values ('6', 'b', 'b', 'b', '01', 'b', 'b', '33', 'b', 'b', 'b', 'b', 'b', 'b', 'b')

Reply

Marsh Posté le 09-01-2009 à 12:36:07    

ozone--24 a écrit :

SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Une valeur explicite de la colonne identité de la table 'Lecteur' ne peut être spécifiée que si la liste des colonnes est utilisée et si IDENTITY_INSERT est défini sur ON., ...

Traduction tu n'as le droit de spécifier manuellement une clé autoincrémenté que si :
1) tu donnes une liste de colonne dans ton INSERT (ou dans ton UPDATE)
2) SQL SERVEUR est réglé pour l'accepter (valeur de IDENTITY_INSERT à ON dans les réglages)
 
Vu que tu respectes la règle 1, c'est sur la 2 que ça coince.
 
J'ai juste une question à te poser : vu que tu as des index autoincrémenté, pourquoi tu cherches à faire l'incrémentation à la main? Laisse faire la base, c'est beaucoup plus simple, c'est plus fiable (pas de risque de collision en cas d'insertion par plusieurs personnes) et quelque soit la base de donnée on peut récupérer facilement l'indice de la ligne juste après l'insertion.
 
PS : Je n'ai quasiment pas utilisé SQL SERVER mais en cherchant sur google j'ai trouvé deux requêtes qui sont sencé retourner la valeur donné à la ligne inséré :
"SELECT SCOPE_IDENTITY()" et "SELECT @@IDENTITY".
Je te laisse les tester pour voir laquelle est la bonne ou si les deux marchent. A voir aussi si ça te retourne l'id de la première ligne ou celle de la dernière quand tu créé plusieurs lignes en une seule requête "insert".

Reply

Marsh Posté le 09-01-2009 à 18:41:08    

Merci pour ton aide,
J'ai testé ce que tu m'as dit en bas de ton message :  
pour la première solution ça donne ça :  
Notice: Use of undefined constant reqidentity - assumed 'reqidentity' in D:\Inetpub\wwwroot\etd\jbeau\TM\inscription.php on line 38
reqidentity
Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Impossible d'insérer une valeur explicite dans la colonne identité de la table 'Lecteur' quand IDENTITY_INSERT est défini à OFF., SQL state 23000 in SQLExecDirect in D:\Inetpub\wwwroot\etd\jbeau\TM\inscription.php on line 42
avec le code :

Code :
  1. $reqidentity = 'SELECT SCOPE_IDENTITY()';
  2. echo reqidentity;


 
la deuxième solution donne :
Notice: Use of undefined constant reqidentity - assumed 'reqidentity' in D:\Inetpub\wwwroot\etd\jbeau\TM\inscription.php on line 38
reqidentity
Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Impossible d'insérer une valeur explicite dans la colonne identité de la table 'Lecteur' quand IDENTITY_INSERT est défini à OFF., SQL state 23000 in SQLExecDirect in D:\Inetpub\wwwroot\etd\jbeau\TM\inscription.php on line 42
avec le code :  

Code :
  1. $reqidentity = 'SELECT @@IDENTITY()';
  2. echo reqidentity;


 
La ligne 38 correspond à : echo reqidentity;
Et 42 : odbc_exec($conn, $reqInsertion);
 
Par contre je débute en PHP
Et pour l'incrémentation je l'ai carrément enlever.

Reply

Marsh Posté le 09-01-2009 à 18:46:39    

Zut, je ne vais pas pouvoir t'aider d'avantage pour le coup. Essaye de voir si tu trouves des forums ou des sites sur sql server où ils expliquent comment s'en sortir dans ce genre de cas.
 
Ha si, une dernière idée après je serais forcé d'abandonner : t'as fait une requête "insert" entre l'ouverture de la connexion à la base de donnée et les deux requêtes que je t'avais trouvé? Je ne sais pas si c'est une donnée globale au serveur (ce qui serait gênant) ou propre à chaque connexion.

Reply

Marsh Posté le 10-01-2009 à 11:20:42    

Pour le message sur la constante, c'est bêtement qu'il manque le $  

Code :
  1. $reqidentity = 'SELECT @@IDENTITY()';
  2. echo $reqidentity;


 
Comme omega2 l'a très justement suggéré, laisse SQL Server gérer ton autoincrémentation. Ce qui implique virer le champ [Lecteur] de ton insert.
 
Ex:

Code :
  1. $q = sprintf(
  2.   ' insert into table ( champ1, ..., champn ) values ( %s, .., %s ); select @@IDENTITY;'
  3.   fonction_d_escape( $val1 ),
  4.   ...
  5.   fonction_d_escape( $valn )
  6. );


où ton champ IDENTITY n'est pas dans les champ x
 
Remarque 1:
Pour taper sur du SQL Server, je te conseille d'utiliser un connecteur mssql plutôt qu'ODBC qui est (très) lent.
 
Remarque 2:
La capacité à envoyer deux requêtes en une dépend du connecteur (pas possible avec mysql par exemple). Si ton connecteur ne le permet pas, il te faudra découper en 2 requêtes.
 
Remarque 3:
La fonction 'fonction_d_escape' est importante! Cf les risques de SQL injection (cf google). En Mysql, tu as mysql_escape_string mais il te faut faire le boulot avec un connecteur bas niveau. Encore une fois, à chercher dans la doc de ton connecteur si tu ne peux pas utiliser de requêtes paramétrées par exemple à la place.


---------------
http://www.gabouel.com
Reply

Marsh Posté le 10-01-2009 à 11:20:42   

Reply

Marsh Posté le 10-01-2009 à 13:20:13    

Merci beaucoup, ça m'aide à comprendre.
En fait je suis obligé d'utiliser du odbc pour mon Travail maison dans cette matière (Multi-Niveaux)
Je crois que je suis pas loin vu que l'erreur me semble familière.
J'ai donc ça en code :  

Code :
  1. //$reqNumeroLec = 'select count(*) from Lecteur';
  2. //$NumeroLec = odbc_exec($conn, $reqNumeroLec);
  3. $reqidentity = 'SELECT @@IDENTITY()';
  4. echo $reqidentity;
  5. $reqInsertion = "Insert into Lecteur (Prénom,Nom ,Adresse ,DateNaissance, Ville, Département, CodePostal, Pays, [N°TélPersonnel], Photographie, Password, Login, email, cb) values ('$prenom', '$nom', '$adr', '$dateN', '$ville', '$dep', '$codeP', '$pays', '$numTel', '$pwd', '$confPwd', '$log', '$mail', '$cb')";
  6. echo $reqInsertion;
  7. odbc_exec($conn, $reqInsertion);


 
J'ai enlevé le truc avec lecteur (cf mis en commentaires //)
J'obtiens ça en réponse à mon echo :  
SELECT @@IDENTITY()Insert into Lecteur (Prénom,Nom ,Adresse ,DateNaissance, Ville, Département, CodePostal, Pays, [N°TélPersonnel], Photographie, Password, Login, email, cb) values ('jeff', 'jeff', 'peymilou', '01', 'jeffland', '24', '24100', 'france', '053587801', 'jeff', 'jeff', 'jeff24', 'jeff@jeff', '03121212121212121212')
 
Puis j'obtiens une erreur :  
Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Échec de la conversion d'une chaîne de caractères en type de données smalldatetime., SQL state 22008 in SQLExecDirect in D:\Inetpub\wwwroot\etd\jbeau\TM\inscription.php on line 43
 
Je pense que c'est dû à cause de la date de naissance que je fournis par l'utilisateur : cf :  
Merci beaucoup, ça m'aide à comprendre.
En fait je suis obligé d'utiliser du odbc pour mon Travail maison dans cette matière (Multi-Niveaux)
Je crois que je suis pas loin vu que l'erreur me semble familière.
J'ai donc ça en code :  

Code :
  1. //$reqNumeroLec = 'select count(*) from Lecteur';
  2. //$NumeroLec = odbc_exec($conn, $reqNumeroLec);
  3. $reqidentity = 'SELECT @@IDENTITY()';
  4. echo $reqidentity;
  5. $reqInsertion = "Insert into Lecteur (Prénom,Nom ,Adresse ,DateNaissance, Ville, Département, CodePostal, Pays, [N°TélPersonnel], Photographie, Password, Login, email, cb) values ('$prenom', '$nom', '$adr', '$dateN', '$ville', '$dep', '$codeP', '$pays', '$numTel', '$pwd', '$confPwd', '$log', '$mail', '$cb')";
  6. echo $reqInsertion;
  7. odbc_exec($conn, $reqInsertion);


 
J'ai enlevé le truc avec lecteur (cf mis en commentaires //)
J'obtiens ça en réponse à mon echo :  
SELECT @@IDENTITY()Insert into Lecteur (Prénom,Nom ,Adresse ,DateNaissance, Ville, Département, CodePostal, Pays, [N°TélPersonnel], Photographie, Password, Login, email, cb) values ('jeff', 'jeff', 'peymilou', '01', 'jeffland', '24', '24100', 'france', '053587801', 'jeff', 'jeff', 'jeff24', 'jeff@jeff', '03121212121212121212')
 
Puis j'obtiens une erreur :  
Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Échec de la conversion d'une chaîne de caractères en type de données smalldatetime., SQL state 22008 in SQLExecDirect in D:\Inetpub\wwwroot\etd\jbeau\TM\inscription.php on line 43
 
Ligne 43 correspondant à

Code :
  1. odbc_exec($conn, $reqInsertion);


et donc :

Code :
  1. $reqInsertion = "Insert into Lecteur (Prénom,Nom ,Adresse ,DateNaissance, Ville, Département, CodePostal, Pays, [N°TélPersonnel], Photographie, Password, Login, email, cb) values ('$prenom', '$nom', '$adr', '$dateN', '$ville', '$dep', '$codeP', '$pays', '$numTel', '$pwd', '$confPwd', '$log', '$mail', '$cb')";


Je pense que c'est dû à cause de la date de naissance que je fournis par l'utilisateur : cf : http://dormeur.info.iut.u-bordeaux [...] iption.php
dans le code ça correspond à :  

Code :
  1. <p> Date Naissance 
  2.    <td class="profilCase3"> <select name="bday">
  3.    <option value="">JJ</option>
  4.    <option value="01">01</option><option value="02">02</option><option value="03">03</option><option value="04">04</option><option value="05">05</option><option value="06">06</option><option value="07">07</option><option value="08">08</option><option value="09">09</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option>   </select><select name="bmonth">
  5.    <option value="">MM</option>
  6.    <option value="01">01</option><option value="02">02</option><option value="03">03</option><option value="04">04</option><option value="05">05</option><option value="06">06</option><option value="07">07</option><option value="08">08</option><option value="09">09</option><option value="10">10</option><option value="11">11</option><option value="12">12</option>   </select><select name="byear">
  7.    <option value="">AAAA</option>
  8.    <option value="2009">2009</option><option value="2008">2008</option><option value="2007">2007</option><option value="2006">2006</option><option value="2005">2005</option><option value="2004">2004</option><option value="2003">2003</option><option value="2002">2002</option><option value="2001">2001</option><option value="2000">2000</option><option value="1999">1999</option><option value="1998">1998</option><option value="1997">1997</option><option value="1996">1996</option><option value="1995">1995</option><option value="1994">1994</option><option value="1993">1993</option><option value="1992">1992</option><option value="1991">1991</option><option value="1990">1990</option><option value="1989">1989</option><option value="1988">1988</option><option value="1987">1987</option><option value="1986">1986</option><option value="1985">1985</option><option value="1984">1984</option><option value="1983">1983</option><option value="1982">1982</option><option value="1981">1981</option><option value="1980">1980</option><option value="1979">1979</option><option value="1978">1978</option><option value="1977">1977</option><option value="1976">1976</option><option value="1975">1975</option><option value="1974">1974</option><option value="1973">1973</option><option value="1972">1972</option><option value="1971">1971</option><option value="1970">1970</option><option value="1969">1969</option><option value="1968">1968</option><option value="1967">1967</option><option value="1966">1966</option><option value="1965">1965</option><option value="1964">1964</option><option value="1963">1963</option><option value="1962">1962</option><option value="1961">1961</option><option value="1960">1960</option><option value="1959">1959</option><option value="1958">1958</option><option value="1957">1957</option><option value="1956">1956</option><option value="1955">1955</option><option value="1954">1954</option><option value="1953">1953</option><option value="1952">1952</option><option value="1951">1951</option><option value="1950">1950</option><option value="1949">1949</option><option value="1948">1948</option><option value="1947">1947</option><option value="1946">1946</option><option value="1945">1945</option><option value="1944">1944</option><option value="1943">1943</option><option value="1942">1942</option><option value="1941">1941</option><option value="1940">1940</option><option value="1939">1939</option><option value="1938">1938</option><option value="1937">1937</option><option value="1936">1936</option><option value="1935">1935</option><option value="1934">1934</option><option value="1933">1933</option><option value="1932">1932</option><option value="1931">1931</option><option value="1930">1930</option><option value="1929">1929</option><option value="1928">1928</option><option value="1927">1927</option><option value="1926">1926</option><option value="1925">1925</option><option value="1924">1924</option><option value="1923">1923</option><option value="1922">1922</option><option value="1921">1921</option><option value="1920">1920</option><option value="1919">1919</option><option value="1918">1918</option><option value="1917">1917</option><option value="1916">1916</option><option value="1915">1915</option><option value="1914">1914</option><option value="1913">1913</option><option value="1912">1912</option><option value="1911">1911</option><option value="1910">1910</option><option value="1909">1909</option>   </select>
  9.    </td>


Je pense que c'est pas bon de faire ceci.
Je sais pas trop, quand pensez-vous ?


Message édité par ozone--24 le 10-01-2009 à 13:21:39
Reply

Marsh Posté le 10-01-2009 à 14:08:59    

Parenthèse : ne jamais utiliser de liste comme ça pour la date de naissance, c'est beaucoup plus long et relou pour l'utilisateur. Met un simple champs texte "date de naissance" :)
 
La plupart du temps, certaines données sont "hardcodées" dans les doigts de l'utilisateur, donc il mettera beaucoup moins de temps à taper au clavier qu'à sélectionner dans une énorme liste.
 
Pour ce qui est des erreurs, il faut de toute manière valider ce qui arrive (même pour les listes, facile de mettre une valeur non-conforme), et comme je l'ai dit, cela relève tellement de l'habitude que le taux d'erreurs sur ce genre de champs est très très bas.
 
Vu que c'est les seules listes, un utilisateur avancé qui a l'habitude de passer de champ à champ via la touche [tab] devra reprendre en main la souris pour sélectionner, ce qui va lui faire encore perdre du temps en plus.

Reply

Marsh Posté le 10-01-2009 à 14:31:49    

Merci !
J'ai bien mis ce que tu m'as dit donc ça :  

Code :
  1. <p> Date Naissance <input type="text" size="8" name="bday"/></p>


 
avec le bon code dans le php :

Code :
  1. $dateN = $_REQUEST['bday'];


Et il me met toujours :
SELECT @@IDENTITY()Insert into Lecteur (Prénom,Nom ,Adresse ,DateNaissance, Ville, Département, CodePostal, Pays, [N°TélPersonnel], Photographie, Password, Login, email, cb) values ('jeff', 'jeff', 'peymilou', '12031988', 'jeffland', '24', '24000', 'france', '053587801', 'jeff', 'jeff', 'jeff24', 'jeff@jeff', '03121212121212121212')
Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]La conversion du type de données char en smalldatetime a donné une valeur smalldatetime hors limite., SQL state 22008 in SQLExecDirect in D:\Inetpub\wwwroot\etd\jbeau\TM\inscription.php on line 43
 
Je comprends pas trop ce qu'il me veut ^^

Reply

Marsh Posté le 10-01-2009 à 15:49:30    

Lit : "La conversion du type de données char en smalldatetime"
 
Tu lui file une date comme ça, sans l'avoir vérifiée, et sans avoir pris soin qu'elle était dans le bon format. Tous les SGBD veulent une date dans un format spécifique.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed