Upload fichier

Eléphant du PHP | 206 Messages

16 nov. 2005, 16:30

Encore moi, oui je sais j'ai plein de problème aujourd'hui...

J'ai une page qui contient un formulaire et un upload de fichier.

Séparément le formulaire fonctionne très bien, et l'upload également (j'ai suivi le tutorial de votre site)

Mais voilà une fois réuni sur la même page, l'upload ne fonctionne plus, mais en revanche les données du formulaire s'enregistre parfaitement.

Comme j'ai 2 balise form et deux fichier en ACTION, je pense que le bug vient de là.

PS : Dans votre tutorial, il est prévu uniquement prévu d'uploader le fichier dans un répertoire définit, ou dans l'enregistrer dans une bdd également?

Si oui, c'est un bien un champ de type BLOB qu'il faut créer nan?


Code : Tout sélectionner

<form name="frm" method="post" action="ajout_anomalies.php" enctype="multipart/form-data">
etc etc (champ de mon formulaire, tout fonctionne)

on arrive à l'upload
<?php

if(isset($_FILES['photo']))
{
// params
unset($erreur);
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'txt');
$taille_max = 500000;
$dest_dossier = 'img/';
// vérifications
if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
{
$erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !';  
}
elseif( file_exists($_FILES['photo']['tmp_name']) 
and filesize($_FILES['photo']['tmp_name']) > $taille_max)
{
$erreur = 'Votre fichier doit faire moins de 500Ko !';
}
// copie du fichier
if(!isset($erreur))
{
$dest_fichier = basename($_FILES['photo']['name']);
// formatage nom fichier
// enlever les accents
$dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
// remplacer les caracteres autres que lettres, chiffres et point par _
$dest_fichier = preg_replace('/([^.a-z0-1]+)/i', '_', $dest_fichier);
// copie du fichier
move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier);
}
}

?>
<?php 
if(isset($erreur)){
echo '<p>', $erreur ,'</p>';
}
?> /php*/
<!-- Formulaire -->
<!-- Attention, ne de ne pas oublier le  enctype="multipart/form-data" -->
<form method="POST" action="upload_file.php" enctype="multipart/form-data">
<!-- Limiter la taille des fichiers à 500Ko -->
<input type="hidden" name="MAX_FILE_SIZE" value="500000" />
<fieldset>
<legend>Envoi de fichiers</legend>
<!-- champs d'envoi de fichier, de type file -->
<p>
<label for="photo">Photo :</label>
<input type="file" name="photo" />
</p>
<!-- bouton d'envoi -->
<p>
<input type="submit" name="envoi" value="Envoyer les fichiers" />
</p>
</legend>
</fieldset>
</form>
et un peu plus bas, le premier formulaire se ferme en globant le formulaire d'upload :/
<input type="submit"  value="Envoyer" name="submit">
</form>
Modifié en dernier par betman le 16 nov. 2005, 16:48, modifié 2 fois.

Mammouth du PHP | 1311 Messages

16 nov. 2005, 16:33

PS : Dans votre tutorial, il est prévu uniquement prévu d'uploader le fichier dans un répertoire définit, ou dans l'enregistrer dans une bdd également?

Si oui, c'est un bien un champ de type BLOB qu'il faut créer nan?
oui pour une image on utilise un blob mais tu peut aussi choisir d'enregistrer seulement un chemin (tout depend de ta base)

sinon ton code je l'ai pas regarder, ca me rebute

Eléphant du PHP | 206 Messages

16 nov. 2005, 16:36

jeff, pour le code je te comprends...

Dans ma base j'ai prévu un BLOB pour le fichier.

Sachant que séparemment, mon formulaire fonctionne ainsi que l'upload. Comment dois-je réunir les 2 formulaires pour n'obtenir qu'un seul bouton envoyer ?

Et dans le code de votre tuto upload, le fichier n'est que copier ou bien on peux préciser de l'enregistrer dans une BDD ?

Mammouth du PHP | 983 Messages

16 nov. 2005, 16:37

Mets ton code entre balise PHP et non pas Code. Ca facilitera la lecture ;)

Eléphant du PHP | 206 Messages

16 nov. 2005, 17:11

j'ai remanier mon code pour que ca soit plus simple pour vous ^:)

Mammouth du PHP | 1311 Messages

16 nov. 2005, 17:15

un peu plus bas, le premier formulaire se ferme en globant le formulaire d'upload :/
tu ne peut pas avoir 2 formulaires imbriqués
fais en un seul

Eléphant du PHP | 206 Messages

16 nov. 2005, 17:18

je m'en doutais mais je ne comprends pas comment enregistrer tout d'un seul coup.

L'image je pense se copiera tout de même, mais à quel niveau dois-je l'enregistrer dans la BDD?

Mammouth du PHP | 1311 Messages

16 nov. 2005, 17:23

tu peut faire un truc du genre
<form name="frm" method="post" action="traitement.php" enctype="multipart/form-data">
fichier traitement.php
if(isset($_FILES['photo'])) 
include 'upload.php';//traitement de la photo

//traitement des autre donné du formulaire


Eléphant du PHP | 206 Messages

16 nov. 2005, 17:30

je suis arrivé à ne faire qu'un suel formulaire.

Mes données s'enregistre bien et mon image se copie dans le répertoire défini.

Mais je ne vois pas où enregistrer l'image dans la bdd

j'ai crée un champ photo de type BLOB

mais il reste vide,

pour info mon fichier qui enregistre dans la bdd est le suivant :
<?

include('connection.inc.php');

if(isset($_FILES['photo']))
{
  // params
  unset($erreur);
  $extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'txt');
  $taille_max = 500000;
  $dest_dossier = 'img/';
  // vérifications
  if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
  {
    $erreur = 'Veuillez sélectionner un fichier de type png, gif, jpg ou txt !';  
  }
  elseif( file_exists($_FILES['photo']['tmp_name']) 
          and filesize($_FILES['photo']['tmp_name']) > $taille_max)
  {
    $erreur = 'Votre fichier doit faire moins de 500Ko !';
  }
  // copie du fichier
  if(!isset($erreur))
  {
    $dest_fichier = basename($_FILES['photo']['name']);
    // formatage nom fichier
    // enlever les accents
    $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    // remplacer les caracteres autres que lettres, chiffres et point par _
    $dest_fichier = preg_replace('/([^.a-z0-1]+)/i', '_', $dest_fichier);
    // copie du fichier
    move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier);
  }
}

$query = "INSERT INTO anomalies(id_anom,nom,date,anomalies,desc_anom,photo) VALUES ('','".$_POST['nom']."','".$_POST['date']."','".$_POST['anomalies']."','".$_POST['desc_anom']."','".$_POST['photo']."')"; 
$result = mysql_query($query) or die ('Erreur SQL !<br>'.mysql_error());


header('location: anomalies2.php');
?>

Mammouth du PHP | 1311 Messages

16 nov. 2005, 17:37

et si tu remplace par
$dest_dossier . $dest_fichier
$_POST['photo']

Eléphant du PHP | 206 Messages

16 nov. 2005, 17:43

et si tu remplace par
$dest_dossier . $dest_fichier
$_POST['photo']
tu me disais bien de remplacer ta première ligne par la seconde ?

si c'est le cas l'image ne se copie plus...

Mammouth du PHP | 1311 Messages

16 nov. 2005, 17:49

non
:oops:
$query = "INSERT INTO anomalies(id_anom,nom,date,anomalies,desc_anom,photo) VALUES ('','".$_POST['nom']."','".$_POST['date']."','".$_POST['anomalies']."','".$_POST['desc_anom']."','".$dest_dossier . $dest_fichier."')";

Eléphant du PHP | 206 Messages

16 nov. 2005, 18:06

Génial ca fonctionne !! thx à tous

Heu dernière question après je vous laisse tranquille

Lorsque je fais appel aux données de ma bdd, cela me retourne le chemin et le nom de l'image.

Moi je préfererai l'image elle meme !!

Il faut effectuer un appel particulier ?
<?
include('connection.inc.php');
$query = "SELECT * FROM anomalies ORDER BY id_anom DESC";
$result = mysql_query($query);
$nb = mysql_numrows($result);
while ($val = mysql_fetch_array($result))

{ /* On parcoure les résultats de la requête */
	$id_anom = $val["id_anom"];
	$nom = $val["nom"];
  	$date = $val["date"];
  	$anomalies = $val["anomalies"];
	$desc_anom = $val["desc_anom"];
	$photo = $val["photo"];
  	$bool = $val["bool"];
	
  echo "
    <table width='750' border='0' align='center' cellpadding='5' cellspacing='0'>
      <tr>
	    <td width='15%' class='texte_gras'>$date</td>
        <td width='28%' class='texte_gras'><a href='repondreanom.php?id_anom=$id_anom' class='texte_lien'>$anomalies</a></td>
        <td width='28%' class='texte_gras'><a href='repondreanom.php?id_anom=$id_anom' class='texte_lien'>$nom</a></td>
        <td width='28%' class='texte_gras'><a href='repondreanom.php?id_anom=$id_anom' class='texte_lien'>$photo</a></td>

		<td width='30%' class='status'> "; if ($val["bool"]==1) echo "[Corrigée]"; echo"</td>
	  </tr>
      <tr>
        <td colspan='5' height='1' bgcolor='#f9c9c6'></td>
      </tr>
    </table>
	";
}
?>

Mammouth du PHP | 19672 Messages

16 nov. 2005, 21:36

Si ton image est enregistrée dans un répertoire à part, ce n'est pas envisageable. Il faudrait pour ce que tu veux faire enregistrer l'image en format binaire directement dans la base : bonjour la galère. Je déconseille.

Par contre, je conseille vivement une séparation nette entre PHP et HTML :
<?php
include("connection.inc.php");
$query  = "SELECT * FROM anomalies ORDER BY id_anom DESC";
$result = mysql_query($query);
$nb     = mysql_numrows($result);
while ($val = mysql_fetch_array($result))
{
    /* On parcoure les résultats de la requête */
    $id_anom   = $val["id_anom"];
    $nom       = $val["nom"];
    $date      = $val["date"];
    $anomalies = $val["anomalies"];
    $desc_anom = $val["desc_anom"];
    $photo     = $val["photo"];
    $bool      = $val["bool"];

    $status = ($val["bool"]==1) ? "[Corrigée]" : null;
?>
    <table width="750" border="0" align="center" cellpadding="5" cellspacing="0">
      <tr>
        <td width="15%" class="texte_gras"><?php echo($date); ?></td>
        <td width="28%" class="texte_gras"><a href="repondreanom.php?id_anom=<?php echo($id_anom); ?>" class="texte_lien"><?php echo($anomalies); ?></a></td>
        <td width="28%" class="texte_gras"><a href="repondreanom.php?id_anom=<?php echo($id_anom); ?>" class="texte_lien"><?php echo($nom); ?></a></td>
        <td width="28%" class="texte_gras"><a href="repondreanom.php?id_anom=<?php echo($id_anom); ?>" class="texte_lien"><?php echo($photo); ?></a></td>
        <td width="30%" class="status"><?php echo($status); ?></td>
      </tr>
      <tr>
        <td colspan="5" height="1" bgcolor="#f9c9c6"></td>
      </tr>
    </table>
<?php
}
?>
Ne trouves-tu pas ça plus clair comme ça ? Ça coute à peine quelques millisecondes de plus pour rédiger un code proprement et c'est infiniment plus facile à suivre et à débugguer au besoin.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

17 nov. 2005, 11:15

cyrano,

J'avoue c'est beaucoup plus lisible ^^. Je suis en train de reformater mes pages de cette manière.

Pour l'histoire de l'image, je n'ai pas bien saisie...

Mon image est copié dans un répertoire, il n'y a aucune de façon de la rappeller pour un affichage de l'image elle même ? ( du moins avec le code utilisé)