Newsletter php débutant

Newsletter php débutant - PHP - Programmation

Marsh Posté le 08-08-2008 à 19:06:25    

Voila, je débute en php et j'ai décidé de commencer par créer une newsletter. Le truc le plus simple possible pour commencer.
Je réalise rapidement un code html dans lequel j'insère du php voila ce code:

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
  3.    <head>
  4.        <title>Belgium</title>
  5.        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  6.    <link rel="icon" type="image/png" href="/images/favicon.png" />
  7.    <link rel="stylesheet" media="screen" type="text/css" title="Theme1" href="theme_1.css" />
  8.    <link rel="alternate stylesheet" media="screen" type="text/css" title="Theme2" href="theme_2.css" />
  9.    </head>
  10.    <body>
  11.    <div class=inscription>
  12.  <p>Pour vous inscrire à notre news letter et être informé des actions du site remplissé le champ ci-dessous.</p>
  13.  <form method="post" action="newsletter/traitement.php">
  14.  <p><label for="email">Votre e-mail</label> : <input type="text" name="email" id="email"/></p>
  15.  <p><input type="submit"/> <input type="reset" /></p>
  16.  </form>
  17. </div>
  18.   </body>
  19. </html>


 
Comme le code le montre j'appelle une page en php externe que voici:
 

Code :
  1. <?php
  2. mysql_connect("localhost", "root", "" ); //connection à la base de donnée
  3. mysql_select_db("emailnewsletter" ); //selection de la table
  4. //insertion de l'adresse email dans la table
  5. mysql_query("INSERT INTO Email VALUES ('', '$email')" );
  6. mysql_close();
  7. ?>


 
Mon problème est le suivant, a chaque fois que j'entre une adresse que je valide, j'ai un ligne qui se crée dans ma base de donnée mais l'adresse n'apparait pas dedans... ma question pourquoi et comment puis-je modifier mon script pour arriver à ce que l'adresse email soit inscrite dans la base de donnée...
 
Merci

Reply

Marsh Posté le 08-08-2008 à 19:06:25   

Reply

Marsh Posté le 09-08-2008 à 00:35:52    

ceci n'est pas une sélection de table mais bien de base de donnée :

Code :
  1. mysql_select_db("emailnewsletter" );


je me demande si ton problème ne viendrait pas de là :

Code :
  1. mysql_query("INSERT INTO Email (id, email) VALUES ('', '$email')" );


je te conseil aussi de faire un test pour voir si ce qui est entré est bien une adresse email et non tout autre chose.

Reply

Marsh Posté le 09-08-2008 à 10:31:08    

1- Tu dois faire appel à post, car ton formulaire est envoyé en post, donc $_POST['email'] et non $email.
2 - Si le champ id est une clé primaire, tu as plutôt intérêt à mettre :

Code :
  1. mysql_query("INSERT INTO Email (email) VALUES ('".$_POST['email']."')" );

Message cité 2 fois
Message édité par CyberDenix le 09-08-2008 à 10:33:59

---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 09-08-2008 à 13:51:15    

ah oui, je n'avais pas vu ce détails :ange:

Reply

Marsh Posté le 09-08-2008 à 22:36:37    

Merci CyberDenix ta solution est fonctionnelle

Reply

Marsh Posté le 10-08-2008 à 18:22:32    

Note : ton code a une faille de sécurité (Injection SQL)
Echappes tes données avec mysql_real_escape_string

Message cité 1 fois
Message édité par Profil supprimé le 10-08-2008 à 18:59:06
Reply

Marsh Posté le 10-08-2008 à 18:57:25    

CyberDenix a écrit :

1- Tu dois faire appel à post, car ton formulaire est envoyé en post, donc $_POST['email'] et non $email.
2 - Si le champ id est une clé primaire, tu as plutôt intérêt à mettre :

Code :
  1. mysql_query("INSERT INTO Email (email) VALUES ('".$_POST['email']."')" );



 
Quand tu balances un code pareil à un débutant, tu pourrais au moins l'avertir qu'il est merdique en l'état :/


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 12-08-2008 à 16:15:16    

YeLL a part pr la sécurité pe en quoi ce code est merdique?

Reply

Marsh Posté le 12-08-2008 à 16:38:29    

Sephirius2 a écrit :

YeLL a part pr la sécurité pe en quoi ce code est merdique?


cf. post de luc@s. Le code optimal est :

Code :
  1. mysql_query("INSERT INTO Email (email) VALUES ('".mysql_real_escape_string($_POST['email'])."')" );

Message cité 1 fois
Message édité par babasss le 12-08-2008 à 16:38:53

---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 12-08-2008 à 16:47:35    

Sephirius2 a écrit :

YeLL a part pr la sécurité pe en quoi ce code est merdique?


 
[:dawa] C'est pas suffisant ? :??:


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 12-08-2008 à 16:47:35   

Reply

Marsh Posté le 12-08-2008 à 17:04:27    


 
c'était une simple correction de son code crade et faillé  [:thalis].
 
EDIT : La méthode bind_params gère l'échappement des données toute seule ?  :o

Message cité 1 fois
Message édité par Profil supprimé le 12-08-2008 à 17:11:37
Reply

Marsh Posté le 12-08-2008 à 17:06:17    


aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe

 

J'ai jeté un coup d'oeil à la doc de mysqli (que je n'avais jamais regardé avant). Ne faut-il pas utiliser $db->real_escape_string($$_POST['email']) en plus du code utilisé ?

 

Message cité 1 fois
Message édité par babasss le 12-08-2008 à 17:06:57

---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 12-08-2008 à 17:23:48    


 
Oui
 

babasss a écrit :


aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe, aïe
 
J'ai jeté un coup d'oeil à la doc de mysqli (que je n'avais jamais regardé avant). Ne faut-il pas utiliser $db->real_escape_string($$_POST['email']) en plus du code utilisé ?
 


 
Non


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 12-08-2008 à 17:36:36    

C'est moi ou la doc est pas super clair à ce sujet (j'arrive pas à trouver où cela est marqué) ?


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 12-08-2008 à 17:39:28    

Citation :

There are numerous advantages to using prepared statements in your applications, both for security and performance reasons.

 

Prepared statements can help increase security by separating SQL logic from the data being supplied. This separation of logic and data can help prevent a very common type of vulnerability called an SQL injection attack. Normally when you are dealing with an ad hoc query, you need to be very careful when handling the data that you received from the user. This entails using functions that escape all of the necessary trouble characters, such as the single quote, double quote, and backslash characters. This is unnecessary when dealing with prepared statements. The separation of the data allows MySQL to automatically take into account these characters and they do not need to be escaped using any special function.

 

Source: MySQL.com

Message cité 2 fois
Message édité par Dj YeLL le 12-08-2008 à 17:40:14

---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 12-08-2008 à 17:42:50    

Dj YeLL a écrit :

Citation :

There are numerous advantages to using prepared statements in your applications, both for security and performance reasons.
 
Prepared statements can help increase security by separating SQL logic from the data being supplied. This separation of logic and data can help prevent a very common type of vulnerability called an SQL injection attack. Normally when you are dealing with an ad hoc query, you need to be very careful when handling the data that you received from the user. This entails using functions that escape all of the necessary trouble characters, such as the single quote, double quote, and backslash characters. This is unnecessary when dealing with prepared statements. The separation of the data allows MySQL to automatically take into account these characters and they do not need to be escaped using any special function.


 
Source: MySQL.com


Exact, en fait je cherchais au niveau de bind_params et pas au niveau de prepare.... SOrry


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 12-08-2008 à 22:42:11    

Et bien comme vous connaissez bcp mieux la section sécurité dans php vous pourrez certainement m'aider à améliorer la sécurité de mon petit script que voila:

Code :
  1. <?php
  2. mysql_connect("localhost", "root", "" ); //connection à la base de donnée
  3. mysql_select_db("cdh" ); //selection de la table
  4. //insertion des données dans la table
  5. mysql_query("INSERT INTO news_email (nom, email, localisation) VALUES ('".$_POST['nom']."','".$_POST['email']."','".$_POST['localisation']."')" );
  6. mysql_close();
  7. ?>


Comme vous le remarquerez j'appel 3 variables désormais...
Pour le moment la newsletter (partie enregistrement fonctionne très bien) Mais j'aimerais vraiment sécuriser le script avt de m'attaquer à la partie suppression de l'email qui va être un autre challenge pr moi mdr (quoi je vous l'ai pas dit je débute vraiment...)
 
Merci pour vos précédent post mais je ne sais / comprend pas  comment utiliser la ligne "mysql_real_escape_string" hors de mon petit script...copier coller les corrections j'aime bien mais je préfère comprendre pr ne pas trop abuser...
 
Alors est ce que je doit utiliser la ligne "mysql_real_escape_string" devant chaque variable ou il existe une solution pr appliquer ce paramètre au 3 variables sans devoir recopier 3 fois la ligne je suis pas fainéant mais php si il parait...
 
Je n'ai absolument rien compris au script de NazzTazz

Citation :

Code :
  1. <?php
  2.           $db = new Mysqli('host', 'user', 'password', 'base');
  3.           $query = $db->prepare('INSERT INTO Email(email) VALUES (?)');
  4.           $query->bind_param('s', $_POST['email']);
  5.           $query->execute();
  6.       ?>



Si vous pouvez me guidez vers un tuto ou des infos pr comprendre ce script je suis intéressé aussi... je suis tjs à l'utilisation de base des bases de données... et les cours du Site du Zero me semble clair mais peu fouillé par rapport à d'autre site qui le sont trop (pr moi du moins...)

Message cité 1 fois
Message édité par Sephirius2 le 12-08-2008 à 22:51:29
Reply

Marsh Posté le 12-08-2008 à 23:14:30    

Sephirius2 a écrit :

Et bien comme vous connaissez bcp mieux la section sécurité dans php vous pourrez certainement m'aider à améliorer la sécurité de mon petit script que voila:

Code :
  1. <?php
  2. mysql_connect("localhost", "root", "" ); //connection à la base de donnée
  3. mysql_select_db("cdh" ); //selection de la table
  4. //insertion des données dans la table
  5. mysql_query("INSERT INTO news_email (nom, email, localisation) VALUES ('".$_POST['nom']."','".$_POST['email']."','".$_POST['localisation']."')" );
  6. mysql_close();
  7. ?>


Comme vous le remarquerez j'appel 3 variables désormais...
Pour le moment la newsletter (partie enregistrement fonctionne très bien) Mais j'aimerais vraiment sécuriser le script avt de m'attaquer à la partie suppression de l'email qui va être un autre challenge pr moi mdr (quoi je vous l'ai pas dit je débute vraiment...)
 
Merci pour vos précédent post mais je ne sais / comprend pas  comment utiliser la ligne "mysql_real_escape_string" hors de mon petit script...copier coller les corrections j'aime bien mais je préfère comprendre pr ne pas trop abuser...
 
Alors est ce que je doit utiliser la ligne "mysql_real_escape_string" devant chaque variable ou il existe une solution pr appliquer ce paramètre au 3 variables sans devoir recopier 3 fois la ligne je suis pas fainéant mais php si il parait...
 
Je n'ai absolument rien compris au script de NazzTazz

Citation :

Code :
  1. <?php
  2.           $db = new Mysqli('host', 'user', 'password', 'base');
  3.           $query = $db->prepare('INSERT INTO Email(email) VALUES (?)');
  4.           $query->bind_param('s', $_POST['email']);
  5.           $query->execute();
  6.       ?>



Si vous pouvez me guidez vers un tuto ou des infos pr comprendre ce script je suis intéressé aussi... je suis tjs à l'utilisation de base des bases de données... et les cours du Site du Zero me semble clair mais peu fouillé par rapport à d'autre site qui le sont trop (pr moi du moins...)


 
[:blessure] j'en étais sur...
 
Bon le code de NazzTazz utilise l'extension mysqli et simplifie largement ton code.  
Etudions le ligne par ligne :
 
La ligne 1 :

Code :
  1. <?php $db = new Mysqli('localhost', 'root', '', 'cdh'); ?>


(Ce n'est pas exactement le même code que celui de NazzTazz car je l'ai adapté à tes indentifiants.
 
Cette ligne connecte l'utilisateur root au serveur localhost de mysql sans mot de passe puis sélectionne la base 'cdh'. Cette ligne correspond à çà  dans ton code :
 

Code :
  1. <?php
  2. mysql_connect("localhost", "root", "" ); //connection à la base de donnée
  3. ?>


 
La ligne 2 :
 

Code :
  1. <?php $query = $db->prepare('INSERT INTO news_email(nom,email,localisation) VALUES (?,?,?)'); ?>


Cette ligne place en mémoire la requête SQL (j'ai encore adapté, c'est la même que la tienne désormais). Les points d'interrogation signifient que les valeurs seront attribuées plus tard. (en gros  :o )
 
La ligne 3 :
 

Code :
  1. <?php $query->bind_param('sss', $_POST['nom'],$_POST['email'],$_POST['localisation']); ?>


Cette ligne attribue dans l'ordre une valeur à chaque point d'interrogation : le premier aura la valeur de $_POST['nom'], le second celle de $_POST['email'] et le dernier celle de $_POST['localisation']. (en très gros :o )
le premier paramètre est la suite des initiales des types (string, int, float donc s, i, f etc...) de chacune des variables passées dans les paramètres suivant.  
Tu n'as pas besoin d'utiliser mysql_real_escape_string de cette manière.
 
La ligne 4 :

Code :
  1. <?php  $query->execute(); ?>


Cette ligne exécute ta requête.
 
Même si, avec cette méthode, tu n'en as pas besoin, mysql_real_escape_string() fonctionne ainsi :

Code :
  1. <?php $protectedName=mysql_real_escape_string($_POST['name']); ?>


 
 :jap:

Message cité 1 fois
Message édité par Profil supprimé le 13-08-2008 à 09:07:59
Reply

Marsh Posté le 13-08-2008 à 10:12:39    

Pour info, le bind_param n'affecte pas les valeurs, mais lie (du verbe lier hein :o) les paramètres.
 

Code :
  1. $query->bind_param('s', $toto);
  2.  
  3. $toto = 'Kwel';
  4. $query->execute(); // insère Kewl
  5. $toto = 'Lolilol';
  6. $query->execute(); // insère Lolilol


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 13-08-2008 à 10:26:04    

Merci lucas je comprend un peu mieux la raison de ce code...
Je vais essayer de modifier ca en conséquence et tester pr voir si ca marche... je reviendrai surement poser qlq question par la suite!
 
Merci a toi aussi Yell bien que ton dernier script me laisse raide d'incompréhension lol

Reply

Marsh Posté le 13-08-2008 à 10:29:14    

Sephirius2 a écrit :

Merci lucas je comprend un peu mieux la raison de ce code...
Je vais essayer de modifier ca en conséquence et tester pr voir si ca marche... je reviendrai surement poser qlq question par la suite!
 
Merci a toi aussi Yell bien que ton dernier script me laisse raide d'incompréhension lol


 
Ah bon :??: Y'a quoi de pas clair ? [:figti]


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 13-08-2008 à 10:54:22    

Je recherche un tutoriel pouvant me guider dans la réalisation d'un script qui prendrais l'email enregistré dans ma base de donnée afin de pvr l'utiliser pr envoyer un email.
 
Je n'ai pas encore trouvé le moyen de récupérer des données d'un ligne...

Reply

Marsh Posté le 13-08-2008 à 10:55:30    

Yell:
 
Je ne comprend pas comment fonctionne Bind_param ni sont utilité... bien que ce script fonctionne
en particulier la raison du 's' en parametre...

Message cité 1 fois
Message édité par Sephirius2 le 13-08-2008 à 10:56:59
Reply

Marsh Posté le 13-08-2008 à 11:52:24    

Les lettres représentes le type de chaque variables envoyées :
 

Code :
  1. $query->bind_param('ssidb', $string, $string, $integer, $decimal, $blob)


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 13-08-2008 à 12:43:19    

je dit chapeau pr la rapidité,... mtnt je sais comment utiliser Bind_param mais j'dois encore vous demander pourquoi l'utiliser et dans quel circonstance l'utiliser est préférable?
 
Si vous en avez assez de me répondre dite le... je suis assez avide d'information surtout depuis que je découvre l'utilité de php et des bases de données...

Reply

Marsh Posté le 13-08-2008 à 14:14:29    

Tout de suite ca s'éclaire lol... mon anglais est vraiment trop rouillé pr déchiffrer la version original.
 
Voila plus de question... pr le moment...

Reply

Marsh Posté le 13-08-2008 à 20:42:08    

Dj YeLL a écrit :

Pour info, le bind_param n'affecte pas les valeurs, mais lie (du verbe lier hein :o) les paramètres.
 

Code :
  1. $query->bind_param('s', $toto);
  2.  
  3. $toto = 'Kwel';
  4. $query->execute(); // insère Kewl
  5. $toto = 'Lolilol';
  6. $query->execute(); // insère Lolilol



 
 [:aloy] t'es chiant toi  :o  
 
Excuse moi de cette "incorrection" mais j'ai fait simple.

Reply

Marsh Posté le 13-08-2008 à 20:45:03    


 
Mais de quoi il parle ? [:prozac]


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 13-08-2008 à 21:04:22    

Dj YeLL a écrit :


 
Mais de quoi il parle ? [:prozac]


 

Citation :

Pour info, le bind_param n'affecte pas les valeurs, mais lie (du verbe lier hein :o) les paramètres. [:prozac]

Message cité 1 fois
Message édité par Profil supprimé le 13-08-2008 à 21:06:54
Reply

Marsh Posté le 13-08-2008 à 21:28:31    

 

Nan mais je suis pas stupide non plus, j'ai bien vu que tu avais mis ce passage en gras :o Mais je vois pas du tout ce dont tu veux parler ... Pourquoi suis-je "chiant" ? De quelle "incorrection" tu parles ? [:dawa]

 

Et pourquoi un Capello ?

Message cité 1 fois
Message édité par Dj YeLL le 13-08-2008 à 21:29:39

---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 13-08-2008 à 21:35:01    

Dj YeLL a écrit :


 
Nan mais je suis pas stupide non plus, j'ai bien vu que tu avais mis ce passage en gras :o Mais je vois pas du tout ce dont tu veux parler ... Pourquoi suis-je "chiant" ? De quelle "incorrection" tu parles ? [:dawa]
 
Et pourquoi un Capello ?


 
Par ce que j'ai dit "affecter" au lieu de "lier"  :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed