Uploader un fichier et renseigner la base

Eléphant du PHP | 297 Messages

14 mars 2006, 23:38

Bonjour,
voila, je me prends la tete depuis qlqs temps pour uploader une image sur mon serveur, et ranger qlqs infos dans une base dont le nom du fichier uploader et son chemin ! j'ai les infos id/pays/site qui rentrent dans la base, mais pas le nom photo ni son chemin, et je n'ai pas la photo dans le repertoire de destination ! et je n'ai pas non plus de message d'erreur. J'ai fait le tour des tutoriaux. Il est plutot simple mon code , mais....je dois etre nul ! si quelqu'un peut me filer un coup de main :(
merci
<?php require_once('../Connections/pays.php'); ?>
<?php
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_insert"])) && ($_POST["MM_insert"] == "form1")) {
 $insertSQL = sprintf("INSERT INTO bpays (id, pays, site, photo, chemin) VALUES (%s, %s, %s, %s, %s)",
                      GetSQLValueString($_POST['id'], "int"),
                      GetSQLValueString($_POST['pays'], "text"),
                      GetSQLValueString($_POST['site'], "text"),
       GetSQLValueString($_POST['photo'], "text"),
       GetSQLValueString($_POST['chemin'], "text"));

    mysql_select_db($database_pays, $pays);
    $Result1 = mysql_query($insertSQL, $pays) or die(mysql_error());
 }
if( isset($_POST['form1']) ) // si formulaire soumis
 {   
   $chemin = 'images/'; // dossier où sera déplacé le fichier

   $tmp_file = $_FILES['photo']['tmp_name']; // nom temporaire du fichier
  
// on vérifie l'extension
$type_file = $_FILES['photo']['type'];
if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') )
{
exit("Le fichier n'est pas une image");
} 
   
// on copie le fichier dans le dossier de destination
$name_file = $_FILES['photo']['name'];
if(!move_uploaded_file($tmp_file, $chemin.$name_file))
{
exit("Impossible de copier le fichier dans $content_dir");
}     
echo "Le fichier a bien été uploadé";
}
?>
<!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>
<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="" size="32"></td>
   </tr>
   <tr valign="baseline">
     <td nowrap align="right">Site:</td>
     <td><input type="text" name="site" value="" size="32"></td>
   </tr>
   <tr valign="baseline">
     <td nowrap align="right">Photo:</td>
     <td><input type="file" name="photo"></td>
   </tr>
   <tr valign="baseline">
     <td nowrap align="right">&nbsp;</td>
     <td><input type="submit" value="Insérer l'enregistrement"></td>
   </tr>
 </table>
 <input type="hidden" name="id" value="">
 <input type="hidden" name="MM_insert" value="form1">
</form>
<p>&nbsp;</p>
</body>
</html>

Mammouth du PHP | 19672 Messages

15 mars 2006, 00:09

Dans la partie traitement de ton formulaire, ajoute donc ça pour voir :
<pre>
<?php
var_dump($_FILES['photo']);
?>
</pre>
Ça te permettra de vérifier que tu obtiens bien les informations sur ton fichier.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

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

15 mars 2006, 00:18

Bonsoir,

A mon avis y a quelques petits trucs qui ne vont pas :

Dans ton insert :
 
GetSQLValueString($_POST['photo'], "text"), // le nom du fichier ne serait-il pas plutôt dans $_FILES['photo']['name'] ;)
GetSQLValueString($_POST['chemin'], "text"));  // tu n'as pas de champ "chemin" dans ton formulaire... et tu définis $chemin après l'insertion.
Upload du fichier
if( isset($_POST['form1']) ) // form1 est le nom du formulaire, pas d'un champ, ton if sera toujours faux.
Tu devrais gérer l'upload du fichier avant l'insertion en base (comme ça en cas d'erreur, tu n'as pas d'enregistrement à modifier). Cela te pemet aussi de modifier l'insert en fonction du nom du fichier et du chemin que tu définis (tu utilises alors $chemin et $name_file dans ton insert :)).

Eléphant du PHP | 297 Messages

15 mars 2006, 00:24

Salut Cyrano, et merci
j'ai inseré ton code et j'ai ce message lors de la manip :

Code : Tout sélectionner

array(5) { ["name"]=> string(5) "2.gif" ["type"]=> string(9) "image/gif" ["tmp_name"]=> string(14) "/tmp/phpHETAnp" ["error"]=> int(0) ["size"]=> int(38582) }
ca veut dire quoi ??? :?

Mammouth du PHP | 1967 Messages

15 mars 2006, 00:31

cela t'affiche le contenu du tableau $_FILES['photo']

c'est a dire que

$_FILES['photo']['name'] est égale à "2.gif"
$_FILES['photo']['type'] est égale à "image/gif"
$_FILES['photo']['tmp_name'] est égale à "/tmp/phpHetAnp"//nom temporaire du fichier dans son dossier temporaire
etc.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 297 Messages

15 mars 2006, 01:05

Tu devrais gérer l'upload du fichier avant l'insertion en base (comme ça en cas d'erreur, tu n'as pas d'enregistrement à modifier). Cela te pemet aussi de modifier l'insert en fonction du nom du fichier et du chemin que tu définis (tu utilises alors $chemin et $name_file dans ton insert :)).
ok Ryle,
merci, j'ai appliqué tes corrections et j'ai donc retouché un peu mon code ! alors j'ai refait le code en passant l'upload en tete, comme tu m'as conseillé. Puis j'ai allegé le code au niveau des verifs pour l'instant. Le resultat est que l'image est bien uploadée dans son repertoire image. Dans ma base j'ai les deux premieres données avec l'id, mais pas le non de l'image et son chemin. Je pense que j'ecris mal le code a ce niveau :
GetSQLValueString($_POST['$nomFichier'], "text"),
puis ´j'ai un message d'erreur a la fin qui me dit : Warning: Cannot modify header information - headers already sent by .......exemple/formimag3.php on line 81
la ligne 81 c'est la derniere ligne de code sql :
header(sprintf("Location: %s", $insertGoTo));
voici mon code :
<?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
//Script MySQL
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_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO bpays (id, pays, site, photo, chemin) VALUES (%s, %s, %s, %s, %s)",
                       GetSQLValueString($_POST['id'], "int"),
                       GetSQLValueString($_POST['pays'], "text"),
                       GetSQLValueString($_POST['site'], "text"),
                       GetSQLValueString($_POST['$nomFichier'], "text"),
                       GetSQLValueString($_POST['$chemin'], "text"));

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

  $insertGoTo = "formimag3";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
}
?>
<!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>
<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="" size="32"></td>
    </tr>
    <tr valign="baseline">
      <td nowrap align="right">Site:</td>
      <td><input type="text" name="site" value="" size="32"></td>
    </tr>
    <tr valign="baseline">
      <td nowrap align="right">Photo:</td>
      <td><input name="photo" type="file" id="photo"></td>
    </tr>
    <tr valign="baseline">
      <td nowrap align="right">&nbsp;</td>
      <td><input type="submit" value="Insérer l'enregistrement"></td>
    </tr>
  </table>
  <input type="hidden" name="id" value="">
  <input type="hidden" name="chemin" value="">
  <input type="hidden" name="MM_insert" value="form1">
</form>
<p>&nbsp;</p>
</body>
</html>

Eléphant du PHP | 297 Messages

17 mars 2006, 15:28

Merci Ryle :wink:
probleme résolu

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 mars 2006, 19:09

Un pti [Résolu] peut être... :?:

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