8722 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous,

J'espère que j'ai choisi la bonne rubrique du forum pour poster mon message.

Je viens vers vous pour le projet suivant :

Sur le site de mon groupe de musique, nous proposons notre album en téléchargement. (Gratuitement, l'objectif étant de sa faire connaitre un maximum).
Bref, j'ai créé un formulaire, afin de récupérer quelques infos et pouvoir communiquer par la suite.

J'ai donc dans l'idée, de récupérer des adresses email valides, et pour vérifier leurs validités, voici ma démarche :

Pour être sur de n'avoir que des adresses mails valides, l'utilisateur recevra un code unique, qu'il devra indiquer sur le site pour débuter le téléchargement.
Dans la base, un code utilisé sera noté comme tel, ce qui permet de valider les adresses mails.

Ce qui est acquis :

- Récupération, dans une base de données, des informations indiquées par l'internaute. (nom, prénom, adresse email et commentaire)
- Envoi d'un email automatique à l'adresse indiquée.

Ce qui me reste à programmer :

- Génération d'un code unique à 8 caractères incluant des chiffres, des lettres, des majuscules et des minuscules.
- Enregistrer ce code sur la même ligne que les infos précédentes.
- Vérifier si le code existe dans la base.
- Vérifier qu'il n'a pas été utilisé.
- Le marquer utilisé lorsqu'il l'est. (ce qui valide l'adresse email de l'internaute, et empêche le multi-téléchargement)

J'étais sur le point de préparer ma base de données, afin plutôt d'ajouter la "ligne" "code utilisé", qui devrait être de type boolean. (vrai/faux)
Je ne sais pas comment faire dans la liste de choix qui m'est proposée sur PHPmyadmin. (image jointe)

J'aurais également d'autres questions concernant ce qui me reste à programmer !!

Merci d'avance à tous pour votre aide.



upload/50471-sql.jpg
Modifié par Alexbass (25 Jun 2013 - 16:56)
Bonjour, l'équivalent de Boolean est Tinyint ; laisse sa taille à 1 pour vrai/faux

Edition
J'ai oublié de rajouter que tes valeurs seront donc 0 : faux et 1 : vrai (juste au cas où Smiley cligne )
Modifié par mini-truc (25 Jun 2013 - 09:17)
Bonjour mini-truc,

Merci beaucoup de ton aide.

Est ce que je dois laisser la colonne null à "not null" ?

J'aimerais savoir aussi, si ma méthode est bonne ? enfin bien pensée ?

Je sais que je vais avoir besoin d'aide pour continuer, mais encore faut-il que tout soit réalisable.
Je débute complètement coté web.

Pour info, voici le site que je suis en train de faire : www.alexbass.net23.net
Il doit venir remplacer celui ci : www.theviewers.fr
Bonjour,

Quoiqu'il arrive, ton champ sera à 0 ou à 1, soit le code est utilisé, soit non. Par conséquent, je serais d'avis de le mettre à NOT NULL.

Concernant ta méthode, elle me semble pas mal, mais si un jour tu décides de lancer un 2ème album, tu seras embêté je pense: tu n'auras qu'un seul code pour un utilisateur, alors qu'il peut très bien demander à télécharger le 1er album et le 2eme (donc il te faudra 2 codes?). Bon, là on voit dans le futur et ce n'est pas encore ton problème, mais on ne sait jamais.

Et pourquoi bloquer le multi-téléchargement? Quelqu'un qui a déjà téléchargé une fois ton album pourra le dupliquer autant de fois qu'il le voudra, alors que quelqu'un pour qui le téléchargement a échoué ne pourra plus le retélécharger, car le champ dans la table sera passé à 1. Puisque de toute façon tu proposes l'album gratuitement, autant permettre le multi-téléchargement.

Sinon, une alternative à ta méthode (à toi de voir si elle répond à ton besoin ou non): beaucoup de sites envoient un mail contenant un lien, qui, lorsqu'il est visité par l'utilisateur, active son compte définitivement. Ainsi, si l'adresse mail est valide, l'utilisateur a accès au lien et pourra activer son compte.
Bonjour GroquikMLV, (pas facile à écrire ton pseudo Smiley biggrin )

C’est noté pour not null.

Le site ne fonctionne pas avec un système de compte. (Et je pense que cela m'effraie encore un peu).
Je voulais éviter le multi-téléchargement comme je pense qu'il peut y en avoir avec les robots. (Je me trompe peut-être)

Mais ça me donne une autre idée :
Est-ce que je pourrais envoyer un mail, avec le lien de téléchargement ?
Ça évite les robots, ça permet à l'utilisateur de recommencer si le téléchargement a échoué, et je suis sur de récupérer des adresses valides.

Qu'en pense tu?
Ah ok, je n'avais pas compris qu'il n'y avais pas de système de compte, excuse moi. Dans ce cas, je comprends mieux Smiley smile
Oui, la solution du lien de téléchargement directement dans le mail peut être sympa, ça me paraît une bonne idée.

Par contre, je serais d'avis d'ajouter un captcha ou un truc du genre. Je ne m'y connais pas trop en attaques de site, mais là, quand je vois ton formulaire, je me demande quel serait le résultat si un robot arrivait à soumettre plusieurs formulaires à la suite. Tu te retrouverais avec une quantité énorme de mails à envoyer en très peu de temps, et peut être que tu aurais des problèmes avec ton hébergeur (il me semble que l'envoi trop massif de mails est bloqué dans certains cas, car considéré comme du spam... Si quelqu'un pouvait confirmer?).

Il faudrait voir si d'autres personnes sur le forum pensent pareil, je ne suis pas trop calé sur ce sujet...
Pour le moment, voici à quoi ressemble le code de ma page :
<div id="bloc_formulaire">
	<?php
	// Tous les champs n'ont pas été renseignés
	if ((!isset($_POST['nom']) OR $_POST['nom'] == "") 
	  OR (!isset($_POST['prenom']) OR $_POST['prenom'] == "")
	  OR (!isset($_POST['mail']) OR $_POST['mail'] == "")
	  OR (!isset($_POST['commentaire']) OR strlen($_POST['commentaire'] ) > 200))
	{
	// Afficher ou réafficher le formulaire de saisie des informations
	?>
	<form method="post" action="telechargement.php">
	<p class="floatstop">
		<label for="nom">Nom* <small>(30 caractères max)</small> : </label><input type="text" name="nom" id="nom" placeholder="Nom" maxlength="30" required/>
		<br />
	        <label for="prenom">Prénom* <small>(30 caractères max)</small> : </label><input type="text" name="prenom" id="prenom" placeholder="Prénom" maxlength="30" required/>
		<br />				
		<label for="mail">E-mail* <small>(50 caractères max)</small> : </label><input type="email" name="mail" id="mail" placeholder="exemple@mail.fr" maxlength="50" required/>
		<br />
		<br />					
		<label for="commentaire">Vous pouvez également nous laisser un petit message... <small>(200 caractères max)</small></label>
		<textarea name="commentaire" id="commentaire" rows="5" cols="20" maxlength="200"></textarea><br/> <!--ici, la zone de texte n'a pas de valeur par défaut-->
		(*) = champs obligatoire.
		<br />
			<div id="bouton_centré">
				<input type="submit" value="Valider" title="Cliquez ici pour acceder au téléchargement"/>
			</div>
		<!--</p>-->
							
	</form>
</div>
<?php
}//fin de la condition if
else // Les informations sont toutes remplies on peut créer le code de téléchargement, ajouter les infos à la bdd, envoyer un mail.
{
// création du code :
$chaine = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Types des caractères 
srand((double)microtime()*1000000);  
for($i=0; $i<8; $i++) // Nombre de caractères (ici 8)  
{  
$code .= $chaine[rand()%strlen($chaine)]; // On génère le mot de passe de 8 caractères 
					}  
echo $code; 

//déclaration des variables à ajoutter à la base :
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$email = $_POST['mail'];
$commentaire = $_POST['commentaire'];
					
//tentative de connection à la base
	try { $bdd = new PDO('mysql:host=mysql4.000webhost.com;dbname=*********', '**********', '************');}
//gestion des erreurs
	catch(Exception $e){die('Erreur : '.$e->getMessage());}
//requette préparée pour inserée les données saisies en récupérant les variables
	$req = $bdd->prepare('INSERT INTO base(nom, prenom, email, commentaire) VALUES(:nom, [langue]renom, :email, :commentaire)');
	$req->execute(array(
		'nom' => $nom,
		'prenom' => $prenom,
		'email' => $email,
		'commentaire' => $commentaire
		));
//mysql_close() //ferme la connection avec la base
//Envoi mail :
	$headers ='From: "TheVieWers"<no-reply@theviewers.fr>'."\n";
	$headers .='Content-Type: text/html; charset="iso-8859-1"'."\n"; 
	$headers .='Content-Transfer-Encoding: 8bit'; 
	$message ='<html><head><title>Album The VieWers</title></head><body><p>Voici le code d\'acc&egrave;s au t&eacute;l&eacute;chargement de l\'album WTF de The VieWers : xCR54X8j</p><p>Veuillez ne pas r&eacute;pondre &agrave; cet email automatique. Merci</p></body></html>';
	mail($email, 'The VieWers : Voici votre code', $message, $headers); 
// Message de confirmation
?>
       <h1 class="floatstop">Félicitation :</h1>
       <!--<p>Pour télécharger l'album, vous devez cliquer sur ce lien de téléchargement : <a href="tele.php">The VieWers - WTF (2012)</a></p>-->   
       <p>Pour télécharger l'album, veuillez entrer le code que nous venons de vous adresser par email et valider en cliquant sur le bouton.</p>
<?php
// si le code est différent du mot de passe
if ((!isset($_POST['code']) OR $_POST['code'] <> "ce1mot2d5epas5senese8rajama9is65tr4ouvé"))
{ // alors affichage du formulaire
?>
	<form method="post" action="telechargement.php">
		<p>
		<label for="code">Code : </label><input type="text" name="code" id="code" placeholder="Entrez le code" maxlength="2000" required/>	
	        <br />
		<input type="submit" value="Valider" title="Cliquez pour valider votre code"/>
	        </p>
	</form>
		<p>Pour le moment, ce site n'est pas en fonction !!!</p>
<?php
}
else
{
?>
	<form method="post" action="tele.php">
		<p><input type="submit" value="Télécharger" title="Cliquez ici pour télécharger l'album WTF !"/></p>
	</form>
	<p>Nous vous remercions de l'interêt que vous portez à notre projet. Enjoy it !!!</p>
<?php
}
?>
<?php
}// fin de la condition else
?>		
</div>


C'est un peu long, je le reconnais, voici la page en question : http://www.alexbass.net23.net/telechargement.php
Je pensais rajouter une question, pour éviter un captcha que je ne trouve pas toujours évident à lire. Un truc que j'ai déjà vu du genre : Le feu est chaud ou froid ?
Du coup mon code serait bien plus allégé.

Qu'en pense tu?
Et pour le lien de téléchargement, ça ce passe comment ?
Apparemment tu as oublié d'insérer le codé généré dans ta table, mais maintenant ce n'est plus grave puisque tu comptes abandonner le principe de génération de code.

La question à la place du captcha est une bonne idée, de toute façon peu importe la méthode employée, du moment que tu t'assures que l'utilisateur est bien un humain Smiley cligne

Pour le lien de téléchargement, je ne vois pas trop ce que tu veux dire? Tu mets le lien directement dans ton mail et voilà, non?
Ok,

Je vais refaire mon code et puis si j'y arrive pas et que je bloque, je reviens.

Le truc, c'est que l'hébergeur que j'utilise actuellement, ne m'autorise pas à envoyer des fichiers.
ou alors je vais essayer avec quelque chose de léger.

Merci pour tes conseils.
Par exemple, tu te crée sur ton ftp un répertoire "telechargement" à la racine du site (avec les droits nécessaires), dans lequel tu mets un fichier nommé "album.zip"

Puis, dans ton mail:
Bonjour, merci de porter attention à notre super projet de musique! Vous pouvez télécharger l'album à l'adresse suivante: www.tonsite.fr/telechargement/album.zip

Et voilà, le tour est joué. Je ne vois pas ce que tu veux dire quand tu parles d'hébergeur. Tu parlais peut-être de pièces jointes dans le mail?
En faite, j'avais créé une page de téléchargement automatique :

<?php
$url = ('Album/The VieWers - WTF (2012).zip');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. basename($url) .'";');
@readfile($url) OR die();
?>

Mais ça avait l'air d'être bloqué par mon hébergeur actuel (gratuit), mais qui est batard car il me sert juste à la création.
Quand je faisait des tests, ça me téléchargez bien le fichier zip mais il été égal à zero octets.
Bizarre, ton code m'a pourtant l'air correct... Tu n'as rien écrit avant les headers? Sinon c'est peut-être ton chemin vers le fichier qui n'est pas bon... Essaie avec
$url = ('./Album/The VieWers - WTF (2012).zip');
Alors, ça y est, j'ai tout changé.
J'arrive bien à envoyer un mail, mais il va tout de suite dans les spam.
Et le lien, n'est pas cliquable.

Aurait-tu une idée.

Voici les parties de code refaites :

- ajout du champ de vérif :
if ((!isset($_POST['nom']) OR $_POST['nom'] == "") 
OR (!isset($_POST['prenom']) OR $_POST['prenom'] == "")
OR (!isset($_POST['mail']) OR $_POST['mail'] == "")
OR (!isset($_POST['commentaire']) OR strlen($_POST['commentaire'] ) > 200)
OR (!isset($_POST['verif']) OR $_POST['verif'] <> "chaud"))
{
<label for="verif">Le feu est-il chaud ou froid ?* <small>(Anti-spam)</small> : </label><input type="text" name="verif" id="verif" required/>
</br>
- envoi du mail :
//Envoi mail :
$headers ='From: "TheVieWers"<noreply@theviewers.fr>'."\n";
$headers .='Content-Type: text/html; charset="iso-8859-1"'."\n"; 
$headers .='Content-Transfer-Encoding: 8bit'; 
$message ='<html><head><title>Album The VieWers</title></head><body><p>Bonjour, nous vous remercions de l\'int&eacute;r&ecirc;t que vous portez &agrave; notre projet!</p>
	<p>Vous pouvez t&eacute;l&eacute;charger l\'album &agrave; l\'adresse suivante :  http://www.alexbass.net23.net/album/images.zip</p>
 
	<p>Veuillez ne pas r&eacute;pondre &agrave; cet email automatique. Merci</p></body></html>';
mail($email, 'The VieWers : Album WTF', $message, $headers); 
// Message de confirmation
?>
	<h1 class="floatstop">Félicitation :</h1> 
	<p>Pour télécharger l'album, veuillez cliquer sur le lien de téléchargement que nous venons de vous adresser par email.</p>
	<p>Nous vous remercions de l'interêt que vous portez à notre projet. Enjoy it !!!</p>
<?php
}// fin de la condition else
?>	


J'ai mis une fichier léger et ça fonctionne.
http://www.alexbass.net23.net/album/images.zip
Tu peux faire des tests, je supprimerais les adresses mails de la base, comme je fais pour les miennes. http://www.alexbass.net23.net/telechargement2.php
Modifié par Alexbass (25 Jun 2013 - 12:48)
Pour le lien qui n'est pas cliquable, il faut que tu mettes les balises < href="ton lien">ton lien</a> dans le mail, car il est en html.

J'ai testé vite fait ton formulaire ce midi, mais je n'ai pas reçu de mail, ni dans les spams, ni dans la boite mail normale... Lorsque je valide le formulaire, tous les champs se vident, mais je n'ai pas d'infos qui me dit si c'est ok ou si il y a eu un problème.
Là tout de suite, j'ai également un souci qui fait que je ne reçoit pas de mail. J'essai d'y mettre une image, mais je n'y arrive pas.

Si la page se recharge et vide les champs, c'est qu'il n'y a pas eu d'emails envoyés.
Je sais pas comment mettre une info sur les éléments bloquants.
Pour le moment je test tous les champs d'un coup, et soit c'est ok il envoi le mail, soit c'est pas ok et ça recharge la page.

Je te met tout mon code pour que tu puisse mieux comprendre (en pièce jointe)
http://cjoint.com/?3FzoQjP9c5z
Il faut que tu mettes l'adresse complète de ton image pour que ça fonctionne, et pas seulement /images/tonimage.jpeg.
<img src="http://www.tonsite.fr/images/tonimage.jpeg" alt="blabla"/>

Finalement j'ai réussi et j'ai bien reçu le mail (dans les spams par contre, je ne sais pas comment corriger cela), en fait j'avais mis "CHAUD", et il s'attendait à avoir "chaud"... Regarde de ce coté là --> http://fr2.php.net/manual/fr/function.strcasecmp.php
Modifié par GroquikMLV (25 Jun 2013 - 15:06)
J'ai regardé ce que tu m'as dit pour la casse. J'ai modifié mon code:
// Tous les champs n'ont pas été renseignés
$verif2 = "chaud";
if ((!isset($_POST['nom']) OR $_POST['nom'] == "") 
	OR (!isset($_POST['prenom']) OR $_POST['prenom'] == "")
	OR (!isset($_POST['mail']) OR $_POST['mail'] == "")
	OR (!isset($_POST['mail2']) OR $_POST['mail2'] <> $_POST['mail'])
	OR (!isset($_POST['commentaire']) OR strlen($_POST['commentaire'] ) > 200)
	OR (!isset($_POST['verif']) OR (strcasecmp($_POST['verif'], $verif2) <> 0)))
{
Ca doit fonctionner de ce coté là.
Par contre je reçoit plus de mail. mon code :
$message_html = '<html><head></head><body>
<img src="http://www.alexbass.net23.net/images/baniere_viewers.jpg" alt=".:: The VieWers ::."/>
<p>Bonjour, nous vous remercions de l\'int&eacute;r&ecirc;t que vous portez &agrave; notre projet !!</p>
<p>Vous pouvez t&eacute;l&eacute;charger l\'album via ce <a href="http://www.alexbass.net23.net/album/images.zip"> lien de t&eacute;l&eacute;chargement.</a></p>
<p><small>Veuillez ne pas r&eacute;pondre &agrave; cet email automatique. Merci</small></p></body></html>';
Qu'en pense tu?

ps: j'ai bien retrouvé dans la base les données de M. Machin Truc Smiley biggrin
Modifié par Alexbass (25 Jun 2013 - 15:34)
Je viens de retester, chez moi je reçois bien le mail correctement, et cette fois-ci l'image est bonne. De plus, on peut mettre "chaud", "CHAUD", ou même "Chaud", ça marchera. Pour moi, tout est ok, peut-être que tu t'es planté dans l'adresse mail, ou que tu l'as signalé comme spam?
Je te remercie déjà beaucoup pour toute l'aide que tu m'a apporté.

Je ne sais pas ce qui se passe, mais sur une autre adresse, je l'ai bien reçu et avec l'image.
Normalement j'utilise une adresse laposte, mais même sur leur site, je n'ai rien dans les indésirables. Il y a pourtant dedans un paquet de ***SPAM***

Est ce que tu crois que l'on pourrait améliorer mon formulaire, avec des indications d'erreurs au fur à mesure plutôt que de recharger la page vide de tout ce que l'utilisateur avait rempli ?
Modifié par Alexbass (25 Jun 2013 - 16:07)
Oui c'est tout à fait possible de faire cela. La première chose qui me vient à l'esprit est d'utiliser par exemple JQuery. Une recherche sur google pour "jquery validation de formulaire" et tu devrais trouver ton bonheur Smiley cligne

En gros pour te résumer le fonctionnement du truc, au moment où tu valides le formulaire, une fonction est appelée grâce à JQuery, et cette fonction vérifie par exemple que ton champ n'est pas vide ou si par exemple il contient bien une chaine de caractère spécifique (utile par exemple pour vérifier que c'est bien une adresse mail que l'on a rentré). Si tout est ok, le formulaire est validé, sinon, tu peux déclencher des événements, comme par exemple une infobulle à coté du champ mal rempli.

Mais là on s'éloigne du sujet initial (d'ailleurs, on s'en est déjà un peu éloigné ^^), donc je te propose de mettre le sujet en résolu, et éventuellement d'en créer un nouveau plus tard si tu galères sur la validation de formulaire Smiley biggrin
Pages :