Mise à jour base mysql

Fermé
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 - 28 sept. 2009 à 18:57
 t671 - 17 oct. 2009 à 16:59
Bonjour,

Suite à un upload de fichier, je veux mettre un champ d'une base mysql à jour (adresse du fichier uploadé). Ce champ comporte déjà un enregistrement (adresse d'une image ou doc existante). Ce ne serait juste qu'une complémentation.
L'upload se passe bien, mais apparemment, la requête ne s'éxécute pas. Voilà ce que j'ai écrit :

$requete_update = "UPDATE manifestations SET lien_fichier='$lien_fichier' , fichier='$fichier' , extension='$extension' WHERE id='$id'";

J'ai l'impression que ce n'est pas la bonne requête !!!! ???

Quelle est celle que je dois utiliser pour complémenter un champ texte d'une base de donnée ?

Merci
A voir également:

23 réponses

giheller Messages postés 1875 Date d'inscription dimanche 14 juin 2009 Statut Membre Dernière intervention 3 février 2024 142
28 sept. 2009 à 19:01
bonsoir,

que fait la requ^te ? message d'erreur, rien ?

avez vous essayé en faisant un copier coller la requête en phpmyadmin ?

y a-t-il après
$requete_update = "UPDATE manifestations SET lien_fichier='".$lien_fichier."' , fichier='".$fichier."' , extension=".'$extension."' WHERE id=".$id.'";

$resultat = mysql_update($requete_update);
0
InAme19 Messages postés 539 Date d'inscription samedi 13 septembre 2008 Statut Membre Dernière intervention 29 novembre 2012 62
28 sept. 2009 à 19:02
hum, ça te met quoi comme erreur?

J'ai l'impression que cela provient de ta concaténation avec tes variables. Par exemple au lieu de mettre
SET lien_fichier='$lien_fichier' 


tu mets :
SET lien_fichier='.$lien_fichier.' 


Il faut des . pour concaténer une variable en php
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
29 sept. 2009 à 12:21
Bonjour, et merci à vous deux pour vos réponses !

Pour InAme19 : Si je concatène les variables, c'est pareils. Le résultat est le même que sans concaténation, aucun message d'erreur. Le "header" est éxécuté à la fin, le fichier est uploadé dans sa destination mais la base n'est pas mise à jour.

Pour giheller : donc, aucun message d'erreur. Le "header" est éxécuté à la fin, le fichier est uploadé dans sa destination mais la base n'est pas mise à jour. J'ai rajouté "$resultat = mysql_update($requete_update);
", et j'ai un message : "Fatal error: Call to undefined function mysql_update() in D:\www\wamp\www\Kotoka\gestion\manifestations\test\add-manif-pj.php on line 50
"
.
Si je colle la requête dans phpmyadmin (mais je ne fait aucune sélection !!!??), j'ai comme message : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$requete_update = "UPDATE manifestations SET lien_fichier='.$lien_fichier.' , fi' at line 1.

J'ai pensé qu'il faudrait que je fasse un INSERT plutôt qu'un UPDATE ... !!!??? Je récupère les enregistrements écrit dans les champs concernés, je DELETE ces champs, et je fais un INSERT avec les enregistrements précédemment récupérés + le ou les nouveaux !

Vous en pensez quoi ???

Mon script de mise à jour de la base (actuel) :

<?php
$host = 'localhost';
$user = '.......';
$pass = '........';
$db = '...........';

// connection à la DB
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());

$id = $_GET['id'];

// --------------------test upload fichier------------------------------

$dossier = './dossier_upload/';
$fichier = basename($_FILES['monfichier']['name']);
$taille_maxi = 2000000;
$taille = filesize($_FILES['monfichier']['tmp_name']);
$extensions = array('.gif', '.jpg', '.jpeg', '.doc', '.pdf', '.PDF', '.png', '.PNG', '.GIF', '.JPG', '.JPEG', '.DOC');
$extension = strrchr($_FILES['monfichier']['name'], '.');

.....................................etc...............

{
echo 'Chargement effectué avec succès !';

// on écrit la requête sql .
$requete_update = "UPDATE manifestations SET lien_fichier='.$lien_fichier.' , fichier='.$fichier.' , extension='.$extension.' WHERE id='.$id.'";
$resultat = mysql_update($requete_update);

// on insère les informations du formulaire dans la table
mysql_query($requete_update) or die('Erreur SQL !'.$sql.mysql_error());

}
else
{
echo $erreur;
}

mysql_close(); // on ferme la connexion

header("Location: aff-manif.php");
exit;
?>
0
giheller Messages postés 1875 Date d'inscription dimanche 14 juin 2009 Statut Membre Dernière intervention 3 février 2024 142
1 oct. 2009 à 19:10
bonsoir,
tenter mysql_query($query_update)
mais mettre à jour des données ne peut se faire avec un insert
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
4 oct. 2009 à 11:43
Si je met mysql_query($query_update), j'ai comme réponse "query is empty ..."

Je pense que c'est la requête UPDATE qui est mal écrite et qui ne s'exécute pas .... !!!!! Mais là .... ?????
0
giheller Messages postés 1875 Date d'inscription dimanche 14 juin 2009 Statut Membre Dernière intervention 3 février 2024 142
4 oct. 2009 à 17:51
Bonsoir,
j'ai ajouté quelques " voyez si cela va meiux.

$requete_update = "UPDATE manifestations SET lien_fichier='".$lien_fichier."' , fichier="'.$fichier."' , extension="'.$extension.'" WHERE id="'.$id."'";
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
6 oct. 2009 à 12:28
Bonjour à tous,

Bon ben ça ne marche toujours pas !
J'ai modifier ma requête, mais c'est pas mieux !!!!

J'ai constaté que je perdais l'id, une fois arrivé au script add.
Je sélectionne donc un enregistrement, et je le récupère dans mon script upload.php.

$id = $_GET["id"];

$result=mysql_query("SELECT * FROM manifestations WHERE id='$id'");
echo '<pre>'; print_r($_GET); echo '</pre>'; // visualiser l'id sélectionné
?>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Upload fichier</title>
</head> ..................
<form enctype="multipart/form-data" method="GET" action="add-manif-pj.php" value="envoyer" name="soumettre">


Là je teste l'id et il est bien présent.

Par contre, l'id n'arrive pas à add-manif-pj.php

// connection à la DB
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());

$id = $_GET['id'];
echo 'L\'id est :';
echo $id ;
echo '<pre>'; print_r($_GET); echo '</pre>'; // visualiser l'id sélectionné


Et ma fameuse requête :

$sql = "UPDATE manifestations SET lien_fichier='".$dossier.$fichier."', fichier='".$fichier."' , extension='".$extension."' WHERE id='".$id."'";
mysql_query($sql) or die('Erreur SQL !'.$sql.mysql_error());


La variable ".$dossier.$fichier." correspond à deux variable que je veux coller dans mon enregistrement, l'une à la suite de l'autre .....

Merci pour votre aide car je m'en sort pô ... :o((
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
6 oct. 2009 à 13:52
C'est normal que tu le perdes, ton form utilise la method get.

Il faut donc que tu transmettes ton id via ton form, en ajoutant un champ caché dans celui-ci.

echo '<input type="hidden" name="id" value="' . (int)$_GET['id'] . '" />';
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
6 oct. 2009 à 16:38
Merci P@t@ch0n !

J'ai donc modifier mon upload.php (qui contient également du html) ainsi :

// connection à la DB
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());

$id = $_GET["id"];

$result=mysql_query("SELECT * FROM manifestations WHERE id='$id'");
echo '<pre>'; print_r($_GET); echo '</pre>'; // visualiser l'id sélectionné en test
?>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Upload fichier</title>
</head>

<body bgcolor="#0000FF">
<form enctype="multipart/form-data" method="GET" action="add-manif-pj.php" value="envoyer" name="soumettre">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<input type="hidden" name="id" value="' . (int)$_GET['id'] . '" />
<input type="file" name="monfichier" size="51" /><p>
<input type="reset" value="Effacer">
<input type="submit" name="preview" value="Valider">
..................


Et dans mon add-manif-pj.php, quand j'exécute
$id = $_GET['id'];
echo 'L\'id est :';
echo $id ;

J'ai comme réponse : L'id est :' . (int)$_GET['id'] . '

???????
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
6 oct. 2009 à 16:38
Merci P@t@ch0n !

J'ai donc modifier mon upload.php (qui contient également du html) ainsi :

// connection à la DB
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());

$id = $_GET["id"];

$result=mysql_query("SELECT * FROM manifestations WHERE id='$id'");
echo '<pre>'; print_r($_GET); echo '</pre>'; // visualiser l'id sélectionné en test
?>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Upload fichier</title>
</head>

<body bgcolor="#0000FF">
<form enctype="multipart/form-data" method="GET" action="add-manif-pj.php" value="envoyer" name="soumettre">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<input type="hidden" name="id" value="' . (int)$_GET['id'] . '" />
<input type="file" name="monfichier" size="51" /><p>
<input type="reset" value="Effacer">
<input type="submit" name="preview" value="Valider">
..................


Et dans mon add-manif-pj.php, quand j'exécute
$id = $_GET['id'];
echo 'L\'id est :';
echo $id ;

J'ai comme réponse :
L'id est :' . (int)$_GET['id'] . '

???????
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
6 oct. 2009 à 17:00
C'est logique non ?
Le code php doit toujours se trouver entre <?php et ?>

Donc :

...
<input type="hidden" name="id" value="<?php echo (int)$_GET['id']; ?>" />
... 
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
8 oct. 2009 à 15:00
Merci !!!! Effectivement .........

Maintenant, mon upload de fichier ne fonctionne plus ..... ???? J'ai rien touché, j'y comprends plus rien ........ Bref !!!!!

Voici une partie du code :

$dossier = 'upload/';
$fichier = basename($_FILES['monfichier']['name']);
$taille_maxi = 100000;
$taille = filesize($_FILES['monfichier']['tmp_name']);
$extensions = array('.png', '.gif', '.jpg', '.JPG', '.jpeg');
$extension = strrchr($_FILES['monfichier']['name'], '.');
//Début des vérifications de sécurité...
if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
$erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';
}
if($taille>$taille_maxi)
{
$erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
//On formate le nom du fichier ici pour éviter les accents, caractères spéciaux, espaces, qui peuvent poser problème ....
$fichier = strtr($fichier,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
if(move_uploaded_file($_FILES['monfichier']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
{
echo 'Upload effectué avec succès !';
}
else //Sinon (la fonction renvoie FALSE).
{
echo 'Echec de l\'upload !';
}
}
else
{
echo $erreur;
}

?>


Si je tente d'uploader un fichier jpg ou doc, j'ai automatiquement le message d'erreur 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...', alors que l'extension est bonne !!!???

Comment ça se fait ?

Merci
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
8 oct. 2009 à 15:19
L'upload ne peut s'effectuer en methode get, post obligatoire.

J'avais pas fait attention à cela.
Donc l'id que tu devras récupérer sera dans $_POST, et plus dans get.

Et d'ailleurs, tu n'es plus obligé de le transmettre via un champ caché (cela est mieux quand même), tu peux le passer directement dans l'attribut action de ton form.
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
8 oct. 2009 à 16:02
OK !!! Génial !!!! Ca marche ..... !!!!

Par contre, y'a encore un 'tit problème avec ma requête UPDATE que voici :

$sql = "UPDATE manifestations SET lien_fichier='$dossier.$fichier',fichier='$fichier',extension='$extension' WHERE id='$id'";
mysql_query($sql) or die('Erreur SQL !'.$sql.mysql_error()); "<br />$sql";


Les upload sont bien enregistrés dans la base, mais si il existe déjà un enregistrement dans le champs, le dernier upload écrase le précédent. Alors que je voudrais qu'il se rajoute .....

Comment résoudre cela ?

Merci
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
8 oct. 2009 à 16:47
Encore une fois, je dirais que l'on n'enregistre pas plusieurs valeurs dans un même champ.

Si une ligne de ta table manifestation peut posséder plusieurs fichiers, tu dois faire une table séparée pour ceux-ci.

Tu gagneras en facilité sur les futures manipulations.
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
8 oct. 2009 à 17:00
1) Quentends-tu par "table séparée" ?

2) Si je veux complémenter ma table avec de nouvelles valeurs, comme je ne peux enregistrer plusieurs valeurs dans le même champs, dois-je créer à chaque fois un nouveau champs ? Et comment incrémenter le nouveau nom de ce nouveau champs ?

3) J'avais pensé récupérer l'enregistrement existant dans les champs, les renommés en "_old", et au moment de l'update, faire un genre de
$sql = "UPDATE manifestations SET lien_fichier='$lien_fichier_old $dossier.$fichier',fichier='$fichier_old $fichier',extension='$extension_old $extension' WHERE id='$id'";

Qu'en penses-tu ?
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
8 oct. 2009 à 17:11
« Qu'en penses-tu ? »

Que c'est une mauvaise idée.

J'entends par table séparée, une table destinée uniquement à enregistrer tes données concernant l'upload de tes fichiers.
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
9 oct. 2009 à 17:19
Bonjour,

J'ai donc créé deux tables. Une "manifestations", et une "upload" pour les pièces uploadés (images, doc, ....).
La table upload comprend un champs nommé id_liaison qui est égal à l'id de l'enregistrement correspondant de la table manifestation. Mais tous les enregistrements de la table manifestation non pas obligatoirement un fichier uploadé dans la table upload.

Si j'écris ceci :
$requete = 'SELECT * FROM manifestations, upload ORDER BY date ASC';
$result = mysql_query($requete,$link) or die ('Erreur : '.mysql_error() );
while($row = mysql_fetch_array($result))

tous les enregistrements de la table manifestation s'affichent autant de fois (et avec) qu'il y a d'enregistrements dans la table upload.

Si je rajoute une condition if ($id = $id_liaison), puis l'echo des éléments de la table upload, les éléments de la table manifestation s'affichent en double sans les éments uploadés correspondant !!!????

Merci pour le coup de main !
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
8 oct. 2009 à 19:45
Merci !!!! J'ai créé une 2° table, et je fais une jointure.

J'avance et je te tiens au courant .... ;o))
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
9 oct. 2009 à 19:10
« tous les enregistrements de la table manifestation s'affichent autant de fois (et avec) qu'il y a d'enregistrements dans la table upload. »

C'est tout à fait normal, le sql ressort toujours les données brutes.
À toi de gérer l'affichage désiré avec php.

Préfère également les jointures normalisées.

SELECT les_colonnes  FROM manifestations m
JOIN  upload u
    ON m.id=u.id_liaison
ORDER BY date ASC
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
10 oct. 2009 à 09:59
Bonjour,

Je ne suis pas assez callé en php pour c omprendre ce que tu me dis !!!!!

Voilà ce que j'ai écrit :


$requete = 'SELECT * FROM manifestations, upload ORDER BY date ASC'; //--- le ORDER uniquement valable pour la table manifestation---
$result = mysql_query($requete,$link) or die ('Erreur : '.mysql_error() );
while($row = mysql_fetch_array($result))
{
echo .nl2br($row['texte']).; //---données venant de la table manifestation---
if ($id == $id_liaison) //---id venant de la table manifestation, id_liaison venant de la table upload---
if (in_array($row['extension'], array( ".jpg", ".JPG", ".png", ".PNG", ".jpeg", ".JPEG", ".gif", ".GIF")))
{
echo '<a href ="http://xxxxxxxxxxx ' . $row['lien_fichier'] . '"><img src="http://xxxxxxxxxxxxxxxx ' . $row['lien_fichier'] . '"></a>'; //données venant de la table upload
}
else if (in_array($row['extension'], array( ".doc", ".DOC", ".pdf", ".PDF", ".txt", ".TXT")))
{
echo '<center><a href ="http://xxxxxxxxxxxx ' . $row['lien_fichier'] . '">Télécharger<br><img src="../../../commande.gif"></a>';
}
}
mysql_free_result($result);
exit;
?>


Je suis conscient que mon $requete est plutôt général, mais je ne sais pas comment l'écrire ????
J'ai rajouté des //--- pour des commentaires, que ce soit plus lisible.
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
10 oct. 2009 à 13:17
Salut,

Comme ceci.

// Ordonnancement par les ids en premiers et date en second
$requete = 'SELECT texte, extension, lien_fichier FROM manifestations m
JOIN upload u ON m.id = u.id_liaison
ORDER BY u.id_liaison, m.date';
$result = mysql_query($requete,$link) or exit ('Erreur : '.mysql_error() );

$idEnCours = 0;
while($row = mysql_fetch_array($result))
{
    if( $idEnCours != $row['id_liaison'] )
    {
        $idEnCours = $row['id_liaison'];
        echo nl2br($row['texte']);
    }
    if (in_array($row['extension'], array( '.jpg', '.JPG', '.png', '.PNG', '.jpeg', '.JPEG', '.gif', '.GIF')))
    {
        echo '<a href ='http://xxxxxxxxxxx ' . $row['lien_fichier'] . ''><img src='http://xxxxxxxxxxxxxxxx ' . $row['lien_fichier'] . ''></a>';
    }
    elseif (in_array($row['extension'], array( '.doc', '.DOC', '.pdf', '.PDF', '.txt', '.TXT')))
    {
        echo '<center><a href ='http://xxxxxxxxxxxx ' . $row['lien_fichier'] . ''>Télécharger<br><img src='../../../commande.gif'></a>';
    }
}


Autres commentaires, pourquoi n'as tu pas mit la casse des extensions en minuscules uniquement ?
Le point des extensions n'a pas non plus besoin d'être enregistré dans la table.
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
10 oct. 2009 à 15:54
Je pense que ça vient de $idEncours (ce que je ne comprends pas trop !!!!)
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
10 oct. 2009 à 15:49
Merci .... :o))

J'ai testé ce que tu me proposes ! Malheureusement, il n'y a que les enregistrements de la table manifestation ayant une liaison avec la table upload qui s'affichent ....
Je pense que ça vient de $idEncours (ce que je ne comprends pas trop !!!!)
Alors je cherche , je cherche .....

Pour répondre à tes questions, je n'ai pas mis la casse des extensions uniquement en minuscule, car parfois les extensions sont écrites en majuscule, et je ne sais pas si php fait la différence .... (c'est vrai que j'aurais pu tester .... )
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
10 oct. 2009 à 16:50
« J'ai testé ce que tu me proposes ! Malheureusement, il n'y a que les enregistrements de la table manifestation ayant une liaison avec la table upload qui s'affichent .... »

Bah oui, c'est ce que la requete va chercher, je croyais que c'est ce que tu voulais.
Tu voudrais donc que toutes lignes de manifestation s'affichent ?

Si c'est ça, il suffit simplement d'utiliser un LEFT JOIN à la place du JOIN.

Ensuite, pour $idEncours, cette variable n'est là que pour générer un affichage sans répéter à chaque tour de boucle le contenu de texte.
Ce n'est pas ce que tu voulais non plus ?

Un peu de précisions donc :)
0