vue Search with PDO =)
Kommunauty
Connexion
Inscription

Search with PDO =)


Darkevil Messages : 221

Et c'est encore moi. Je voulais savoir si quelqu'un savait comment faire une recherche dans la BDD avec PDO (pas le plus facile pour apprendre).

Je vous montre mon début de code:

<?php
/***************************************************************************************************************
*       
*                             /¯¯  |_¯  /\  |¯¯) ___ (¯¯¯  \_/  (¯¯¯ ´¯|¯` |_¯  |\/|        
*                             \__] |__ /--\ |¯¯\ ¯¯¯  ¯¯)   |    ¯¯)   |   |__  |  |       
*                                                    ¯¯¯        ¯¯¯       
*  __  __  __  __  __  __  __  __  __  __]               [__  __  __  __  __  __  __  __  __  __
*¯¯  ¯¯  ¯¯  ¯¯  ¯¯  ¯¯  ¯¯  ¯¯  ¯¯  ¯¯  ¯]                            [¯  ¯¯  ¯¯  ¯¯  ¯¯  ¯¯  ¯¯  ¯¯  ¯¯  ¯¯  
*        
*                          Created By G4lAcTiC Silvr                 
*      Thanks to Madalin Tudose, the author of the first template and the email-send's function           
*        
*        
***************************************************************************************************************/
require_once(dirname(__FILE__) . "/common.php");

//Verification des données recues
if(($_POST['email']) != $lang_postemail && ($_POST['psd']) != $lang_postpsd) {

//On verfie si le pseudo ou l'email existe
$s_pseudo = $bdd->prepare("SELECT user FROM user_inscription WHERE user= :user");
$s_pseudo = $s_pseudo->execute(array('user'=>$_POST['psd']));
$search_pseudo = $s_pseudo->columnCount();

$s_email = $bdd->prepare("SELECT email FROM user_inscription WHERE email= :email");
$s_email = $s_email->execute(array('email'=>$_POST['email']));
$search_email = $s_email->columnCount();


if($search_pseudo == 0 && $search_email == 0) {

//On envoie le tout a la BDD
$envoi = $bdd->prepare("INSERT INTO user_inscription (user, email, date_inscription) VALUES (:user, :email, NOW())");
$envoi = $envoi->execute(array(
'user' => $_POST['user'],
'email' => $_POST['email']
));

//On implante les variables dans le mail de confirmation
$email_to = $_POST['email'];
$email_subject = "Confirmation d'inscription à la newsletter de ".$sname;
//Fonction pour les messages d'erreur
function died($error) {
echo "Il y a eu un problème lors de l'envoie du mail de confirmation<br /><br />";
echo $error."<br /><br />";
echo "Ressayez, si cette erreur persiste prevenez l'administarteur.<br /><br />";
die();
}



$email_from = $email; // requis

$error_message = "";
$email_exp = "^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$";
if(!eregi($email_exp,$email_from)) {
   $error_message .= 'Votre adresse mail n\'est pas valide.<br />';
   }

   if(strlen($error_message) > 0) {
   died($error_message);
   }
$email_message = "Merci ".$_POST['user']."de vous être inscrit sur".$sname.".\n
Cordialement, ".$admin."\n\n";

function clean_string($string) {
  $bad = array("content-type","bcc:","to:","cc:","href");
  return str_replace($bad,"",$string);
}


$email_message .= "Email: ".clean_string($email_from)."\n";


// creation de l'header de l'Email
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);  

//Information d'envoi
$informations = Array(//Envoi reussi
false,
'Envoi reussi',
'Votre envoi est reussi, vous allez recevoir un mail de confirmation',
'',
ROOTPATH.'/index.php',
5
);
require_once('info.php');
exit();
} else {
$informations = Array(//Psd ou email incorrect
true,
'Pseudo ou Email existant',
'Ce psuedo ou cet email existe dans notre BDD',
'',
ROOTPATH.'/index.php',
5
);
require_once('info.php');
exit();
}

$search->closeCursor(); // Termine le traitement de la requête

} else {
if(($_POST['email']) == $lang_postemail && ($_POST['psd']) == $lang_postpsd) {
$error_info = "Champs vides";
$error_message = "Il faut remplir tout les champs";
} elseif(($_POST['email']) == $lang_postemail) {
$error_info = "Champs email vide";
$error_message = "Le champs email est vide";
} else {
$error_info = "Champs pseudo vides";
$error_message = "Le champs pseudo est vide";
}
$informations = Array(//Pseudo inconnu
true,
$error_info,
$error_message,
'',
ROOTPATH.'/index.php',
3
);
require_once('info.php');
exit();
}
?>
 

En fait non, c'est tout le code .

Cette page sert de gestionnaire entre le formulaire et la BDD logique. Le problème est que pour que l'inscription ait lieu, il faut que dans la BDD, il n'y ait ni le mail, ni le pseudo d'utilisé. Cela à l'air simple, mais en PDO, c'est galère pour un débutant (oui, je suis taré de commencer par ça ).

En mysql, on peut utliser mysql_num_rows, très efficace, mais en PDO, pour un SELECT, on peut utiliser PDO::columnCount().

En fait, ce que j'essaye de faire, c'est que si $_POST['user'] existe dans la BDD, le script me met la valeur 1, en revanche, s'il ne trouve pas, il met 0. Et avec moi, ça ne marche pas, il n'affiche rien .

Quelqu'un à une autre idée??

Cordialement, Darkevil

dimanche 26 février 2012

Greg Messages : 67

En ajoutant un index unique sur tes champs dans la base de données, tu pourras être sûr que deux utilisateurs n'essaieront pas de créer un compte avec le même mail.

D'autre part, la méthode PDOStatement::columnCount compte le nombre de colonnes, pas le nombre d'enregistrements, utilises plutôt PDOStatement::rowCount.

Et pour finir, si tu utilises un autre moteur que MySQL, il est possible que PDOStatement::rowCount renvoie toujours 0, en particulier avec le moteur SQLite.

lundi 27 février 2012

Darkevil Messages : 221

Oki, merci pour l'astuce ( je gère pas trop le coté Mysql). Il me semble que PDOStatement::rowCount() ne fonctionne pas avec SELECT, seulement avec UPDATE, INSERT et DELETE (première chose que j'ai test ).

Par contre, de quoi veux tu parler quand tu dis index unique?

Merci pour tout

lundi 27 février 2012

Greg Messages : 67

Si PDOStatement::rowCount te renvoie 0 sur une requête SELECT en utilisant MySQL, c'est parce que la requête ne renvoie effectivement aucun enregistrement.

PDOStatement::columnCount renverra toujours la même valeur si tu ne modifies pas tes colonnes sélectionnées : le nombre de colonnes de la requête. Dans tes deux requêtes plus haut, il renverra toujours 1.

Un index unique est un index de recherche qui assure l'unicité de la valeur d'un champ ou d'un groupe de champs. Dans ton cas, ils se créeent avec la requête DDL suivante :

CREATE UNIQUE INDEX `UNQ_USER`
    ON `user_inscription` (`user`);

CREATE UNIQUE INDEX `UNQ_EMAIL`
    ON `user_inscription` (`email`);
mardi 28 février 2012

Darkevil Messages : 221

Merci beaucoup Greg. Tu t'y connais un peu en JS?

mardi 28 février 2012

Lucas Messages : 830

Autant au niveau PHP j'ai de grandes lacunes, autant si tu as des questions à propos du js je te répondrai volontiers

mardi 28 février 2012

Darkevil Messages : 221

=) merci Lucas, jte reco par MP =)

mardi 28 février 2012

Répondre Pour répondre, tu dois d'abord t'inscrire rapidement sur Kommunauty. Rejoins-nous vite !