[RESOLU] Convertion PDO

Mammouth du PHP | 804 Messages

07 févr. 2014, 18:54

Bonjour,

j'ai des soucis de conversion PDO, j'ai encore un peu de mal à me familiariser avec !
j'ai cherché sur google mais apparemment il y a pas de solution claire à ma recherche, voici le code que je converti PDO
	$query = 'SELECT email'
		. ' FROM source_clients'
		. ' WHERE email=1;';
		
	$select = $db->prepare($query);
	$select->bindValue(1, 	md5($s_Login), 	PDO::PARAM_STR);
	$select->execute();
 	$select->closeCursor();
	$select = NULL;
	
	    if ($query !== false) {

		$row = mysql_fetch_array($query);	 

        if ($row !== false){

            unset($query);
			
            if ($row['pass'] == sha1($_POST['s_Pass'])) 
			{
				$_SESSION['mailsutilisateur'] = $_POST['s_Login'];
										
                unset($row['pass']); // info inutile en session
				
                $_SESSION['S_membre'] = $row;

                $NewMembreID = md5(uniqid(rand(), true));
				              
			    if(!empty($row['userID']))
				{

                    $sql = "UPDATE source_clients".
                        "SET userid= '" . $NewMembreID . "' ".
                         "WHERE clt_id = '" . $_SESSION['S_membre']['clt_id'];
						 
                    if (mysql_query($sql) === false) {

                    }
                }
                $cookietime = time() + (86400 * $temp_vie_cookie);
                setcookie("MembreID", $NewMembreID, $cookietime);
                header("Location: index.php");
            } else {
                echo " error de mdp ";
            }
        } else {
            			
        }
    } else {    
	
    }
} else {
     
echo "Utilisateur non trouv&eacute; <br />";
}



if (!empty($_COOKIE['MembreID'])) { // si le cookie existe
	
    $sql = "SELECT *
        FROM source_clients
		WHERE userid='" . mysql_real_escape_string($NewMembreID). "'  "; 
        
    $query = mysql_query($sql);

    if ($query !== false) {
        $row = mysql_fetch_array($query);
        
		if ($row !== false) {
            mysql_free_result($query); // important
            unset($row['pass']); 
            $_SESSION['S_membre'] = $row;
            
$cookietime = time() + $temp_vie_cookie; 
            setcookie("MembreID", $_COOKIE['MembreID'], $cookietime);
        } else {
			
         // echo " utilisateur inconnu !";
        }
		
    } else {
		  echo mysql_errno($$link) . ": " . mysql_error($link) . "\n";		  
    }
}

Pour l'instant je bloque sur cette ligne, je n'arrive pas à trouver l'équivalent PDO de:
$row = mysql_fetch_array($query);
j'ai l'erreur suivante

Code : Tout sélectionner

atal error: Call to undefined method PDO::fetch()

merci de votre aide

ViPHP
xTG
ViPHP | 7331 Messages

07 févr. 2014, 19:19

L'équivalent est bien fetch.
Il faut l'utiliser sur l'objet retourné par la méthode execute. :)

Mammouth du PHP | 804 Messages

08 févr. 2014, 10:42

merci de ta réponse mais ,
tu veux dire que c'est le bon code sauf qu'il faut que je ferme ma connexion après ?
	$query = 'SELECT email'
		. ' FROM source_clients'
		. ' WHERE email=1;';
		
	$select = $db->prepare($query);
	$select->bindValue(1, 	md5($s_Login), 	PDO::PARAM_STR);
	$select->execute();


	    if ($query !== false) {

		//$row = mysql_fetch_array($query);	 
		$row = $select->fetch();

        if ($row !== false){

            unset($query);
			
            if ($row['pass'] == sha1($_POST['s_Pass'])) 
			{
				$_SESSION['mailsutilisateur'] = $_POST['s_Login'];
										
                unset($row['pass']); // info inutile en session
				
                $_SESSION['S_membre'] = $row;

                $NewMembreID = md5(uniqid(rand(), true));
				              
			    if(!empty($row['userID']))
				{

                    $sql = "UPDATE source_clients".
                        "SET userid= '" . $NewMembreID . "' ".
                         "WHERE clt_id = '" . $_SESSION['S_membre']['clt_id'];
						 
                    if (mysql_query($sql) === false) {

                    }
                }
                $cookietime = time() + (86400 * $temp_vie_cookie);
                setcookie("MembreID", $NewMembreID, $cookietime);
                header("Location: index.php");
            } else {
                echo " error de mdp ";
            }
        } else {
            
			echo " pas de résultat  donc utilisateur inconnu";
        }
    } else {
         
		 echo " erreur SQL, => mysql_error();";
    }
} else {
	
     echo "Utilisateur non trouv&eacute; <br />";
}



	$select->closeCursor();
	$select = NULL;


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

08 févr. 2014, 11:34

Non il veux dire que la méthode execute() retourne quelque chose (une pdostatement pour être exact) et que c'est sur cette objet que la méthode fetch existe et pas sur la classe PDO !

Plus d'info sur la doc de PDO (c'est généralement bien documenté avec de beau exemple ;)

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

Mammouth du PHP | 804 Messages

08 févr. 2014, 11:40

ca fait deux jour que je la bouffe la doc, bon et bien je vais en manger encore une peu coté pdostatement :mrgreen:

merci de votre aide

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

08 févr. 2014, 12:11

bon aller avec les yeux mieux ouvert se sera mieux.

j'ai confondu exec et execute ... :oops:

donc ce que tu fait est presque correct.
au niveau code pas grand chose à redire par contre ta requête SQL n'est pas bonne .
les marqueurs nommés doivent commencer par ':' (cf doc de bindValue) or toi tu dois demander une ligne où email = 1 :)

j'ai repris ton code pour qu'il soit plus fonctionnel.
J'ai supposé que l'existance des variables étaient vérifiée avant (genre d'où vient $s_Login, vu sont une variable de session qui n'est pas prise dans $_SESSION ?)
<?php
$db = new PDO("");
$query = 'SELECT email FROM source_clients WHERE email=:email';

$select = $db->prepare($query);
$select->bindValue(':email', md5($s_Login));
$ret = $select->execute();
if ($ret !== false) {
    $row = $select->fetch();
    if ($row !== false) {
        if ($row['pass'] == sha1($_POST['s_Pass'])) {
            $_SESSION['mailsutilisateur'] = $_POST['s_Login'];
            // attention redondance avec la lige du dessus c'est la même chose sous forme de tableau c'est tout.
            $_SESSION['S_membre'] = $row;

            $NewMembreID = md5(uniqid(rand(), true));
            // Attention ce if est inutile car
            // 1 : tu ne selectionne pas le userID dans la requête
            // 2 : si tu es la c'est qu'il y a un résultat donc cette doit exister et ne pas être vide (vu son nom c'est la PK non ?)
            // 3 : tu utilise  $_SESSION['S_membre']['clt_id'] qui ne peux pas exister puisse qu'il n'est pas selectionné dans la requête et que tu écrse S_membre 3 ligne plus haut ;)
            if (!empty($row['userID'])) {
                $sql = "UPDATE source_clients" .
                    "SET userid= '" . $NewMembreID . "' " .
                    "WHERE clt_id = '" . $_SESSION['S_membre']['clt_id'];
                $db->exec($sql);
                // TODO ajouter la gestion d'erreur :  try / catch + test du retour de la méthode exec
            }
            $cookietime = time() + (86400 * $temp_vie_cookie);
            setcookie("MembreID", $NewMembreID, $cookietime);
            header("Location: index.php");
        } else {
            echo " error de mdp ";
        }
    } else {
        echo " pas de résultat  donc utilisateur inconnu";
    }

} else {
    echo 'Erreur SQL : ';
    $err = $db->errorInfo();
    echo $err[2];
}
$select->closeCursor();
voila comme ça c'est mieux est plus clair :)


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

Mammouth du PHP | 804 Messages

08 févr. 2014, 12:24

Merci pour ce super tuto :shock: , la prochaine dans le premier message je dépose une tasse de café avec croissant :mrgreen: :mrgreen: :mrgreen:

tu as conscience que tu à réduit mon code de moitié quand même ? =D>

j'ai hâte de l'étudier, je vais l'examiner et le comparer à mon anciens pour comprendre mes erreurs et ne plus les refaire

encore merci pour votre aide :wink: , en ce moment j'ai l'impression qu'il y a que vous pour la permanence =D>

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

08 févr. 2014, 12:43

encore merci pour votre aide , en ce moment j'ai l'impression qu'il y a que vous pour la permanence
ben une fois que ma fille dors j'ai du temps "libre" ^^

sinon j'ai juste enlever un if et virer des lignes vide / inutile c'est pas grand chose ;)


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

Mammouth du PHP | 804 Messages

08 févr. 2014, 14:52

en tout cas ca ma bien aidé, j'avance plutôt bien :D

Mammouth du PHP | 804 Messages

08 févr. 2014, 16:23

tout en clôturant ce post je voudrait vous poser une question, A-t-on réellement besoins des cookies pour créer des accès sécurisés ?
ou est l'intérêt en dehors d'éviter aux membres de devoir se connecter à chaque fois ?

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

08 févr. 2014, 18:32

aucun, le cookie c'est un confort (comme tu l'indique).
mais cela peux aussi être une faille de sécurité (c'est falsifiable, après tous c'est un fichier dans le contexte navigateur client).

Attention tout de même il y a, par défaut, un cookie qui est placé pour la session php (regarde les cookies avec l'extension développeur d'un navigateur).


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