valeur par defaut d'un champ fichier

Eléphant du PHP | 297 Messages

21 mars 2006, 18:10

Bonjour,
J'ai un formulaire de modification de données dans une table.
Lorsque je souhaite faire une modif j'ai donc par defaut les valeurs de la table qui s'affichent...toutes sauf celle du champ fichier !!

j'ai pourtant une ligne de code avec une valeur par defaut :
<td nowrap align="right">Foto:</td>
                <td><input name="photo" type="file" id="photo" value="<?php echo $row_maj['photo']; ?>" size="18"></td>
et donc lors de la mise a jour, je perds les données du champs !

comment faire pour retenir les infos de ce champ. (j'ai dans mon tableau une colonne nom du fichier "photo" et une colonne chemin "chemin")

merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

21 mars 2006, 18:27

Salut,
Il n'est pas possible pour des raisons de sécurité d'attribuer une valeur par défaut à un champ de type file.

Sinon on y met ce qu'on veut et on télécharge :?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 297 Messages

21 mars 2006, 18:35

ah bon :(
ben comment je fais alors pour conserver l'info de ce champ lors d'une mise a jour ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 mars 2006, 19:00

Bah une fois que le fichier est sur le serveur, tu n'as plus besoin de le mettre à jour (juste à l'éffacer éventuellement :)), d'autant que la valeur que tu auras en base est l'emplacement du fichier sur le serveur, et n'aurait aucun sens dans le champ file destiné à la machine de l'utilisateur :)

Eléphant du PHP | 297 Messages

21 mars 2006, 19:14

c'est pour le cas ou je rentre une premiere fois des infos textes, et n'ayant pas encore de photos, je fait appel plus tard a la mise a jour de l'enregistrement pour rajouter une photo a cet enregistrement.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 mars 2006, 19:20

Vi mais dans ce cas là, pas besoin de valeur par défaut ;)

Donc ne t'embête pas avec la valeur par défaut de ce champ, contente toi juste de tester si celui-ci est renseigné : si c'est le cas, tu récupèresle fichier et tu met à jour ta base, sinon tu conserves l'ancienne valeur (soit en ajustant l'update pour qu'il ne prenne pas en compte ce champ là, soit en écrasant l'enregistrement par son ancienne valeur :))

tu peux par exemple écrire ton update ainsi :
sql = "update table set a = xxx, b = yyy ...";
if($fichier!="")
  $sql.= ", fichier = '$fichier'"; // on ne remplace la valeur que s'il y en a une nouvelle

Eléphant du PHP | 297 Messages

21 mars 2006, 21:56

ok je vais faire comme ca :)
par contre peux tu confirmer que l'insertion du code ca se passe ici :
if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1")) {
  $updateSQL = sprintf("UPDATE bpays SET pays=%s, site=%s, photo=%s, chemin=%s WHERE id=%s",
                       GetSQLValueString($_POST['pays'], "text"),
                       GetSQLValueString($_POST['site'], "text"),
                       GetSQLValueString($_POST['photo'], "text"),
                       GetSQLValueString($_POST['chemin'], "text"),
                       GetSQLValueString($_POST['id'], "int"));
et concernant la variable "$fichier", dois je la specifier auparavant ?

désolé je suis une bille en php, et j'utilise en plus DW !

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

21 mars 2006, 22:36

par contre peux tu confirmer que l'insertion du code ca se passe ici :
Oui, juste après.
concernant la variable "$fichier", dois je la specifier auparavant ?
il manque toute la partie upload du fichier pour renseigner cette fameuse variable $fichier, regarde ce tuto sur l'upload

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 297 Messages

21 mars 2006, 23:30

si je l'ai ! j'avais deja lu le tuto :)
par contre j'ai inseré le code, et m'indique une erreur
">   
 


Warning: mysql_free_result(): 3 is not a valid MySQL result resource in /home.2/webaplic/www/exemple/majpays2.php on line 152
et je n'ai pas de ligne 152 !

et puis la photo deja presente dans ma table, disparait suite a la mise a jour sans rien rentrer dans le champ photo... :cry:

est ce que je dois agir de meme sur la fonction move_upload_file ?

je suis perdu :shock:

voici mon code total avec la modif:
<?php require_once('../Connections/pays.php'); ?>
<?php
//Script Upload
//on vérifies que le champ est bien rempli:
if(!empty($_FILES["photo"]["name"]))
{
	//nom du fichier choisi:
	$nomFichier    = $_FILES["photo"]["name"] ;
	//nom temporaire sur le serveur:
	$nomTemporaire = $_FILES["photo"]["tmp_name"] ;
	//type du fichier choisi:
	$typeFichier   = $_FILES["photo"]["type"] ;
	//poids en octets du fichier choisit:
	$poidsFichier  = $_FILES["photo"]["size"] ;
	//code de l'erreur si jamais il y en a une:
	$codeErreur    = $_FILES["photo"]["error"] ;
	
	//chemin qui mène au dossier qui va contenir les fichiers upload:
	$chemin = "./images/" ;
 
	if(move_uploaded_file($nomTemporaire, $chemin.$nomFichier))
		echo("<br>l'upload a réussi");
	else
		echo("<br>l'upload a échoué");
}//fin if
else
{
	echo("Vous n'avez pas choisit de fichier!!<br>") ;
	echo("<a href=\"./choix_fichier.html\">Retour</a>") ;
}//fin else
?>

<?php
$nomFichier = ""; // déclaration des variables 
$chemin = ""; 

if(!empty($_FILES["photo"]["name"])) { 
    $nomFichier    = $_FILES["photo"]["name"] ; // renseignement des variables 
    $chemin = "./images/" ; 

} 

function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1")) {
  $updateSQL = sprintf("UPDATE bpays SET pays=%s, site=%s, photo=%s, chemin=%s WHERE id=%s",
                       GetSQLValueString($_POST['pays'], "text"),
                       GetSQLValueString($_POST['site'], "text"),
                       GetSQLValueString($nomFichier, "text"), // utilisation des variables nom 
                       GetSQLValueString($chemin, "text"), // et chemin 
                       GetSQLValueString($_POST['id'], "int"));
					   
 if($nomFichier!="") 
  $sql.= ", fichier = '$nomFichier'"; // on ne remplace la valeur que s'il y en a une nouvelle 

  mysql_select_db($database_pays, $pays);
  $Result1 = mysql_query($updateSQL, $pays) or die(mysql_error());

  $updateGoTo = "affichageimag.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $updateGoTo .= (strpos($updateGoTo, '?')) ? "&" : "?";
    $updateGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $updateGoTo));
}

$colname_majpays = "1";
if (isset($_GET['id'])) {
  $colname_majpays = (get_magic_quotes_gpc()) ? $_GET['id'] : addslashes($_GET['id']);
}
mysql_select_db($database_pays, $pays);
$query_majpays = sprintf("SELECT * FROM bpays WHERE id = %s", $colname_majpays);
$majpays = mysql_query($query_majpays, $pays) or die(mysql_error());
$row_majpays = mysql_fetch_assoc($majpays);
$totalRows_majpays = mysql_num_rows($majpays);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Document sans titre</title>
</head>

<body>

<div align="center">
  <form action="<?php echo $editFormAction; ?>" method="post" enctype="multipart/form-data" name="form1">
    <table align="center">
      <tr valign="baseline">
        <td nowrap align="right">Pays:</td>
        <td><input type="text" name="pays" value="<?php echo $row_majpays['pays']; ?>" size="32"></td>
      </tr>
      <tr valign="baseline">
        <td nowrap align="right">Site:</td>
        <td><input type="text" name="site" value="<?php echo $row_majpays['site']; ?>" size="32"></td>
      </tr>
      <tr valign="baseline">
        <td nowrap align="right">Photo:</td>
        <td><input name="photo" type="file" id="photo" value="<?php echo $row_majpays['photo']; ?>"></td>
      </tr>
      <tr valign="baseline">
        <td nowrap align="right">&nbsp;</td>
        <td><input type="submit" value="Mettre à jour l'enregistrement"></td>
      </tr>
    </table>
    <input type="hidden" name="id" value="<?php echo $row_majpays['id']; ?>">
    <input type="hidden" name="chemin" value="<?php echo $row_majpays['chemin']; ?>">
    <input type="hidden" name="MM_update" value="form1">
    <input type="hidden" name="id" value="<?php echo $row_majpays['id']; ?>">
  </form>
  <p>&nbsp;</p>
</div>
</body>
</html>
<?php
mysql_free_result($majpays);
?>

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

22 mars 2006, 00:29

autant pour moi, il faut décomposer pour insérer la mise à jour avant la clause WHERE:
if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1")) {
  $updateSQL = sprintf("UPDATE bpays SET pays=%s, site=%s, , chemin=%s ",
                       GetSQLValueString($_POST['pays'], "text"),
                       GetSQLValueString($_POST['site'], "text"),
                       GetSQLValueString($chemin, "text"));
                       
if($nomFichier != "")
  $sql.= ", photo = '$nomFichier' "; // on ne remplace la valeur que s'il y en a une nouvelle 

$sql.= " WHERE id = ".$_POST['id'];
et il faut biensur appeler le bon champ, "fichier" était un exemple toi c'est "photo" :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 297 Messages

22 mars 2006, 01:06

désolé je reviens a la charge :(
j'ai inseré le code, mais j'ai toujours le meme symptome. c'est a dire, si je renvoie le formulaire de modif sans remplir le champ fichier, j'ai les valeurs chemin et photo qui disparaissne t de la base ainsi que la photo du serveur.
je vois pas d'ou ca peut venir.
je te refile mon code si tu veux toujours m'aider !
<?php require_once('../Connections/pays.php'); ?>
<?php
//Script Upload
//on vérifies que le champ est bien rempli:
if(!empty($_FILES["photo"]["name"]))
{
	//nom du fichier choisi:
	$nomFichier    = $_FILES["photo"]["name"] ;
	//nom temporaire sur le serveur:
	$nomTemporaire = $_FILES["photo"]["tmp_name"] ;
	//type du fichier choisi:
	$typeFichier   = $_FILES["photo"]["type"] ;
	//poids en octets du fichier choisit:
	$poidsFichier  = $_FILES["photo"]["size"] ;
	//code de l'erreur si jamais il y en a une:
	$codeErreur    = $_FILES["photo"]["error"] ;
	
	//chemin qui mène au dossier qui va contenir les fichiers upload:
	$chemin = "./images/" ;
 
	if(move_uploaded_file($nomTemporaire, $chemin.$nomFichier))
		echo("<br>l'upload a réussi");
	else
		echo("<br>l'upload a échoué");
}//fin if
else
{
	echo("Vous n'avez pas choisit de fichier!!<br>") ;
	echo("<a href=\"./choix_fichier.html\">Retour</a>") ;
}//fin else
?>

<?php
$nomFichier = ""; // déclaration des variables 
$chemin = ""; 

if(!empty($_FILES["photo"]["name"])) { 
    $nomFichier    = $_FILES["photo"]["name"] ; // renseignement des variables 
    $chemin = "./images/" ; 

} 

function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1")) {
  $updateSQL = sprintf("UPDATE bpays SET pays=%s, site=%s, photo=%s, chemin=%s WHERE id=%s",
                       GetSQLValueString($_POST['pays'], "text"),
                       GetSQLValueString($_POST['site'], "text"),
                       GetSQLValueString($chemin, "text")); 
                        
if($nomFichier != "") 
$sql.= ", photo = '$nomFichier' "; // on ne remplace la valeur que s'il y en a une nouvelle 

$sql.= " WHERE id = ".$_POST['id'];

  mysql_select_db($database_pays, $pays);
  $Result1 = mysql_query($updateSQL, $pays) or die(mysql_error());

  $updateGoTo = "affichageimag.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $updateGoTo .= (strpos($updateGoTo, '?')) ? "&" : "?";
    $updateGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $updateGoTo));
}

$colname_majpays = "1";
if (isset($_GET['id'])) {
  $colname_majpays = (get_magic_quotes_gpc()) ? $_GET['id'] : addslashes($_GET['id']);
}
mysql_select_db($database_pays, $pays);
$query_majpays = sprintf("SELECT * FROM bpays WHERE id = %s", $colname_majpays);
$majpays = mysql_query($query_majpays, $pays) or die(mysql_error());
$row_majpays = mysql_fetch_assoc($majpays);
$totalRows_majpays = mysql_num_rows($majpays);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Document sans titre</title>
</head>

<body>

<div align="center">
  <form action="<?php echo $editFormAction; ?>" method="post" enctype="multipart/form-data" name="form1">
    <table align="center">
      <tr valign="baseline">
        <td nowrap align="right">Pays:</td>
        <td><input type="text" name="pays" value="<?php echo $row_majpays['pays']; ?>" size="32"></td>
      </tr>
      <tr valign="baseline">
        <td nowrap align="right">Site:</td>
        <td><input type="text" name="site" value="<?php echo $row_majpays['site']; ?>" size="32"></td>
      </tr>
      <tr valign="baseline">
        <td nowrap align="right">Photo:</td>
        <td><input name="photo" type="file" id="photo" value="<?php echo $row_majpays['photo']; ?>"></td>
      </tr>
      <tr valign="baseline">
        <td nowrap align="right">&nbsp;</td>
        <td><input type="submit" value="Mettre à jour l'enregistrement"></td>
      </tr>
    </table>
    <input type="hidden" name="id" value="<?php echo $row_majpays['id']; ?>">
    <input type="hidden" name="chemin" value="<?php echo $row_majpays['chemin']; ?>">
    <input type="hidden" name="MM_update" value="form1">
    <input type="hidden" name="id" value="<?php echo $row_majpays['id']; ?>">
  </form>
  <p>&nbsp;</p>
</div>
</body>
</html>
<?php
mysql_free_result($majpays);
?>

Invité
Invité n'ayant pas de compte PHPfrance

23 mars 2006, 03:44

:( il ni y a pas une bonne ame pour m'aider...j'ai pratiquement fini mon projet... :?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mars 2006, 10:55

Un petit loupé dans la requête (que tu n'as pas modifié) et dans le nom de la variable contenant la requête ($updateSQL et $sql) :)
// j'ai viré photo, chemin et le where de la requête, voir ci-dessous
$updateSQL = sprintf("UPDATE bpays SET pays=%s, site=%s", 
                       GetSQLValueString($_POST['pays'], "text"), 
                       GetSQLValueString($_POST['site'], "text")); 

// tu as ici la base de ta requête update, à laquelle on va rajouter les infos sur le fichier (".=" est une concatenation, on rajoute à la suite), uniquement si cela est nécessaire :

if($nomFichier != "") { // on ne met à jour chemin et photo que si un nouveau fichier est posté
  $updateSQL.= ", chemin = '$chemin' "; 
  $updateSQL.= ", photo = '$nomFichier' "; 
}

// Dans tous les cas, fichier ou pas, on ajoute le where à la fin de la requête, cf. le message de Truc
$updateSQL.= " WHERE id = ".$_POST['id']; 

Sinon, juste une petite modif à faire au début de ton script pour le simplifier et le clarifier un peu :
<?
// je remonte la déclaration avant la récup du fichier
$nomFichier = ""; // déclaration des variables 
$chemin = ""; 

if(!empty($_FILES["photo"]["name"])) { 
    $nomFichier    = $_FILES["photo"]["name"] ;     //nom du fichier choisi: 
    $nomTemporaire = $_FILES["photo"]["tmp_name"] ;     //nom temporaire sur le serveur: 
    $typeFichier   = $_FILES["photo"]["type"] ;     //type du fichier choisi: 
    $poidsFichier  = $_FILES["photo"]["size"] ;     //poids en octets du fichier choisit: 
    $codeErreur    = $_FILES["photo"]["error"] ;     //code de l'erreur si jamais il y en a une: 
    
    //chemin qui mène au dossier qui va contenir les fichiers upload: 
    $chemin = "./images/" ; 

    if(move_uploaded_file($nomTemporaire, $chemin.$nomFichier)) 
        echo("<br>l'upload a réussi"); 
    else 
        echo("<br>l'upload a échoué"); 
}//fin if 
else { 
    echo("Vous n'avez pas choisit de fichier!!<br>") ; 
    echo("<a href=\"./choix_fichier.html\">Retour</a>") ; 
}//fin else 

// pas la peine de fermer pour rouvrir juste derrière ;)
// ?> 
//<?php 

// La partie qui suit est donc inutile : les variables sont déclarées en haut, et directement renseignées s'il y a un fichier, pas besoin de les vider et de refaire le test sur le fichier
// $nomFichier = ""; // déclaration des variables 
// $chemin = ""; 

//if(!empty($_FILES["photo"]["name"])) { 
//    $nomFichier    = $_FILES["photo"]["name"] ; // renseignement des variables 
//    $chemin = "./images/" ; 
//} 

...

function GetSQLValueString ...
?>

Eléphant du PHP | 297 Messages

23 mars 2006, 17:54

:D Merci Ryle, ca marche au poil !!!
merci aussi Truc !