News box avec une image, un texte et un timing simples

ViPHP
ViPHP | 5462 Messages

07 juin 2010, 11:11

Doit y avoir un autre problème... j'ai mis : $taille_maxi = 20480000; exprès pour tester... le fichier c'est une toute petite image jpeg du genre 50x50

Doit y avoir une autre erreur dans le code non ?

ca c'est dans ton PHP, mais dans ton forumlaire ta mis quoi ?

Eléphant du PHP | 82 Messages

07 juin 2010, 12:01

Ah oui quel débile... c'est bon, il me met

Array ( [image_news] => Array ( [name] => cube2.jpg [type] => image/jpeg [tmp_name] => /var/log/tmp/php4z7ATJ [error] => 0 [size] => 4860 ) ) Upload effectué avec succès !

Merci pour ton aide stealth35 :D

ça marche...

Presque. Il ne manque plus que le détail de l'image qui ne s'affiche pas et de la date.
Voici mon code :
<?php

// on se connecte à notre base  
$base = mysql_connect ('***', '***', '***');  
mysql_select_db('***', $base);  

// lancement de la requête. on s&eacute;lectionne les news que l'on va ordonner suivant l'ordre "inverse" des dates (de la plus r&eacute;cente à la plus vieille : DESC) tout en ne s&eacute;lectionnant que le nombre voulu de news à afficher (LIMIT)  
$sql = 'SELECT auteur, titre, DAY(date) AS jour, MONTH(date) AS mois, YEAR(date) AS annee, HOUR(date) AS heure, MINUTE(date) AS minutes, SECOND(date) AS secondes, image_news, texte_news FROM news ORDER BY date DESC LIMIT 10'; 

// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)  
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  

// on compte le nombre de news stock&eacute;es dans la base de donn&eacute;es  
$nb_news = mysql_num_rows($req);  

if ($nb_news == 0) { 
   echo 'Aucune news enregistr&eacute;e.';  
}
else { 
	// si on a au moins une news, on l'affiche 
	while ($data = mysql_fetch_array($req)) {

    // on affiche les r&eacute;sultats
	echo 
	'<table>
		<tr>
			<td>';
				echo htmlentities(trim($data['image_news']));
			echo 
			'</td>
			<td>';
				echo '<br />News de : ' , htmlentities(trim($data['auteur'])) , '<br />'; 
				echo 'Titre : ' , htmlentities(trim($data['titre'])) , '<br />';
				echo 'Post&eacute;e le : ' , $data['jour'] , '/' , $data['mois'] , '/' , $data['annee'] , ' &agrave; ' , $data['heure'] , ':' , $data['minutes'] , ':' , $data['secondes'] , '<br /><br />'; 
				echo 'News : ' , nl2br(htmlentities(trim($data['texte_news']))) , '<br /><br /><br />'; 
			echo '</td>
		</tr>
	</table>';
   }
}
// on lib&egrave;re l'espace m&eacute;moire allou&eacute; à cette requête  
mysql_free_result ($req);  

// on ferme la connexion à la base de donn&eacute;es  
mysql_close ();  
?>
Au lieu de l'image s'affiche l'heure à laquelle a été insérée la news et au lieu de la date et heure s'affiche 0/0/0 et pas l'heure...

aperçu ici : http://www.i-mediaservices.com/actus

Et le champ image_news est de type blob... enfin voici un screen de mes champs de ma table news, pensez-vous que tout est correct ?
Image
Modifié en dernier par LightBen le 07 juin 2010, 13:53, modifié 1 fois.

ViPHP
ViPHP | 5462 Messages

07 juin 2010, 13:21

attention t'as mis tes identifiants :wink:

EDIT : y'a plusieurs trucs qui sont pas cohérent, deja dans ton insere de base tu met mysql_escape_string($_POST['image_news']), hors de champs n'existe pas, ensuite t'es en blob (donc sous entendu que tu stocks les données binaires des images) alors que tu sauve ton image dans un répertoire, et t'as pas de mis de ligne pour récupérer les image dans ta vue final

Eléphant du PHP | 82 Messages

07 juin 2010, 13:56

Donc en fait j'ai utilisé un procédé dans le formulaire qui met l'image dans un répertoire et dans mon code d'affichage des données je récupère le champ blob ce qui est illogique car j'y ai rien inséré dedans, c'est ça ?

Donc je dois trouver un procédé pour soit insérer l'image dans le champ blob (et là on passe par la BDD) soit la récupérer dans le dossier (et là que du php) ?

Edit : si c'est ça, en tant que débutant, je peux essayer de googliser mais je trouverai pas tout seul :oops:

ViPHP
ViPHP | 5462 Messages

07 juin 2010, 13:59

sois tu mets les données binaire dans ton champs blob
sois tu mets le path vers la ou l'image a été mise

(la 2eme solution étant la plus simple, et la plus effilasse)

Eléphant du PHP | 82 Messages

07 juin 2010, 14:03

Donc c'est cette ligne là qu'il faut changer ?

echo htmlentities(trim($data['image_news']));

Et récupérer le path de l'image ?

Si oui, j'ai une question (si non et que donc ma question sert à rien, peut-être faut pas lire ^^) :

Si j'insère une nouvelle news, comment différencier les images ?
Je veux dire, si je mets un path, il faut que ce soit vers une image précise non ? Et si je veux une image par news ? Enfin... erf

ViPHP
ViPHP | 5462 Messages

07 juin 2010, 14:08

Donc c'est cette ligne là qu'il faut changer ?

echo htmlentities(trim($data['image_news']));

Et récupérer le path de l'image ?

deja dans ta requete c''est pas $_POST['image_news'] qui faut mettre mais $chemin_destination.$_FILES['image_news']['name'],
ensuite dans ton html ca serait
echo '<img src="' . htmlentities(trim($data['image_news'])) . '" alt="" />';

Si j'insère une nouvelle news, comment différencier les images ?
Je veux dire, si je mets un path, il faut que ce soit vers une image précise non ? Et si je veux une image par news ? Enfin... erf

ducoup oui, pour ca tu met par exemple le timestamp dans le nom de l'image ca sera unique

image_124689754555.jpg

Eléphant du PHP | 82 Messages

07 juin 2010, 14:15

Il me met après insertion : Warning: Division by zero in /homez.60/imediase/www/insert_news.php on line 63

Je suppose qu'il faut mettre quelque chose pour bloquer le slash ? :

"'.mysql_escape_string($sites/all/images.$_FILES['image_news']['name']).'"

Et ça avance, la date ne s'affiche plus avec ton echo, il s'affiche une image "brisée", donc surement le problème de path, on approche youpi
ducoup oui, pour ca tu met par exemple le timestamp dans le nom de l'image ca sera unique

image_124689754555.jpg
:?:

ViPHP
ViPHP | 5462 Messages

07 juin 2010, 14:26

ta pas mis de quote pour ta chaine du coup il croi que c'est une division ca va pas,
pour la date j'ai rien dis, pour ton image brise , regarde la path que ca te rend et si l'image existe bien sur le bon path que ta donnée

tu fais
$chemin_destination.$_FILES['image_news']['name']

mais apres tu fais
mysql_escape_string($sites/all/images.$_FILES['image_news']['name'])


si tu mets ton image dans : mon/chemin/mon/image.jpg
dans ta base ton champs image_news dois etre : mon/chemin/mon/image.jpg
dans ton html t'aura : <img src="mon/chemin/mon/image.jpg" alt="" />

Eléphant du PHP | 82 Messages

08 juin 2010, 14:15

Pour la date je voulais dire que la date qui s'affichait à la place de l'image est maintenant une image brisée, c'est mieux donc.

J'ai pas tout réussi à traduire à cause de la syntaxe, tu penses quoi de ça :
"'.mysql_escape_string($'sites/all/images'.$_FILES['image_news']['name']).'"
Et :
echo '<img src="' . htmlentities(trim($data['sites/all/images'])) . '" alt="" />';
Et tu voulais dire que maintenant je dois changer mon champ image_news dans ma BDD ?

ViPHP
ViPHP | 5462 Messages

08 juin 2010, 14:19

ta essayes ?

Eléphant du PHP | 82 Messages

08 juin 2010, 14:26

Pour l'instant j'en suis là :

j'ai rien touché à ma BDD et :

formulaire d'insertion :
<?php
print_r($_FILES);
$dossier = 'sites/all/images';
$fichier = basename($_FILES['image_news']['name']);
$taille_maxi = 102400;
$taille = filesize($_FILES['image_news']['tmp_name']);
$extensions = array('.png', '.gif', '.jpg', '.jpeg');
$extension = strrchr($_FILES['image_news']['name'], '.'); 
//D&eacute;but des v&eacute;rifications de s&eacute;curit&eacute;...
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, ou jpeg';
}
if($taille>$taille_maxi)
{
     $erreur = 'Le fichier est trop lourd';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $fichier = strtr($fichier, 
          'ÀÁÂÃÄÅÇ&egrave;&eacute;ÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåç&egrave;&eacute;êëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
     if(move_uploaded_file($_FILES['image_news']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionn&eacute;
     {
          echo 'Upload effectu&eacute; avec succ&egrave;s !';
     }
     else //Sinon (la fonction renvoie FALSE).
     {
          echo '&Eacute;chec de l\'upload !';
     }
}
else
{
     echo $erreur;
}

// MOVE UPLOADED FILE
if ((isset($_FILES['image_news']['fichier'])&&($_FILES['image_news']['error'] == UPLOAD_ERR_OK))) {
$chemin_destination = 'sites/all/images';
move_uploaded_file($_FILES['image_news']['tmp_name'], $chemin_destination.$_FILES['image_news']['name']);
}


// on teste si le formulaire a &eacute;t&eacute; valid&eacute;
if (isset($_POST['go']) && $_POST['go']=='Poster la news') {
// on se connecte à notre base
$base = mysql_connect ('***', '***', '***');  
mysql_select_db('***', $base);  

// on teste la d&eacute;claration de nos variables
if (!isset($_POST['auteur']) || !isset($_POST['titre']) || !isset($_POST['texte_news'])) {
        $erreur = 'Les variables n&eacute;cessaires au script ne sont pas d&eacute;finies.';
}
else {
        if (empty($_POST['auteur']) || empty($_POST['titre']) || empty($_POST['texte_news'])) {
                $erreur = 'Au moins un des champs est vide.';
        }
        // si tout est bon, on peut commencer l'insertion dans la base
        else {
                // lancement de la requête d'insertion
                $sql = 'INSERT INTO news VALUES("", "'.mysql_escape_string($_POST['auteur']).'", "'.mysql_escape_string($_POST['titre']).'", "'.mysql_escape_string($sites/all/images.$_FILES['image_news']['name']).'", "'.date("d-m-Y H:i:s").'", "'.mysql_escape_string($_POST['texte_news']).'")';
                // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die) 
                mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
                // on ferme la connexion à la base de donn&eacute;es
                mysql_close();
                /* on redirige vers la page d'accueil du site (attention, cette redirection ne fonctionne qui si vous avez plac&eacute; cette page dans un r&eacute;pertoire à partir de la racine du site). Si ce n'est pas le cas, veuillez entrer ici le bon chemin d'acc&egrave;s afin de retomber sur la page d'accueil du site. 
                header('Location: index.php'); */
                // on termine le script courant
                exit();
                }
        }
}

?>
<html>
<head>
<title>Insertion d'une nouvelle news</title>
</head>

<body>

<!-- on fait pointer le formulaire vers la page traitant les donn&eacute;es -->
<form method="post" action="insert_news.php" enctype="multipart/form-data">
	<table>
		<tr>
			<td>
				<span class="gras">Auteur :</span>
			</td>
			<td>
				<input type="text" name="auteur" maxlength="30" size="50" value="<?php if (isset($_POST['auteur'])) echo htmlentities(trim($_POST['auteur'])); ?>">
			</td>
		</tr>
		<tr>
			<td>
				<span class="gras">Titre :</span>
			</td>
			<td>
				<input type="text" name="titre" maxlength="50" size="50" value="<?php if (isset($_POST['titre'])) echo htmlentities(trim($_POST['titre'])); ?>">
			</td>
		</tr>
		<tr>
			<td>
				<span class="gras">Image</span>
				<input type="text" style="display:none" name="nbr_photo" value="0" id="nbr_photo" />
			</td>
			<td>
				<input type=hidden name=MAX_FILE_SIZE  value=102400>
				<input type="file" name="image_news" id="image_news" value="image_news" />
			</td>   
		</tr>
		<tr>
			<td>
				<span class="gras">News :</span>
			</td>
			<td>
				<textarea name="texte_news" cols="50" rows="10"><?php if (isset($_POST['texte_news'])) echo htmlentities(trim($_POST['texte_news'])); ?></textarea>
			</td>
		</tr>
		<tr>
			<td>
			<td align="right">
				<input type="submit" name="go" value="Poster la news">
			</td>
		</tr>
	</table>
</form>
<?php
// on affiche les erreurs &eacute;ventuelles  
if (isset($erreur)) echo '<br /><br />',$erreur;  
?>
</body>
</html>
Affichage des news :
<?php

// on se connecte à notre base  
$base = mysql_connect ('***', '***', '***');  
mysql_select_db('***', $base);  

// lancement de la requête. on s&eacute;lectionne les news que l'on va ordonner suivant l'ordre "inverse" des dates (de la plus r&eacute;cente à la plus vieille : DESC) tout en ne s&eacute;lectionnant que le nombre voulu de news à afficher (LIMIT)  
$sql = 'SELECT auteur, titre, DAY(date) AS jour, MONTH(date) AS mois, YEAR(date) AS annee, HOUR(date) AS heure, MINUTE(date) AS minutes, SECOND(date) AS secondes, image_news, texte_news FROM news ORDER BY date ASC LIMIT 10'; 

// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)  
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  

// on compte le nombre de news stock&eacute;es dans la base de donn&eacute;es  
$nb_news = mysql_num_rows($req);  

if ($nb_news == 0) { 
   echo 'Aucune news enregistr&eacute;e.';  
}
else { 
	// si on a au moins une news, on l'affiche 
	while ($data = mysql_fetch_array($req)) {

    // on affiche les r&eacute;sultats
	echo 
	'<table>
		<tr>
			<td>';
				echo '<img src="' . htmlentities(trim($data['sites/all/images'])) . '" alt="" />';
			echo 
			'</td>
			<td>';
				echo '<br />News de : ' , htmlentities(trim($data['auteur'])) , '<br />'; 
				echo 'Titre : ' , htmlentities(trim($data['titre'])) , '<br />';
				echo 'Post&eacute;e le : ' , $data['jour'] , '/' , $data['mois'] , '/' , $data['annee'] , ' &agrave; ' , $data['heure'] , ':' , $data['minutes'] , ':' , $data['secondes'] , '<br /><br />'; 
				echo 'News : ' , nl2br(htmlentities(trim($data['texte_news']))) , '<br /><br /><br />'; 
			echo '</td>
		</tr>
	</table>';
   }
}
// on lib&egrave;re l'espace m&eacute;moire allou&eacute; à cette requête  
mysql_free_result ($req);  

// on ferme la connexion à la base de donn&eacute;es  
mysql_close ();  
?>
Le formulaire s'affiche mais si je poste la news :

Array ( [image_news] => Array ( [name] => cube2.jpg [type] => image/jpeg [tmp_name] => /var/log/tmp/phpneymct [error] => 0 [size] => 4860 ) ) Upload effectué avec succès !
Warning: Division by zero in /homez.60/imediase/www/insert_news.php on line 63

Warning: Division by zero in /homez.60/imediase/www/insert_news.php on line 63

C'est toujours cette histoire de path j'ai pas du comprendre quels quote mettre ou comment écrire le path

Après la news est enregistrée dans la BDD, s'affiche, et l'image est brisée mais ça a presque marché.

ViPHP
ViPHP | 5462 Messages

08 juin 2010, 14:31

tu fais
$chemin_destination.$_FILES['image_news']['name']

mais apres tu fais
mysql_escape_string($sites/all/images.$_FILES['image_news']['name'])
c'est pas logique ton truc

Eléphant du PHP | 82 Messages

08 juin 2010, 14:39

Je suppose que je dois changer le $chemin_destination en sites/all/images mais avant, comment je dois écrire le sites/all/images ? je mes des simples quotes, ou double quote ?

J'ai essayé avec les deux, mais aussi avec des anti slash ça avait pas l'air de marcher

ViPHP
ViPHP | 5462 Messages

08 juin 2010, 14:46

Je suppose que je dois changer le $chemin_destination en sites/all/images mais avant, comment je dois écrire le sites/all/images ? je mes des simples quotes, ou double quote ?

non l'inverse, ton fichier il est dans $chemin_destination pas dans sites/all/images (sauf si ton $chemin_destination = sites/all/images, mais dans ce cas la autant ecrire juste $chemin_destination)
quand tu developpes ecrir au fur et a mesure a chaque fois tu fais une ligne tu testes, on dirais que t'ecris tout d'un coup et que tu testes que a la fin :wink: