PDA

Afficher la version complète : [Réglé] php problème d'affichage d'image



adminlinux
21/03/2006, 23h42
Mon formulaire

<div class='quotetop'>Citation </div>
<form method="post" action="inserer.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="500000" />
<input type="text" name="prenom"> Non

<input tupe="text" name="email">Courriel

<input type="file" name="img">

<input type="submit" name="submit" value="Insérer dans la base">[/b]

Mon inserer.php

<div class='quotetop'>Citation </div>
<?php
if(isset($_FILES['img']))
{
unset($erreur);
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
$taille_max = 500000;
$dest_dossier = '/var/www/eurimpex/photos/';
if( !in_array( substr(strrchr($_FILES['img']['name'], '.'), 1), $extensions_ok ) )
{
$erreur = 'Veuillez s�ectionner un fichier de type png, gif ou jpg !';
}
elseif( file_exists($_FILES['img']['tmp_name'])
and filesize($_FILES['img']['tmp_name']) > $taille_max)
{
$erreur = 'Votre fichier doit faire moins de 500Ko !';
}
if(!isset($erreur))
{
$dest_fichier = basename($_FILES['img']['name']);
$dest_fichier = strtr($dest_fichier, '�����������������������', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuu uyy');
$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
move_uploaded_file($_FILES['img']['tmp_name'], $dest_dossier . $dest_fichier);
}
}
$db = mysql_connect('localhost','root','') or die ("erreur de connexion");
mysql_select_db('test',$db) or die ("erreur de connexion base");
$date = date("d-m-Y");
mysql_query("INSERT INTO test_tbl (id,date,prenom,email,img) VALUES ('','$date','$prenom','$email','$img') ") or die ("erreur insert ".mysql_error());
mysql_close();
?>[/b]

et mon test1.php

<div class='quotetop'>Citation </div>



<?
$db = mysql_connect('localhost','root','') or die ("erreur de connexion");
mysql_select_db('test',$db) or die ("erreur de connexion base");
$req = mysql_query("SELECT id,date,prenom,email,img from test_tbl ") or die ("erreur sql ".mysql_error());
id,date,prenom,email de la table test_tbl
?>
<div align="center">
<table border='1'>
<?
while ( $resultat = mysql_fetch_array($req))
{
print '<tr><td>'.$resultat[prenom].' '.'</td><td>'.$resultat[email].' '.'</td><td>'.$resultat[date].'</td><td><img border="0" alt="'.$resultat[img].'"></td></tr>';
}
?>
</table>
<?mysql_close();//pensez toujours à refermer la connexion
?></p>[/b][/quote]

Le problème c'est que soite j'ai le chemin du fichier ou rien, et je voudrais afficher l'image évidament...

Dudule-le-poisson
22/03/2006, 00h33
2 problèmes :

1)

mysql_query("INSERT INTO test_tbl (id,date,prenom,email,img) VALUES ('','$date','$prenom','$email','$img') ") or die ("erreur insert ".mysql_error());
ton $img n'est pas défini : apparemment tu mets toujours '' dans ta base de données mais apparamment ça ne te pose pas problème (variables gloables à ON ?)

2)

print '<tr><td>'.$resultat[prenom].''.'</td><td>'.$resultat[email].''.'</td><td>'.$resultat[date].'</td><td><img border="0" alt="'.$resultat[img].'"></td></tr>';
pour afficher l'image c'est '<img src="'.$resultat['img']." alt="" />'

PS : ferme ton formulaire avec la balise </form> et corrige ton <input tupe="text" name="email">Courriel

adminlinux
22/03/2006, 01h07
le formulaire étais déjà fermé, mais pas copier coller...

J'ai remplacé

<div class='quotetop'>Citation </div>
mysql_query("INSERT INTO test_tbl (id,date,prenom,email,img) VALUES ('','$date','$prenom','$email','$img') ") or die ("erreur insert ".mysql_error());[/b]

par

<div class='quotetop'>Citation </div>
mysql_query("INSERT INTO test_tbl (id,date,prenom,email,img) VALUES ('','$date','$prenom','$email','$dest_fichier') ") or die ("erreur insert ".mysql_error());[/b]

et sa
<div class='quotetop'>Citation </div>
print '<tr><td>'.$resultat[prenom].' '.'</td><td>'.$resultat[email].' '.'</td><td>'.$resultat[date].'</td><td><img border="0" alt="'.$resultat[img].'"></td></tr>';[/b]

par
<div class='quotetop'>Citation </div>
print '<tr><td>'.$resultat[prenom].' '.'</td><td>'.$resultat[email].' '.'</td><td>'.$resultat[date].'</td><td>'.'<img src=http://adminlinux.sytes.net/eurimpex/photos/'.$resultat[img].'>'.'</td></tr>';[/b]

Maitenant que tu as l'aire de connètre le php, je voudrais ajouter une image cliquable pour afficher une ligne du tableau dans une autre pages seul, peut'tu m'expliquer la démarche ?

Merci a toi...

Dudule-le-poisson
22/03/2006, 01h15
Yep.
1) créer l'image en question (genre une petite flèche)
2) l'insérer sur chaque ligne de ton tableau (nouvelle colonne)
3) rajouter un lien sur l'image de façon à obtenir, après génération du code HTML, quelque chose dans le genre :

<a href="script_qui_affiche_les_details_sur_le_membre_selec tionne.php?id=XX" title="Cliquez ici pour voir le profil de ce membre">
ton/image.png
</a>
4) creer le script "script_qui_affiche_les_details_sur_le_membre_selec tionne.php" qui affiche les données du membre dont l'id est $_GET['id']

adminlinux
22/03/2006, 01h46
merci pour l'info, mais je ma demande comment le lien va savoir que c'est la bonne ligne...

tionne.php?id=XX : l'id, il va la chercher ou ?

doomwatcher
22/03/2006, 12h36
merci pour l'info, mais je ma demande comment le lien va savoir que c'est la bonne ligne...

tionne.php?id=XX : l'id, il va la chercher ou ?[/b]


Ben c'est soit ton formulaire qui l'envoie, soit un cookie, soit une session, soit un script... c'est à toi de choisir...

J'ai pas regardé ton code en détail, et j'ai plus fait de php depuis au moins deux ans... mais pour ce genre d'opération complexe, le mieux est d'utiliser les sessions... t
u y stocke toutes les infos dont tu as besoin et ça te permet d'appeller te variables sur chaque pages où tu en as besoin...

http://www.alionet.org/style_emoticons/<#EMO_DIR#>/wink.gif

en espérant que tu y voies plus clair...

sinon va sur comscripts.com ou sur www.phpscripts-fr.net ils seront plus aptes à t'aider...


++

Dudule-le-poisson
22/03/2006, 13h33
Le XX, c'est toi qui l'écrit dans ton code php ; exemple :


while ( $resultat = mysql_fetch_array($req)) {
echo '<tr>';
echo '<td>contenu precedent machin toussa</td>';
echo 'ton/image.png (details_membre.php?id='.$resultat['id'].')';
}

Le principe du PHP c'est de jongler entre les entrées utilisateur, les arguments et la base de données. Ici, on crée un script qui affiche les détails sur l'utilisateur dont l'id est $_GET['id'], c'est-à-dire que le script s'attend à être appelé avec l'argument id dans son url ; exemple : http://tonsite.com/ton_script?id=5.
Tu peux déjà tester ce script de manière indépendante, en changeant toi-même l'id dans l'URL.
Après, pour chaque utilisateur pour lequel tu veux "mettre une image cliquable n'affichant qu'une ligne", tu rajoutes une image avec un lien vers le script précédent et pour argument... l'id de la ligne en question.

adminlinux
22/03/2006, 14h47
trop fort, sa me fais super plaisire...

j'y avai pensé, mais comme mes performence en php sont 10cm en dessous du sol...

j'ai créer un fichier scriptdetail.php et quand je clique j'ai bien ma page qui souvre

le code

<div class='quotetop'>Citation </div>
<?
while ( $resultat = mysql_fetch_array($req))
{
print '<tr><td>'.$resultat[prenom].''.$resultat[email].''.$resultat[date].'</td><td>'.'<img src=http://adminlinux.sytes.net/eurimpex/photos/'.$resultat[img].' width="50" height="50">'.'</td></tr>';
}
?>[/b]

Je dois modifier quoi pour avoir que la ligne sur la quelle j'ai cliqué ?

Voila j'avance pas à pas....

avec ce code la,

<div class='quotetop'>Citation </div>
<?
$resultat = mysql_fetch_array($req);
{
print '<tr><td>'.$resultat[prenom].''.$resultat[email].''.$resultat[date].'</td><td>'.'<img src=http://adminlinux.sytes.net/eurimpex/photos/'.$resultat[img].' width="50" height="50">'.'</td></tr>';
}
?>[/b]

J'ai une seul ligne, le problème c'est que j'ai toujours la mème ligne qui vien et pas celle sur la quelle je clique..

Dudule-le-poisson
22/03/2006, 20h07
Ne modifie pas l'affichage, modifie ta requête SQL pour passer d'une requête genre


'SELECT * FROM table_membres'

à une requête type :


'SELECT * FROM table_membres WHERE id = '.$_GET['id']

(bon c'est grossier, normalement tu dois parser $_GET['id'] pour t'assurer que c'est bien un nombre entier, il doit y avoir des fonctions genre is_int / is_integer)

adminlinux
22/03/2006, 20h40
j'ai plus d'erreur





<?
$db = mysql_connect('localhost','root',' ') or die ("erreur de connexion");
mysql_select_db('test',$db) or die ("erreur de connexion base");
$req = mysql_query("SELECT date,prenom,email,img FROM test_tbl WHERE id ='.$_GET[id].'") or die ("erreur sql ".mysql_error());
?>
<div align="center">
<table border='1'>
<?
$resultat = mysql_fetch_array($req);
print '<tr><td>'.$resultat[id].''.'</td><td>'.$resultat[prenom].''.'</td><td>'.$resultat[email].''.'</td><td>'.$resultat[date].'</td><td>'.'<img src=http://adminlinux.sytes.net/eurimpex/photos/'.$resultat[img].' width="50" height="50">'.'</td></tr>';
?>
</table>
<?mysql_close();
?></p></div>

avec sa, sa fonctionne, mais dans le tableau, rien est affiché, que des cellules vide...

Dudule-le-poisson
22/03/2006, 22h00
Normal, tu as mal construit ta requête ; avec ce que tu as mis (des concatenations avec simple quote genre '.$machin.' au milieu de double quotes), PHP envoie la requête suivante au serveur :


SELECT date,prenom,email,img FROM test_tbl WHERE id ='.$_GET[id].'
càd la selection des lignes dont l'id vaut '.XX.', ce qui ne correspond à aucune ligne

mets plutot :

$req = mysql_query('SELECT date,prenom,email,img FROM test_tbl WHERE id ='.$_GET['id']) or die ("erreur sql ".mysql_error());

Rappel : double-quote = contenu des quotes interprété (les $truc sont remplacés par la valeur de la variable $truc par exemple) ; pour éviter les ennuis, le mieux est de travailler le plus possible avec des quotes simples ( ' ) concaténées ( avec l'opérateur . ).

Petite astuce : plutôt que d'envoyer un horrible die() à la tête de l'utilisateur, tu peux tester si ta requête a réussi ou échoué et agir en conséquence. En cas d'échec, la plupart des fonctions PHP orientées vers MySQL renvoient un booléen à false. Sinon elles revoient, selon le cas, une ressource, un tableau ou un booléen à true. Exemple avec une requête :


$requete = 'SELECT * from table';
$ligne = mysql_query($requete);
if (!$ligne) {
// la requete a echouee
// gerer l'erreur en affichant un message par exemple
} else {
// la requete a reussie
// continuer le traitement prevu
}

adminlinux
23/03/2006, 09h59
Le problème qui a c'est que avec la ligne que tu me donne, j'ai toujours le message qui vien

<div class='quotetop'>Citation </div>
erreur sql 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 '\"7\"' at line 1[/b]

et je voie pas d'ou sa bien, alors soit la ligne qe j'avais mi me done un tableau vide ou ta ligne me donne ce message la, je perd la tète....

Merci de ta passience, sa me touche beaucoup, tu es bien le seul qui m'aide comme sa....

J'ai trouvé, l'erreur vennais d'une autre page...

J'avais sa dans la page principale,

<div class='quotetop'>Citation </div>
<a href=scriptdetails.php?id="'.$resultat['id'].'"[/b]

J'ai remplacé par sa
<div class='quotetop'>Citation </div>
<a href=scriptdetails.php?id='.$resultat[id].'[/b]

Et du coup sa va tous de suite mieu....

Merci encore....

Dudule-le-poisson
23/03/2006, 14h17
Problème lors du passage de l'argument en méthode GET donc.

Cette erreur pourrait se reproduire si un utilisateur appelle ton script scriptdetails.php en lui passant n'importe quoi après scriptdetails.php?id=
Pour éviter cela, fais une condition de manière à n'effectuer ta requête SQL que lorsque tu es certain que $_GET['id'] est bien un entier ; pour éviter les problèmes de quotes entrées par les utilisateurs lors des concaténations de requête SQL, tu peux utiliser les fonctions addslashes (ajoute des caractères d'échappement \ devant les ') et stripslashes (retire les \ devant les ')


Sinon... d'autres questions ?

adminlinux
23/03/2006, 14h59
oula, sa devien trop complex pour moi, tu peux me donner un exemple ?

Dudule-le-poisson
23/03/2006, 19h00
Hmm....je suis pas là non plus pour faire ton boulot. M'enfin bon...

code type pour ce genre de script :


<?php
$message_erreur = '';
require_once('script_qui_me_connecte_a_ma_base');

// verification de la presence de l'argument entier id
$etat = isset($_GET['id']) && is_integer($_GET['id']);
if (!$etat) $message_erreur .= 'Vous n'avez pas specifie de membre.';

// compose et effectue la requete SQL
if ($etat) {
$requete = 'SELECT * FROM table_membres WHERE id = '.$_GET['id'];
$membre = mysql_query($requete);
$etat = (bool)$membre;
if (!$etat) $message_erreur .= 'Une erreur s'est produite au niveau de la db';
}

// il ne doit ici n'y avoir qu'UNE SEULE ligne sélectionnée; sinon 0 = membre inexistant; 2 = truc suspect, id étant censé être un identifiant unique
if ($etat) {
$etat = (mysql_num_rows($membre) == 1);
if (!$etat) $message_erreur .= 'Membre non trouve dans la db';
}
?>

<?php
if (!$etat) echo '<div class="ereur">Erreur : '.$message_erreur.'</div>;
else {
/* generation de ton tableau toussa */
while ($m = mysql_fetch_array($membre)) echo .... /*donnees du membre toussa */
}
?>

adminlinux
23/03/2006, 20h32
Merci, je vais regarder sa ce soir et cette nuit...

Va faloir que je dorme quand mème.. http://www.alionet.org/style_emoticons/<#EMO_DIR#>/dry.gif

Dudule-le-poisson
28/03/2006, 02h51
Tant qu'à faire que je retourne dans les scriptouilles PHP ces temps-ci :

Rectification : pour tester si une chaîne de caractères représente un nombre, il vaut mieux utiliser bool is_numeric(mixed var).