Souci pour passage de mysql vers le PDO

Résolu/Fermé
cretinator Messages postés 67 Date d'inscription samedi 26 janvier 2013 Statut Membre Dernière intervention 6 décembre 2014 - 19 févr. 2013 à 15:45
cretinator Messages postés 67 Date d'inscription samedi 26 janvier 2013 Statut Membre Dernière intervention 6 décembre 2014 - 22 févr. 2013 à 12:53
Bonjour,

Voilà j'ai enfin fini un script php avec les fonctions "mysql" qui fonctionne nickel.
Mais on ma conseillé de passer en PDO,

Malgré le tuto du site du zéro je galère grave avec ces nouvelles fonctions!

je ne comprend rien à ces fonctions.....

voici le code de la page avec les fonctions "mysql":

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Message</title>
<style type="text/css">
<!--
.Style20 {font-family: "Comic Sans MS"; font-size: 24px;}
.Style44 {
	color: #FFCC00;
	font-size: 16px;
}
.Style57 {
	font-family: "Comic Sans MS";
	color: #CC00FF;
}
.Style59 {color: #CC00FF}
.Style60 {color: #FF9900}
.Style62 {font-family: "Comic Sans MS"}
.Style63 {
	font-size: 14px;
	font-family: "Comic Sans MS";
}
.Style1a {
color: #CC00CC;
font-family: "Comic Sans MS";
}
.Style1b {
color: #FFCC00;
font-size: 14px;
font-family: "Comic Sans MS";
}
.Style1c {
color: #FF0000; 
font-size: 16px;
}
.Coins {
-moz-border-radius:5px;
-webkit-border-radius:5px;
border-radius:10px;
}
-->
</style>
</head>
<body bgcolor="#FFFFFF" align="center">
	<table width="100%" height="100%">
		<tr>
			<th height="52" colspan="99" bordercolor="#000000" bgcolor="#CC66FF" scope="col"><img src="../images/gif/champignons 1.gif" alt="BAR2" width="48%" height="96%" /><img src="../images/gif/champignons 1.gif" alt="BAR2" width="48%" height="96%" /></th>
		</tr>
		<tr bgcolor="#CCFFCC">
			<th height="100%" colspan="4" scope="row"><span class="Style20">salut</span></th>
        </tr>
        <tr bgcolor="#CCFF99">
			<th height="100%" colspan="4" align="center" valign="middle" scope="row"><span class="Style59"><span class="Style60 Style57"><a href="../accueil.html" class="Style59">Accueil</a></span></span>
			</th>
		</tr>
	</table>	
	<table width="100%" height="10%" align="center" valign="top" bordercolor="#CCFFFF">
          <form method="post" action="Messagelivredor.php"/>
        <tr width="100%" align="center" valign="middle" bgcolor="#CCFFCC">
            <th width="30%" height="" scope="col"><span class="Style62">Votre Nom :</span>
              <input required type="texte" name="pseudo" value="" size="20"/>
			</th>
            <th width="50%" colspan="2" align="center" scope="col"><span class="Style62">Votre note:</span>
                <select required  value="" name="note">
                  <option value="">note de 1 à 5 étoile(s)</option>
                  <option value="1 étoile">1 étoile </option>
                  <option value="2 étoiles">2 étoiles</option>
                  <option value="3 étoiles">3 étoiles</option>
                  <option value="4 étoiles">4 étoiles</option>
                  <option value="5 étoiles">5 étoiles</option>
                </select> 
                <span class="Style63">( 5 étoiles étant la meilleure).</span>
			</th>
        </tr>
        <tr align="center" valign="middle" bgcolor="#CC66FF">
			<th height="40" colspan="3" bordercolor="#FFFFFF" bgcolor="#FFFFFF" scope="row">
				<textarea required name="message" rows="5" cols="100" value="" WRAP="PHYSICAL"></textarea>
			</th>
        </tr>
        <tr>
          <th width="30%" align="center" valign="middle" bordercolor="#FFFFFF" bgcolor="#CC99FF"><input type="reset" name="Votremessage" value="Effacer"/></th>
          <td width="36%" align="center" valign="middle" bordercolor="#FFFFFF" bgcolor="#000000"><span class="Style44 Style62">Un petit message de votre part, me ferai un grand plaisir !</span></td>
          <td width="30%" align="center" valign="middle" bordercolor="#FFFFFF" bgcolor="#CC99FF"><input type="submit" value="Poster" /></td>
		</tr>
	</table>
	</table>
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("ochampsch");

if(isset($_POST['pseudo']) AND isset($_POST['note']) AND isset($_POST['message']))
{
$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
$note = mysql_real_escape_string(htmlspecialchars($_POST['note']));
$message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
$message = nl2br($message);
$date = date("y-m-d");
$sql = ("INSERT INTO livredor VALUES('','".$pseudo."','".$note."','".$message."','".$date."')");
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br/>'.mysql_error());	
if ($sql) header('Location: messagelivredor.php');
}
$nombreDeMessagesParPage = 10;
$retour = mysql_query('SELECT COUNT(*) AS nb_message FROM livredor ');
$donnees = @mysql_fetch_assoc($retour);
$totalDesMessages = $donnees['nb_message'];
$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);
echo '<br/><strong> Page : </strong><br/> ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
	echo '<a href="Messagelivredor.php?page=' .$i. '">' .$i. '</a> &nbsp;';
}
?>
<?php
if (isset($_GET['page']))
{
    $page = $_GET['page'];
}
else
{
    $page = 1;
}

$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;  
$sql = mysql_query('SELECT * FROM livredor ORDER BY id DESC LIMIT ' .$premierMessageAafficher. ',' .$nombreDeMessagesParPage. '');
while($donnees = @mysql_fetch_assoc($sql))
{
	echo '<table width="20%" align="center" bgcolor="#CCCCFF" class="Coins">
	<tr><th height="5" bgcolor="#CCCCFF" ><div><span class="Style1c"<strong>' .($donnees['pseudo']). '</strong></span>&nbsp; a écrit : </div></th></tr>
	<br/>
	<tr><th class="Coins" bgcolor="#000000">
	<div><span class="Style1b"><strong>' .nl2br($donnees['message']). '</strong></span></div></th></tr><br/>
	<tr><th class="Coins" height="5" bgcolor="#CCCCFF"> a noté le site <span class="Style1a"><strong>' .($donnees['note']). '</strong></span> sur <strong> 5 </strong></th></tr>
	</table> posté le : ' .($donnees['date']). '';
}
mysql_close();
?>
</body>
</html>


Comment je refais tous le code mais en PDO?




2 réponses

Utilisateur anonyme
21 févr. 2013 à 11:23
Tu n'échappera pas à un peu de lecture sur PDO !!
La où PDO devient réellement intéressant c'est en utilisant les requêtes préparées -> protection contre les injections sql , et pour les requêtes qui doivent être exécutées plusieurs fois avec différentes valeurs de paramètres optimisent les performances de l'application.
Quitte à utiliser PDO autant tout bien faire d'un coup!

//Requete préparée ou pas, la connexion la création de l'objet PDO ne change pas
try {
// Création d'un objet PDO.
$dbh = new PDO('mysql:host=localhost;dbname=nombdd', 'root', 'password');

} catch (PDOException $e) {
die( "Erreur ! : " . $e->getMessage() );
}

//A partir de là $dbh est la variable de connexion


//On va utiliser les requêtes préparées :

//On ne met pas directement la variable de la condition
$requete="SELECT arg1 FROM table1 WHERE arg2=:variable";


//Prépare une requête SQL à être exécutée, un template de requête est envoyé au serveur (verification syntaxe et autre)
$res = $dbh->prepare($requete);

//Enfin on fait correspondre :variable avec la variable réelle instanciée
$res->bindParam(":variable",$variable,PDO::PARAM_STR);
//PDO::PARAM_STR fixe le type de la variable comme string (à déterminer selon besoin : PARAM_INT...)

//exécution
$res->execute();

//fetch(PDO::FETCH_ASSOC) fonctionne comme mysql_fetch_assoc()
while($row_req=$res->fetch(PDO::FETCH_ASSOC)){
...
}

//Fermer la connexion , libère des ressources
$res->close();



Vu les requêtes dans ton code j'ai essayé de te donner un exemple à peu près complet tu devrait pouvoir le réadapter à PDO.

Ce que j'ai écrit reste un exemple il existe d'autre syntaxe, on peut encore le travailler : exemple : créer un objet Connection est l'utiliser pour instancier la connexion à la BD :)

Essaie de regarder les différentes possibilités pour chaque ligne histoire de bien comprendre le fonctionnement à de voir les différentes options possibles !!
1
cretinator Messages postés 67 Date d'inscription samedi 26 janvier 2013 Statut Membre Dernière intervention 6 décembre 2014 1
Modifié par cretinator le 21/02/2013 à 23:35
Merci à vous kyser soze, pour votre réponse ça m'a bien aidé à avancé.

Voici mon code en suivant vos démarches mais....:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />  
<title>Message</title>  
<style type="text/css">  
<!--  
.Style20 {font-family: "Comic Sans MS"; font-size: 24px;}  
.Style44 {  
 color: #FFCC00;  
 font-size: 16px;  
}  
.Style57 {  
 font-family: "Comic Sans MS";  
 color: #CC00FF;  
}  
.Style59 {color: #CC00FF}  
.Style60 {color: #FF9900}  
.Style62 {font-family: "Comic Sans MS"}  
.Style63 {  
 font-size: 14px;  
 font-family: "Comic Sans MS";  
}  
.Style1a {color: #CC00CC;}  
.Style1b {color: #FFCC00;}  
.Style1c {  
 color: #FF0000;   
 font-size: 20px;  
}  
.Coins {  
-moz-border-radius:5px;  
-webkit-border-radius:5px;  
border-radius:10px;  
}  
-->  
</style>  
</head>  
<body bgcolor="#FFFFFF" align="center">  
 <table width="100%" height="100%">  
  <tr>  
   <th height="52" colspan="99" bordercolor="#000000" bgcolor="#CC66FF" scope="col"><img src="../images/gif/champignons 1.gif" alt="BAR2" width="48%" height="96%" /><img src="../images/gif/champignons 1.gif" alt="BAR2" width="48%" height="96%" /></th>  
  </tr>  
  <tr bgcolor="#CCFFCC">  
   <th height="100%" colspan="4" scope="row"><span class="Style20">salut</span></th>  
        </tr>  
        <tr bgcolor="#CCFF99">  
   <th height="100%" colspan="4" align="center" valign="middle" scope="row"><span class="Style59"><span class="Style60 Style57"><a href="../accueil.html" class="Style59">Accueil</a></span></span>  
   </th>  
  </tr>  
 </table>   
 <table width="100%" height="10%" align="center" valign="top" bordercolor="#CCFFFF">  
          <form method="post" action="Messagelivredor.php"/>  
        <tr width="100%" align="center" valign="middle" bgcolor="#CCFFCC">  
            <th width="30%" height="" scope="col"><span class="Style62">Votre Nom :</span>  
              <input required type="texte" name="pseudo" value="" size="20"/>  
   </th>  
            <th width="50%" colspan="2" align="center" scope="col"><span class="Style62">Votre note:</span>  
                <select required  value="" name="note">  
                  <option value="">note de 1 à 5 étoile(s)</option>  
                  <option value="1 étoile">1 étoile </option>  
                  <option value="2 étoiles">2 étoiles</option>  
                  <option value="3 étoiles">3 étoiles</option>  
                  <option value="4 étoiles">4 étoiles</option>  
                  <option value="5 étoiles">5 étoiles</option>  
                </select>   
                <span class="Style63">( 5 étoiles étant la meilleure).</span>  
   </th>  
        </tr>  
        <tr align="center" valign="middle" bgcolor="#CC66FF">  
   <th height="40" colspan="3" bordercolor="#FFFFFF" bgcolor="#FFFFFF" scope="row">  
    <textarea required name="message" rows="5" cols="100" value="" WRAP="PHYSICAL"></textarea>  
   </th>  
        </tr>  
        <tr>  
          <th width="30%" align="center" valign="middle" bordercolor="#FFFFFF" bgcolor="#CC99FF"><input type="reset" name="Votremessage" value="Effacer"/></th>  
          <td width="36%" align="center" valign="middle" bordercolor="#FFFFFF" bgcolor="#000000"><span class="Style44 Style62">Un petit message de votre part, me ferai un grand plaisir !</span></td>  
          <td width="30%" align="center" valign="middle" bordercolor="#FFFFFF" bgcolor="#CC99FF"><input type="submit" value="Poster" /></td>  
  </tr>  
 </table>  
 </table>  
<?php  
try  
{  
$pdo = new PDO('mysql:host=localhost;dbname=ochampsch','root','');  
}  
catch (PDOException $e)   
{   
die("<strong>Oupss !!</strong><br/>Une erreur est survenue lors<br/>de la connection à la base de donnée !" . $e->getMessage());   
}  
if(isset($_POST['pseudo']) AND isset($_POST['note']) AND isset($_POST['message']))  
{  
$req = ('INSERT INTO livredor (id, pseudo, note, message, date) VALUES ([value-1],[value-2],[value-3],[value-4],[value-5])');  
$sql = $pdo->prepare($req);  
$sql->bindParam(":pseudo",$_POST['pseudo'],PDO::PARAM_STR);  
$sql->bindParam(":note",$_POST['note'],PDO::PARAM_STR);  
$sql->bindParam(":message",$_POST['message'],PDO::PARAM_STR);//<-- Ici je ne suis pas sûr de laquelle utilisée pour prendre en compte des retour de chariots..)  
$sql->bindParam(":date",date("y-m-d"));  
//$sql->bindParam(":ip",????????????;) <-- Je voudrais insérer aussi une variable ip du client, pour pouvoir faire en sorte qu'il puisse envoyer qu'un message par mois c'est possible? (et comment faire?) 
$send = $sql->execute();  
if($send) header('Location: messagelivredor.php');  
}  
?>  
<?php  
$nombreDeMessagesParPage = 10;  
$req = ('SELECT COUNT(*) AS nb_message FROM livredor ');  
$sql = $pdo->query($req);  
$donnees = $sql->fetch(PDO::FETCH_ASSOC);  
$totalDesMessages = $donnees['nb_message'];  
$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);  
echo '<br/><strong> Page : </strong><br/> ';  
for ($i = 1 ; $i <= $nombreDePages ; $i++)  
{  
 echo '<a href="Messagelivredor.php?page=' .$i. '">' .$i. '</a>  ';  
}  
?>  
<?php  
if (isset($_GET['page']))  
{  
    $page = intval($_GET['page']);  
}  
else  
{  
    $page = 1;  
}  
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;    
$req = ('SELECT * FROM livredor ORDER BY id DESC LIMIT ' .$premierMessageAafficher. ',' .$nombreDeMessagesParPage. '');  
$sql = $pdo->query($req);  
while($donnees = $sql->fetch(PDO::FETCH_ASSOC))  
{  
 echo '<table width="20%" align="center" bgcolor="#CCCCFF" class="Coins">  
 <tr><th height="5" bgcolor="#CCCCFF" ><div><span class="Style1c"<strong>' .($donnees['pseudo']). '</strong></span>  a écrit : </div></th></tr>  
 <br/>  
 <tr><th class="Coins" bgcolor="#000000">  
 <div><span class="Style1b"><strong>' .nl2br($donnees['message']). '</strong></span></div></th></tr><br/>  
 <tr><th class="Coins" height="5" bgcolor="#CCCCFF"> a noté le site <span class="Style1a"><strong>' .($donnees['note']). '</strong></span> sur <strong> 5 </strong></th></tr>  
 </table> posté le : ' .($donnees['date']). '';  
}  
$sql = null;  
$pdo = null;  
?>  
</body>  
</html>


Mais j'ai plusieurs problèmes....
Lors de la saisie des données,
(le point "header" fonctionne puisque ça me rafraîchi les champs!) mais avec la touche f5 ça m'affiche un message comme quoi les données seront renvoyées!

ensuite il n'y a aucunes données insérés dans ma base ....( et aucun message d'erreur s'affiche)

je n'arrive pas a voir les fautes que j'ai commises...
0
Utilisateur anonyme
22 févr. 2013 à 10:24
Le insert fonctionne de la même manière que le select pr les requêtes préparées:

//Attention syntaxe dans la requête :valeur ,pour les valeurs à insérer
$req = "INSERT INTO livredor (id, pseudo, note, message, date) VALUES (:id,:pseudo,:note,:message,:date)";


$sql = $pdo->prepare($req);
$sql->bindParam(":pseudo",$_POST['pseudo'],PDO::PARAM_STR);
$sql->bindParam(":note",$_POST['note'],PDO::PARAM_STR);
$sql->bindParam(":message",$_POST['message'],PDO::PARAM_STR);
$sql->bindParam(":date",date("y-m-d"));

//Jusque là ça devrait marcher


//$sql->bindParam(":ip",????????????;) <-- Je voudrais insérer aussi une variable ip du client, pour pouvoir faire en sorte qu'il puisse envoyer qu'un message par mois c'est possible? (et comment faire?)

//Tu peux ajouter un champ ip mais il faut rajouter une colonne ip dans ta table livredor, ensuite le fonctionnement est le même tu ajoute ip dans ta requête

$req = "INSERT INTO livredor (id, pseudo, note, message, date,ip) VALUES (:id,:pseudo,:note,:message,:date,:ip)";

//Et le bindparam de ip à ajouter à la liste
$sql->bindParam(":ip",$ip,PDO::PARAM_STR);
//Il te faudra récupéré l'adresse ip dans la variable $ip



Quelques observations, ton formulaire et le traitement de de celui ci semble être sur la même page, cependant le action du formulaire renvoie vers Messagelivredor.php et ton header renvoie vers messagelivredor.php . Ce sont deux fichiers distincts?


Lorsque tu soumet ton formulaire les données sont envoyées vers un fichier par le action du formulaire, si tu fais f5 c'est comme si tu ré-appuyais sur le bouton submit donc comme si tu ré_envoyais les données.
0
cretinator Messages postés 67 Date d'inscription samedi 26 janvier 2013 Statut Membre Dernière intervention 6 décembre 2014 1
Modifié par cretinator le 22/02/2013 à 12:56
Merci j'ai pu résoudre le souci d'affichage, en rajoutant ces lignes au code :
$pseudo = (htmlspecialchars($_POST['pseudo'])); 
$note = (htmlspecialchars($_POST['note'])); 
$message = (htmlspecialchars($_POST['message']));  
$message = nl2br($message); 
$date = date("y-m-d"); 
$req = ("INSERT INTO livredor VALUES('','".$pseudo."','".$note."','".$message."','".$date."')"); 


Et pour votre question, non c'est le même fichier.
J'ai lu (sur le site de php) qu'il fallait utilisé la fonction header pour actualisé les champs pour ne pas envoyé deux fois le même texte.(qui marche) mais le hic c'est avec la touche f5...

Dans mon premier script cela fonctionnait la touche f5 renvoyais pas les données grâce à header. mais là il y a un problème...

est ce que c'est à cause des fonction PDOStatements? ou l'header est mal positionné? Ou vu que la fonction action et le header son pas compatible en PDO?

Pour l'IP du client !
Le principe du code :
$sql->bindParam(":ip",$ip,PDO::PARAM_STR); 

J'ai compris la démarche ;-)
Mais maintenant comment on fais pour récupéré l'ip du client ? ( la formule)
j'ai cherché sur le net mais sa ne correspond pas trop pour moi.(mais continu à chercher lool)

Et pour bloquer le clients à un poster qu'un message par mois avec son ip et la date posté.
Quelles sont les démarches à entreprendre?
0