Insertion de caractère spéciaux dans une base de donnée

Eléphanteau du PHP | 34 Messages

15 janv. 2016, 11:45

Bonjour,

Je suis entrain de faire un système de clé CD pour mon site, la clé ressemble à ceci: XXXX-XXXX-XXXX-XXXX-XXXX
J'ai fais un script qui permet de générer aléatoirement une clé CD, jusque la, tous va bien ou à peu près..

Donc, le problème n°1 est que la clé générer ne correspond pas à celle afficher (sa me génère 917F9-1F431-6BE34-5A58D-9A53C mais sur la page de confirmation sa me marque 6DEAA-4706C-52995-8132C), c'est pas gênant mais j'aimerais régler ce soucis.
Deuxième soucis très embêtant, j'ai un formulaire d'inscription ou il y à un input pour la clé CD, mais lorsque je rentre la clé CD (j'ai essayer les deux au dessus), sa ne fonctionne pas.
Par contre, si j'insère dans ma base de donnée la clé cd "123" sa fonctionne à merveille.

Voici le code de la génération aléatoire:
$serial = KeyGen();
$insertmbr = $bdd->prepare("INSERT INTO licence(licence) VALUE ('$serial')");
$insertmbr->execute();
Je pense que le soucis viens des tiret, j'ai donc fais un mysql_real_escape_string($serial) dans mon fichier key.php et dans ma page d'inscription, mais sa ne fonctionne pas.
Je précise, ma table "licence" est en type "varchar 255" et j'ai essayer en text, bigtext..


Si quelqu'un aurais une idée,
Cordialement.

ynx
Mammouth du PHP | 586 Messages

15 janv. 2016, 12:13

Salut,

La fonction mysql_real_escape_string est réservé à l'API Mysql (les fonctions mysql_*) qui est obsolète et même enfin supprimée depuis PHP7.
Puisque tu utilises PDO, pour échapper les caractères spéciaux dans une requête, tu peux soit utiliser une requête préparée (avec marqueurs ou paramètres nommés), soit utiliser la méthode PDO::quote().

Tu peux voir les exemples sur la doc :
http://php.net/manual/fr/pdo.prepare.php
http://php.net/manual/fr/pdo.quote.php

Edit : les tirets ne devraient pas poser problème pour la requête. Pense à activer le rapports d'erreur de PDO (par défaut en silencieux) afin de voir les éventuelles erreurs sql : http://php.net/manual/fr/pdo.error-handling.php

Bonne journée,

Eléphanteau du PHP | 34 Messages

15 janv. 2016, 13:11

Salut,

La fonction mysql_real_escape_string est réservé à l'API Mysql (les fonctions mysql_*) qui est obsolète et même enfin supprimée depuis PHP7.
Puisque tu utilises PDO, pour échapper les caractères spéciaux dans une requête, tu peux soit utiliser une requête préparée (avec marqueurs ou paramètres nommés), soit utiliser la méthode PDO::quote().

Tu peux voir les exemples sur la doc :
http://php.net/manual/fr/pdo.prepare.php
http://php.net/manual/fr/pdo.quote.php

Edit : les tirets ne devraient pas poser problème pour la requête. Pense à activer le rapports d'erreur de PDO (par défaut en silencieux) afin de voir les éventuelles erreurs sql : http://php.net/manual/fr/pdo.error-handling.php

Bonne journée,
Salut,
Merci pour te réponse, donc j'ai activer le rapport d'erreur et l'erreur est:
Clef CD: B2FB3-E717E-5AF5D-007C3-48C6D
Erreur : invalid data source name

ynx
Mammouth du PHP | 586 Messages

15 janv. 2016, 13:33

Il semble qu'il y ai une erreur au niveau de la connexion à la bdd.

Peux tu stp nous montrer le code de ta connexion à la bdd (new PDO(...)) en prenant soin de supprimer tes informations confidentielles (login/mot de passe) ?

Eléphanteau du PHP | 34 Messages

15 janv. 2016, 13:58

Il semble qu'il y ai une erreur au niveau de la connexion à la bdd.

Peux tu stp nous montrer le code de ta connexion à la bdd (new PDO(...)) en prenant soin de supprimer tes informations confidentielles (login/mot de passe) ?
Pas de soucis, tiens:
try
{
  $bdd = new PDO('mysql:host=localhost;dbname=landwars;charset=utf8', '****', '*****');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}

Eléphanteau du PHP | 34 Messages

15 janv. 2016, 15:06

J'ai plus d'info:

Code : Tout sélectionner

[Fri Jan 15 14:05:00 2016] [error] [client ******] FastCGI: server "/fcgi-bin-php5-fpm-landstudio" stderr: PHP message: PHP Notice: Undefined variable: dsn in /var/www/landstudio/v1/manager/key.php on line 31 [Fri Jan 15 14:05:00 2016] [error] [client ******]] FastCGI: server "/fcgi-bin-php5-fpm-landstudio" stderr: PHP message: PHP Notice: Undefined variable: user in /var/www/landstudio/v1/manager/key.php on line 31 [Fri Jan 15 14:05:00 2016] [error] [client ******] FastCGI: server "/fcgi-bin-php5-fpm-landstudio" stderr: PHP message: PHP Notice: Undefined variable: password in /var/www/landstudio/v1/manager/key.php on line 31
Je sais d'ou sa peux venir..

ynx
Mammouth du PHP | 586 Messages

15 janv. 2016, 15:11

D'après tes derniers messages d'erreur, tu as une autre connexion bdd définie dans le fichier key.php à la ligne 31 (utilisant des variables non initialisées).
Le problème de connexion semble donc venir de ce fichier.

Eléphanteau du PHP | 34 Messages

15 janv. 2016, 15:22

Problème résolu, mais les deux problème (de mon premier message) n'est toujours pas régler..
J'ai fais quelques captures d'écrans:


Sur le site:
Image

Dans la BDD:
Image

Et si je rentre une de ces valeurs, sa ne fonctionne pas..

ynx
Mammouth du PHP | 586 Messages

15 janv. 2016, 16:11

Concernant le problème de différence entre la clé généré et la clé affichée, le problème vient surement du fait que tu génères une nouvelle clé lors de l'affichage au lieu d'afficher celle déjà générée.
A propos du deuxième problème, le soucis vient du fait que la vérification de la clé saisie par rapport a la clé enregistré en bdd n'est pas correcte ?

Dans les deux cas, peux tu stp nous montrer le code correspondant ?

Eléphanteau du PHP | 34 Messages

15 janv. 2016, 17:03

Concernant le problème de différence entre la clé généré et la clé affichée, le problème vient surement du fait que tu génères une nouvelle clé lors de l'affichage au lieu d'afficher celle déjà générée.
A propos du deuxième problème, le soucis vient du fait que la vérification de la clé saisie par rapport a la clé enregistré en bdd n'est pas correcte ?

Dans les deux cas, peux tu stp nous montrer le code correspondant ?
Le code de key.php:
<?php
include 'config.php';

function KeyGen(){
     $key = md5(microtime());
     $new_key = '';
     for($i=1; $i <= 25; $i ++ ){
               $new_key .= $key[$i];
               if ( $i%5==0 && $i != 25) $new_key.='-';
     }
  return strtoupper($new_key);
  }
$x = 0;
while($x <= 0) {
  echo KeyGen();
  echo "<br />";
$x++; 
}

$serial = KeyGen();


$insertmbr = $bdd->prepare("INSERT INTO licence(licence) VALUE ('$serial')");
$insertmbr->execute();
?>

Et pour la vérification de la clé, j'ai fais cela (j'ai regrouper tous le code, sinon le code est trop long)
<?php
$licence = $_POST['licence'];
$reqlicence = $bdd->prepare('SELECT licence FROM licence WHERE licence = '. $_POST['licence'] .' AND utiliser = 0 ');
$reqlicence->execute(array($licence));
$licencexist = $reqlicence->rowCount();
	if($licencexist == 1)
	{
        // Le reste de mon code pour l'inscription
        } 
        else
        {
	$erreur = '
	<div class="alert alert-danger padding-20 fade in no-border-radius" role="alert">
	<button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-    only">Close</span></button>
	<h4>Erreur lors de l\'inscription</h4>
	<br />La clé CD <b>" '. $licence .'"</b> est invalide ou est déjà utilisé.</div>';
	 }


?>

Eléphanteau du PHP | 34 Messages

15 janv. 2016, 17:04

Concernant le problème de différence entre la clé généré et la clé affichée, le problème vient surement du fait que tu génères une nouvelle clé lors de l'affichage au lieu d'afficher celle déjà générée.
A propos du deuxième problème, le soucis vient du fait que la vérification de la clé saisie par rapport a la clé enregistré en bdd n'est pas correcte ?

Dans les deux cas, peux tu stp nous montrer le code correspondant ?
Le code de key.php:
<?php
include 'config.php';

function KeyGen(){
     $key = md5(microtime());
     $new_key = '';
     for($i=1; $i <= 25; $i ++ ){
               $new_key .= $key[$i];
               if ( $i%5==0 && $i != 25) $new_key.='-';
     }
  return strtoupper($new_key);
  }
$x = 0;
while($x <= 0) {
  echo KeyGen();
  echo "<br />";
$x++; 
}

$serial = KeyGen();


$insertmbr = $bdd->prepare("INSERT INTO licence(licence) VALUE ('$serial')");
$insertmbr->execute();
?>

Et pour la vérification de la clé, j'ai fais cela (j'ai regrouper tous le code, sinon le code est trop long)
<?php
$licence = $_POST['licence'];
$reqlicence = $bdd->prepare('SELECT licence FROM licence WHERE licence = '. $_POST['licence'] .' AND utiliser = 0 ');
$reqlicence->execute(array($licence));
$licencexist = $reqlicence->rowCount();
	if($licencexist == 1)
	{
        // Le reste de mon code pour l'inscription
        } 
        else
        {
	$erreur = '
	<div class="alert alert-danger padding-20 fade in no-border-radius" role="alert">
	<button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-    only">Close</span></button>
	<h4>Erreur lors de l\'inscription</h4>
	<br />La clé CD <b>" '. $licence .'"</b> est invalide ou est déjà utilisé.</div>';
	 }


?>

Je précise que le code fonctionne avec la licence "1234" mais pas avec 123-456-789..

Merci de m'aider :p

Avatar du membre
Mammouth du PHP | 1609 Messages

15 janv. 2016, 17:12

Salut, à priori la boucle while avec $x = 0 ne sert à rien. La clé enregistrée n'est jamais affichée à l'écran.
La clé insérée est $serial = KeyGen();, il faut donc faire un echo de $serial si tu veux voir la clé insérée.

La vérification de la clé devrait mieux fonctionner après mis à part que licence étant une chaine de caractère, la valeur devrait être entre ' ou " dans la requête.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 34 Messages

15 janv. 2016, 18:45

Salut, à priori la boucle while avec $x = 0 ne sert à rien. La clé enregistrée n'est jamais affichée à l'écran.
La clé insérée est $serial = KeyGen();, il faut donc faire un echo de $serial si tu veux voir la clé insérée.

La vérification de la clé devrait mieux fonctionner après mis à part que licence étant une chaine de caractère, la valeur devrait être entre ' ou " dans la requête.
Salut, pour le premier problème, c'est vrai que j'avais oublier d'enlever cela, merci de me l'avoir rappeller :oops:
Sa n'a pas résolu le problème, j'ai toujours le message:
ERREUR LORS DE L'INSCRIPTION
La clé CD "DDA55-188CB-25F0E-6CC4F-91A58" est invalide ou est déjà utilisé.
Alors qu'elle est valide & non utilisé..
J'ai essayer avec les ' et les " mais aucun succès..

Avatar du membre
Mammouth du PHP | 1609 Messages

15 janv. 2016, 19:05

As-tu vérifié la requête (un simple echo pour voir à quoi elle ressemble) ? ne fait-elle pas une erreur ? l'as tu testé directement via phpmyadmin ou autre ? as tu bien vérifié la présence de la clé dans la table ? as tu vérifié la valeur de $reqlicence->rowCount() ? as tu vérifié $_POST['licence'] ? d'ailleurs je pense qu'il y a un truc pas net sur ces deux lignes :
$reqlicence = $bdd->prepare('SELECT licence FROM licence WHERE licence = '. $_POST['licence'] .' AND utiliser = 0 ');
$reqlicence->execute(array($licence));
ça devrait plutôt être quelque chose comme ça :
$reqlicence = $bdd->prepare('SELECT licence FROM licence WHERE licence = :licence AND utiliser = 0');
$reqlicence->execute(array(':licence' => $licence));
Modifié en dernier par Saian le 15 janv. 2016, 21:09, modifié 1 fois.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 34 Messages

15 janv. 2016, 21:05

*supprimé* (voir page 2)
Modifié en dernier par xnooztv le 15 janv. 2016, 21:27, modifié 1 fois.