Page 1 sur 1

variable null effacement valeure bdd

Posté : 06 nov. 2010, 15:49
par XavierBial
Bonjour,
voila j'ai un souci. je veux créer un formulaire où l'on peut modifier le titre et le corps d'un texte qui doit être afficher sur une page web en suite. Mais voilà, j'aimerais que l'on puisse modifier soit le titre, soit le corps du texte soit les deux en même temps. Mais le souci est que quand je choisis de modifier seulement le titre et que je ne tape rien dans le champ corps de texte, celui ci est effacé. comment faire pour que cela n'arrive pas et que le champ laissé vide dans le formulaire ne soit pas effacé?
page du formulaire:

Code : Tout sélectionner

<?php // on se connecte à notre base $base = mysql_connect ("localhost", "root", "" ); mysql_select_db ('jamart', $base) ; ?> <html> <head> </head> <body> <p> <?php // lancement de la requete $sql = 'SELECT titre FROM texte WHERE page= "societe"'; $sql2 = 'SELECT corps FROM texte WHERE page= "societe"'; // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die) $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); $req2 = mysql_query($sql2) or die('Erreur SQL !<br />'.$sql2.'<br />'.mysql_error()); // on recupere le resultat sous forme d'un tableau $data = mysql_fetch_array($req); $data2 = mysql_fetch_array($req2); // on libère l'espace mémoire alloué pour cette interrogation de la base mysql_free_result ($req); ?> </p> <div align="center"> <table width="500" border="5"> <tr> <td> <div align="center"><strong> <?php echo $data['titre']; ?> </strong><br /><br /><br /> <?php echo $data2['corps']; ?> </div></td> </tr> </table> </div> <p>&nbsp; </p> <form value="modification2" action="update2.php" method="POST"> <div align="center"> <p> <input type="hidden" name="page" value="societe"> </p> <p>Titre :</p> <p><br> <input name="titre" type="text" size="100"> <br /> Corps :</p> <p> <textarea name="corps" cols="100" rows="20"></textarea> <br /> </p> </div> <p align="center"> <input type="submit" value="Modifier"></form> </strong> <?php mysql_close (); ?>
Page de l'envois vers la bdd:

Code : Tout sélectionner

<?php $base = mysql_connect ("localhost", "root", "" ); mysql_select_db ('jamart', $base) ; ?> <?php $titre = mysql_real_escape_string(htmlspecialchars($_POST["titre"])) ; $corps = mysql_real_escape_string(htmlspecialchars($_POST["corps"])) ; $page = $_POST["page"] ; $sql = "UPDATE texte SET titre = '$titre', corps = '$corps' WHERE page = '$page' "; $requete = mysql_query($sql) or die( mysql_error() ) ; if($requete) { echo("La modification à été correctement effectuée") ; } else { echo("La modification à échouée") ; } ?>

Re: variable null effacement valeure bdd

Posté : 06 nov. 2010, 18:19
par moogli
Salut,

Il faut tester l'existance des infos avant de les utiliser (tu ne peut etre certain que le source html ne sera pas modifier).
Pour cela utilise la fonction empty ou la fonction isset.

Avec empty tu peut construire la requete en fonction du contenu.
If (!empty($_POST['truc'])) $requete .= 'truc=\''.$_POST['truc'].'\'';
requete doit etre definit avant (update table set )
Ajout le mysql_* bien entendu, comme tu le fait actuellement. Le htmlspecialchars est a reserver pour l'affichage (si tu modifie deux fois il se passe quoi ?)
@+

Re: variable null effacement valeure bdd

Posté : 06 nov. 2010, 20:11
par popy
If (!isset($_POST['truc'])) $requete .= 'truc=\''.addslashes($_POST['truc']).'\'';
Pitié

Re: variable null effacement valeure bdd

Posté : 06 nov. 2010, 20:30
par XavierBial
Salut,

Avec empty tu peut construire la requete en fonction du contenu.
If (!empty($_POST['truc'])) $requete .= 'truc=\''.$_POST['truc'].'\'';
requete doit etre definit avant (update table set )
Ajout le mysql_* bien entendu, comme tu le fait actuellement. Le htmlspecialchars est a reserver pour l'affichage (si tu modifie deux fois il se passe quoi ?)
@+
pardon mais je ne comprend pas très bien

Re: variable null effacement valeure bdd

Posté : 06 nov. 2010, 21:04
par moogli
@popy : pas addslashes il n'échappe pas tous, pis en fonction de l'état des magic_quoteça peut mettre un brin fou (bon ça peu surement être pareil avec mysql_real_escape_string).

@XavierBial : un truc comme ça (a tester bien sur)
<?php
	// connection au serveur à ajouter
	//construction de la requête
	$sql = 'UPDATE texte SET '; 
	if (!empty($_POST['titre'])) {
		$sql .= 'titre=\''.mysql_real_escape_string($_POST['titre']).'\'';
		if (!empty($_POST['corps'])) {
			$sql .= ', corps=\''.mysql_real_escape_string($_POST['corps']).'\'';
		}
	}else {
		if (!empty($_POST['corps'])) {
		$sql .= 'corps=\''.mysql_real_escape_string($_POST['corps']).'\'';
		}
		else {
			$sql = null;
		}
	}
	if ($sql === null) {
		echo '<p>Erreur les deux champs sont vide ....</p>';
	}
	else {
		$sql .= ' where page=\''.mysql_real_escape_string($_POST['page']).'\'';
		$requete = mysql_query($sql);
		if($requete === false){
			echo '<p>Erreur SQL : '.mysql_error().'<br />Requête : '.$sql.'</p>';
		}
		else{
			echo 'La modification à été correctement effectuée';
		}
	}
?>
@+

Re: variable null effacement valeure bdd

Posté : 06 nov. 2010, 23:23
par popy
Dans la pratique, mysql_real_escape_string et addslashes font a peu près la même chose. Par contre, les magic quotes... c'est une fausse excuse. Il faut echapper les valeur, sinon gare aux SQL injection

Re: variable null effacement valeure bdd

Posté : 06 nov. 2010, 23:52
par moogli
Retourne la chaîne str, après avoir échappé tous les caractères qui doivent l'être, pour être utilisée dans une requête de base de données. Ces caractères sont les guillemets simples ('), guillemets doubles ("), antislash (\) et NUL (le caractère NULL).

mysql_real_escape_string() appelle la fonction mysql_escape_string() de la bibliothèque MySQL qui ajoute un slash aux caractères suivants : NULL, \x00, \n, \r, \, ', " et \x1a.
effectivement elle font presque la même chose .... ou presque !

je n'ai pas dit de ne pas échapper les chaines issu des utilisateurs, j'indique toujours de le faire.
c'est vrai que je ne fournis pas des choses de ce style à chaque fois
<?php
function escapeString($v) {
        if (get_magic_quotes_gpc()=== 1){
            stripslashes($v);
        }
		return mysql_real_escape_string($v);
	}
?>
bref perso je désactive les magic quotes c'est plus simple.

Maintenant Xavier a tous ce qu'il lui faut, sauf peut une explication sur les apostrophes magiques et les injection SQL => http://www.expreg.com/fred_article.php? ... phemagique c'est un bon début.

@+