php PDO==>mysql

Eléphanteau du PHP | 39 Messages

25 oct. 2011, 23:00

Bonjour à tous:)
J'aurais besoin d'aide pour transformer ce script qui est fait pour pdo,en mysql:

$stmt = $base->prepare("SELECT confirm,actif FROM pdf_membre WHERE login like :login ");

if($stmt->execute(array(':login' => $login)) && $row = $stmt->fetch())
{
$clebdd = $row['confirm']; // Récupération de la clé
$actif = $row['actif']; // $actif contiendra alors 0 ou 1
}


merci d'avance! :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 oct. 2011, 09:14

salut,

Tuto sur les fonctions mysql pour php http://phpdebutant.org/article65.php

+ mysql_real_escape_string

si tu tiens vraiment à garder la requête préparée (ce qui est totalement inutile ici) tu peux regarder dans les contributions stealth35 y indique comment faire

@+
Il en faut peu pour être heureux ......

ViPHP
xTG
ViPHP | 7331 Messages

26 oct. 2011, 09:44

Si ton problème est que ce code doit tourner sur un serveur ne disposant pas de l'extension PDO voici qui pourra peut être te dépanner : https://github.com/xTG/PDO

Eléphanteau du PHP | 39 Messages

26 oct. 2011, 13:02

ok merci!mais j'ai reussi a le faire tout seul! :) sans requete préparé puisqu'il est vrai que c'est inutil .

Alors la il ne me reste qu'un dernier problème et mes scripts d'inscription/confirmation php seront terminés :).
Lorsque le visiteur enttre ses identifiants dans le formlaire(au debut de cette page il y a un session_start()), je recupere es valeurs dans la page cible et dans cette page cible j'ai besoin d'utiliser la variable $_SESSION pour recuperer 3 variables pour les utiliser dans la page de confirmation,mais j'ai un problème:

script de ma page cible du formulaire:
<?php
session_start();

$_SESSION['mail']=$_POST['mail'];
$_SESSION['passwd']=$_POST['passwd'];
$_SESSION['ville']=$_POST['ville'];

$mail = htmlentities($_POST['mail']);
$nom_site = "quelquechose";
$email_admin = "[email protected]";



		
		  
		  // on teste l'existence de nos variables. On teste également si elles ne sont pas vides //
		   if (( empty($_POST['login'])) || (empty($_POST['passwd'])) || (empty($_POST['passwdc'])) || ( empty($_POST['ville'])) || (empty($_POST['mail']))) 

			{
				echo 'Un ou plusieurs champs ne sont pas remplis, <a href="javascript:history.back(1)">Retour au formulaire</a>';
				exit();
 			}
			 elseif ((!empty($_POST['login'])) && (!empty($_POST['passwd'])) && (!empty($_POST['passwdc'])) && (!empty($_POST['ville'])) && (!empty($_POST['mail']))) 

			 {
            $base = mysql_connect ('...') or die('Erreur de connexion '.mysql_error());
		    mysql_select_db('...',$base)  or die('Erreur de selection '.mysql_error()); 
             
             // on recherche si ce login est déjà utilisé par un autre membre
             $sql = 'SELECT count(*) FROM pdf_membre WHERE login="'.mysql_escape_string($_POST['login']).'"'; 
             $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
             $data = mysql_fetch_array($req); 
     
             if ($data[0] > 0)  
         
			 { 
			 
                echo 'Un membre possède déjà ce login ==>  <a href="javascript:history.back(1)">Retour au formulaire</a>'; 
             } 
          }
			//else {
			
			/*if*/if (preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!", $mail)) //Verifie que l'email entrée n'est pas une fausse.
    {
		$chaine = "abcdefghijklmnopqrstuvwxyz0123456789"; 
		$confirm = str_shuffle($chaine); //On créé le code de confirmation
		
		$login = htmlentities($_POST['login']); //On recupère les infos
		$passwd = htmlentities($_POST['passwd']);
		$passwdc = htmlentities($_POST['passwdc']);
		$ville = htmlentities($_POST['ville']);
		
		

		
		/*On Fait la variable contenant le mail de confirmation*/
	
		$message1 = '<html><body>Bonjour ' . $login . ' et bienvenue sur ' .$nom_site. '.</br>'; 
		$message1 .= '</br>';
		$message1 .= 'Vous venez de vous inscrire et nous sommes heureux<br>de pouvoir vous compter aujourd\'hui parmi nos membres.<br>'; 
		$message1 .= 'Voici un rappel de vos identifiants, notez les précieusement : <br>';
		$message1 .= 'Votre Pseudo :' . $login .'.<br>';
		$message1 .= 'Votre Mot de passe:' . $passwd .'.<br><br>';
		$message1 .= 'Votre Mail:' . $mail .'.<br><br>';
		$message1 .= 'Votre Ville:' . $ville .'.<br><br>';									
		$message1 .= 'Si vous souhaitez changer vos informations, rendez-vous dans votre compte pour les mettre à jour.<br>';
		$message1 .= 'Votre Clé d\'activation:<br>';
   		$message1 .= 'www.....fr/confirm.php?login=' . str_replace(' ','%20',$login) . '&confirm=' . $confirm . '<br><br>';
		$message1 .= 'A très bientôt sur le site!<br>L\'équipe de ' .$nom_site. '.<br><a href="www.....fr">' .$nom_site. '</a>';


		
		$verification = mysql_query("SELECT COUNT(*) FROM pdf_membre WHERE login='$login' OR mail='$mail'") or die (mysql_error());
		$donnees = mysql_fetch_array($verification)or die (mysql_error());
		

	
		
	


		
			if( $passwd != $passwdc) //On verifie que les 2 pass sont identiques
			{
				echo 'Les mots de passe ne sont pas identiques ==> <a href="javascript:history.back(1)">Retour au formulaire</a>';
			}
			else //Si tout est bon on entre la clé(les données )dans la BDD et on envoye le mail
			{
				
			$login =  mysql_real_escape_string($login); //On protege les infos
	$passwd = mysql_real_escape_string($passwd);
	$passwdc = mysql_real_escape_string($passwdc);
	$ville = mysql_real_escape_string($ville);
	$confirm = mysql_real_escape_string($confirm);
	$mail = mysql_real_escape_string($mail);
	
				//mysql_query("INSERT INTO pdf_membre (id,login,passwd,mail,ville) VALUES ('','$login', '$passwd', '$mail', '$ville')");
				mysql_query("INSERT INTO pdf_membre (confirm) VALUES ('$confirm')");
				echo 'Bravo, vous êtes maintenant inscrit sur ' .$nom_site. '. <br>Vous allez recevoir un e-mail pour activer votre compte. <br><a href="/index.php">Retour à l\'Accueil</a>';
				$entete = "MIME-Version: 1.0\r\n";
				$entete .= "Content-type: text/html; charset=iso-8859-1\r\n";
				$entete .= "From: <$email_admin>\r\n";
				$entete .= "Reply-To: $email_admin\r\n";
				mail($mail,'Bienvenue sur ' .$nom_site. ' ' . $login .'.' , $message1, $entete);
			}
		}
		

		else
		{ echo ' L\'adresse email entrée n\'existe pas ==> <a href="javascript:history.back(1)">Retour au formulaire</a>';}
		

		 mysql_close($base);  //On se deconnecte
	




?>
<html>
<body>

<!-- On affiche la reponse de tout le code du dessus -->
</body>
</html>


Script de la page de confirmation:
<?php
session_start();

$_SESSION['mail']=$mail;
$_SESSION['passwd']=$passwd;
$_SESSION['ville']=$ville;


//on verifie si les variables ne sont pas vides
if (!isset($_GET['login']))//si le login  n'existe pas...
{
 echo 'erreur: pas de login fourni';
 exit();
}
if ( !isset($_GET['confirm']) )
{
 echo 'erreur: pas de code de confirmation';
 exit();
} 

$base = mysql_connect ('...') or die('Erreur de connexion '.mysql_error());
mysql_select_db('...',$base)  or die('Erreur de selection '.mysql_error()); 

// Récupération des variables nécessaires à l'activation
$login = $_GET['login'];
$cle = $_GET['confirm'];
$reponse = mysql_query ("SELECT actif FROM pdf_membre "); //On recupère les infos à partir du pseudo $reponse = mysql_query ("SELECT * FROM pdf_membre WHERE login='$login'");//
$donnees = mysql_fetch_array ($reponse);
$actif = $donnees['actif'];

$reponse1 = mysql_query ("SELECT confirm FROM pdf_membre "); //On recupère les infos à partir du pseudo $reponse = mysql_query ("SELECT * FROM pdf_membre WHERE login='$login'");//
$donnees = mysql_fetch_array ($reponse1);
$clebdd = $donnees['confirm'];


//Faut utiliser une variable session pour "appeler les variables ville mail et lautre"pour pouvoir les stocker
	
// Récupération de la clé correspondant au $login dans la base de données

/*$stmt = $base->prepare("SELECT confirm,actif FROM pdf_membre WHERE login like :login ");

if($stmt->execute(array(':login' => $login)) && $row = $stmt->fetch())
  {
    $clebdd = $row['confirm'];	// Récupération de la clé
    $actif = $row['actif']; // $actif contiendra alors 0 ou 1
  }
*/

//$sql = 'SELECT confirm,actif FROM pdf_membre WHERE login like %$login%'; 
$result = mysql_query("SELECT `confirm`,`actif` FROM `pdf_membre` WHERE `login` like '%$login%'") or exit(mysql_error());
$row= mysql_fetch_assoc($result);

if($result && $row)
{
      $clebdd = $row['confirm']; // Récupération de la clé 
      $actif = $row['actif'];  // $actif contiendra alors 0 ou 1 
     
}		
		
// On teste la valeur de la variable $actif récupéré dans la BDD
if($actif == '1') // Si le compte est déjà actif on prévient
  {
     echo "Votre compte est déjà actif !";
  }
else // Si ce n'est pas le cas on passe aux comparaisons
  {
     if($cle == $clebdd) // On compare nos deux clés	
       {
          // Si elles correspondent on active le compte !	
 mysql_query("UPDATE pdf_membre SET actif = 1 where login like '$login'");
	mysql_query("INSERT INTO pdf_membre (id,login,passwd,mail,ville) VALUES ('','$login', '$passwd', '$mail', '$ville')") or exit(mysql_error());         
	 echo "Votre compte a bien été activé !";

      

       }
     else // Si les deux clés sont différentes on provoque une erreur...
       {
          echo "Erreur ! Votre compte ne peut être activé...";
       }
  }
  mysql_close($base);
  ?>

<html>
<body>

</body>
</html>


et voici le message d'erreur quand je clic sur le lien d'activation recu dans le mail:

Notice: Undefined variable: mail in /homez.466/animejap/www/confirm.php on line 4

Notice: Undefined variable: passwd in /homez.466/animejap/www/confirm.php on line 5

Notice: Undefined variable: ville in /homez.466/animejap/www/confirm.php on line 6
Erreur ! Votre compte ne peut être activé...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 oct. 2011, 14:04

oui mais non, le lien provenant de l'e-mail est en dehors du cadre de la session !

ceci s'explique simplement : un session ne dure qu'un certain temps (et normalement) finis si l'on ferme le navigateur avant l'expiration de la session !
quand tu valide avec l'email cela peux être sur une autre machine (il m'arrive d'avoir le mail sur mon téléphone et de l'utiliser pour la validation par ce que j'ai ouvert le client mail sur le pc :mrgreen: ).

bref un lien de validation c'est un identifiant et une "clef".

généralement un md5 / sha1 d'une combinaison quelconque pourvu qu'elle soit unique (par exemple md5(email + id + time) ou au pire un md5(uniqid()) ;) ).

avec une url du genre http://www.tonsiteatoi.com/validationco ... 6789abcdef
et sur la page de vérif tu regarde dans la base s'il y aun compte avec l'id $_GET['id'] et qui a une clef $_GET['clef'] associée.

certain utilise simplement l'adresse comment clef, étant donnée, qu'en général on la considère unique dans toute la base (sinon c'est le merdier si pierre et paul ont la même adresse email ;) )

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 39 Messages

26 oct. 2011, 14:23

ok j'ai bien compris ce que tu as expliqué,donc il faut que je verifie si l'id contenu dans l'url existe ien dans ma bdd ainsi que la clé qui lui est associée existe aussi,
mais comment verifier justement cette association,que la clé est bien associée a un id particulier?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 oct. 2011, 14:27

ben select count(*) from table where id=idurl and clef=clefdelurl

après plusieurs méthode pour stocker la clef mais bon la méthode la plus simple serais de la mettre la table des utilisateurs.

ceci dit une autre méthode est d'utiliser une autre table qui sert de stockage "temporaire" pour cela avec une date et une heure limite, un ramasse miette qui vire les clef expirer

et ça roule.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 39 Messages

26 oct. 2011, 15:07

mais dans ma page pdf inscription,du coup il faut que je change 'email que j'envoi et a la place du login,mettre id dan le mail d'activation,mais il faut que je dise ce que contient la avriable $id dans la mail:
$message1 .= 'www.....fr/confirm.php?id=' . str_replace(' ','%20',$id) . '&confirm=' . $confirm . '<br><br>';
qu'esst-ce que je met avant cette ligne pour la valeur de $id=???? et que signifie le "('','%20')" dans la ligne au dessus?merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 oct. 2011, 15:56

%20 c'est un espace dans une url (voir dans la doc url_encode, par exemple).

l'id c'est la clef primaire de l'utilisateur que tu récupère après insertion dans la table.
en ensuite tu peux envoyer le mail

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 39 Messages

26 oct. 2011, 16:04

oui l'inserer ok mais quand je crée le mail de confirmation(qui se fait avant d'inserer id) et que je valide l'inscrription il me met un message d'erreur comme quoi il ne sait pas ce que vaut la variable id que j'ai mis dans la portions de ode précédent,dans ce cas que dois-je mettre comme valeur pour $id= ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 oct. 2011, 22:25

insertion avant envoie de l'email !

il faut un champs permettant d'activer ou non le compte dans la table des utilisateurs (par exemple avec mysql un champs de type enum('desactivé','actif');=


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 39 Messages

27 oct. 2011, 00:20

ce n'est pas ce que j'ai dit.
je dit que je crée le mail avant d'inserer(puis ensuite j'envoi si tout est bon dans mon code)
oui j'ai un champs de type enum mais je ne parle pas de ca.(ca on s'en sert dans la page de confirmation)
je réexplique mon problème.
dans ma page d'inscription_cible , je teste les variables etc du formulaires,login,mot de pass identiques etc,ensuite je crée le mail de confirmation ,si ttout est bon j'insert id et clé dans ma table et j'envoi le mail.
mais quand je clic sur le mail de confirmation(ww...fr/confirm.php/id=..&confirm=....)il y a erreur pare que il ne sait pas ce que vaut $id qui se trouve dans ma page(la ligne pour créer le LIEN d'activation):cette ligne ci:
$message1 .= 'www.....fr/confirm.php?id=' . str_replace(' ','%20',$id) . '&confirm=' . $confirm . '<br><br>';
c'est ca que je veux savoir,
je sais que $login=$_POST['login']
$ville=$_POST['ville'] etcc...
mais qu'est-ce que $id??( est-ce que auto incrémente signifie que quelque chose est attribué automatiquement au champs id dans ma table lorsque le visiteur a validé le formulaire d'inscription?)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 oct. 2011, 09:21

mysql_last_insert_id sur la page de validation du formulaire avant envoie du mail et après insertion dans la table.

@+
Il en faut peu pour être heureux ......