Udapte mysql

Fermé
lionel53480 Messages postés 30 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 6 décembre 2014 - 18 févr. 2012 à 19:31
lionel53480 Messages postés 30 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 6 décembre 2014 - 19 févr. 2012 à 22:32
bonjour,

j'essaye de rentrer un nombre d'une table dans une autre table mais la requete sql ne marche pas

if (isset($_GET['news_id'])) { mysql_query('UPDATE news SET nombre_com = COUNT(commentaire.commentaire) WHERE news_id = "'.$_GET['news_id'].'"'); }

c'est pour compter le nombre de commentaire qu'il y a dans la table de chaque news.
c'est a dire que quand on arrive sur la page de la news 1 le nombre de commentaire se mette a jour
je ne connais presque pas le php,j'utilise dreamweaver et je recherche sur internet pour des trucs un peu plus complexe mais la je n'y arrive pas.
pourquoi cela ne marche pas?
comment faire pour que cela fonctionne?
ou n'y a t'il pas une autre solution?

merci d'avance

8 réponses

Bonsoir,
déjà vous pouvez afficher les erreurs comme ceci:
 mysql_query('   
UPDATE news SET nombre_com COUNT(commentaire.commentaire) WHERE news_id = "'.$_GET['news_id'].'"'   
) or die ("Affichage de l'erreur".mysql_error()); 


Ensuite vous voulez quoi au juste compter ou enregistrer/mettre à jour un nombre dans une table? Ce sont deux opérations différentes.

je ne connais presque pas le php
Pas grave vous tenez le bon bout et c'est SQL qui sert pour les requêtes et non php.

c'est pour compter le nombre de commentaire qu'il y a dans la table de chaque news.
Donc il ne faut pas utiliser UPDATE(en français modifier-littéralement mettre à jour- une ligne dans la table), une simple requête SELECT suffiras.

Voici un lien qui peut vous aider: http://www.google.fr/search?q=sql&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:fr:official&client=firefox-a

Dans wamp vous pouvez tester directement vos requêtes en ouvrant phpMyAdmin et en allant dans l'onglet SQL de votre base (sans avoir à passer par php). Si ça ne marche pas directement dans la base de données, ça ne marchera forcément pas en utilisant php pour envoyer la requête SQL à la base.

e ne connais presque pas le php,j'utilise dreamweaver et je recherche sur internet pour des trucs un peu plus complexe mais la je n'y arrive pas.

Vous n'avez pas cherché au bon endroit, pour débuter c'est un bon site:
http://www.siteduzero.com/tutoriel-3-14668-concevez-votre-site-web-avec-php-et-mysql.html
Vous devriez trouver le même genre de tuto sur Dreamweaver mais je vous conseille de laisser tomber DW. Ce sera plus compliqué et moins facile pour ce que vous voulez faire avec Dreamweaver qu'en partant de votre code, c.à.d un fichier texte vide et sans formatage, enregistré avec l'extension .php

comment faire pour que cela fonctionne?
Pour la requête je ne connais pas les noms de champs et tables mais cela devrait être quelque chose comme ça:

SELECT COUNT(commentaire) FROM table_commentaire WHERE cle_etrangere='valeur';

cle_etrangere étant ce qui vos permet de rattacher un commentaire à chaque news

'valeur' étant l'identifiant de la table news.

cqfd: Un news va être identifié, par exemple par un chiffre.
Un commentaire est relié à la news auquel il se rapporte en recopiant cette valeur dans la table commentaire.
Donc en comptant combien de lignes d'enregistrement de la table où sont stockés ont la valeur d'une news ont obtient le nombre de commentaires.
0
lionel53480 Messages postés 30 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 6 décembre 2014
19 févr. 2012 à 00:28
je veut juste mettre a jour une table.
c'est pour faire un forum,des news , c'est pour compter le nombre de commentaire qu'il y a dans chaque news ou compter le nombre de réponse qu'il y a dans chaque topic d'un forum.

On ne peut pas faire sa avec dreamweaver mais dreamweaver reste pour moi plus simple pour le moment,j'apprendrai le php/mysql/css/html plus tard.J'avais deja essayer avec des requête SELECT mais cela ne fonctionnait pas.

et voila l'erreur que j'obtient :
Affichage de l'erreurYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COUNT(commentaire.commentaire) WHERE news_id = ""' at line 1

merci de m'aider
0
c'est pour faire un forum,des news , c'est pour compter le nombre de commentaire qu'il y a dans chaque news ou compter le nombre de réponse qu'il y a dans chaque topic d'un forum.
J'avais deja essayer avec des requête SELECT mais cela ne fonctionnait pas.


Ce n'est pas ça une mise à jour(donc pas de UPDATE). Pour compter utilisez la requête que je vous ai fournit avec les bons noms de champs.

J'avais deja essayer avec des requête SELECT mais cela ne fonctionnait pas.
C'est que la requête est mal formulée, ensuite vous devez traiter le résultat en php, indiquez la stucture de vos tables et je vous posterait la requête et le php à insérer dans la page.

Dans le message d'erreur:
WHERE news_id = ""'


Il semble que votre variable $_GET['news_id'] soit vide.
Il est très dangereux d'utiliser une variable GET comme ceci, une personne mal intentionné peut très bien obtenir tout le contenu de vos tables(ce qui n'est pas grave dans le cas d'un forum public) , y mettre des erreurs, et aussi effacer vos tables, contenus et structure.

Vous pouvez déjà rajouter dans la condition à côté du isset() !empty() qui va exécuter l'instruction seulement si la varaible à une valeur non vide(le point d'exclamation signifie "non" ou "différent de").

(isset($_GET['news_id']) && !empty($_GET['news_id'])) {
/* vérifie que $_GET['news_id'] existe et est non vide*/
$news_id=mysql_real_escape_string($_GET['news_id']);
 /* création de la variable $news_id qui contient la valeur de $_GET['news_id'] mais avec la fonction mysql_real_escape_string() cette valeur est "échapée" d'une éventuelle requête nuisible*/

/*exécutez votre requête ici en utilisant $news_id comme critère dans la clause WHERE*/

}


Même si Dreamweaver sait faire ça(des doutes quand même) il vous faut connaître le principe sans quoi vous ne penserez pas à sécuriser dans une variable avec mysql_real_escape_string et ne saurez comment obtenir le résultat de la requête, un SELECT plutôt qu'un UPDATE.
0
lionel53480 Messages postés 30 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 6 décembre 2014
19 févr. 2012 à 10:56
Oui dsl mais je n'avais pas poster tous le code de la pagemais ceci est fait,c'est. un parametre d'url?

Et quel est la requete? car j'en ai essyer plusieur mais aucunene marche
0
lionel53480 Messages postés 30 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 6 décembre 2014
19 févr. 2012 à 11:29
voici le code de ma page
https://pastebin.com/Ms0BrPWY
0
SELECT COUNT(commentaire) FROM table_commentaire WHERE cle_etrangere='valeur';

C'est la structure des tables(les champs) qu'il faut pour la requête(et ainsi mettre les bons noms de champs), à partir de php il faut utiliser mysql_fetch_row pour obtenir la valeur qui est comptée à partir de ce que renvoie la requête(une ressource inexploitable sans ça).
0
lionel53480 Messages postés 30 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 6 décembre 2014
19 févr. 2012 à 13:41
voici mes 2 tables :
table commentaire :
'id' int(255) NOT NULL AUTO_INCREMENT,
'commentaire' varchar(255) NOT NULL,
'auteur' varchar(50) NOT NULL,
'news' int(255) NOT NULL,
'etat' tinyint(1) NOT NULL DEFAULT '1',

table des news
'news_id' int(11) NOT NULL AUTO_INCREMENT,
'news_titre' varchar(255) NOT NULL,
'news_news' varchar(255) NOT NULL,
'news_auteur' varchar(255) NOT NULL,
'news_categori' int(255) NOT NULL,
'etat' tinyint(1) NOT NULL DEFAULT '1',
'date' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
'nombre_com' int(255) NOT NULL,

je devrais faire sa? :
SELECT COUNT(commentaire),news FROM commentaire,news WHERE COUNT(commentaire.commentaire)='nombre_com'

j'ai essayer plusieurs requête mais aucune ne marche :(

je veut que le nombre de commentaire sois mis dans nombre_com dans la table news
exemple :
news1 a 8 commentaire
news2 a 1 commentaire
news3 a 4 commentaire
ect.......

merci de ton aide mais sa ne marche pas
0

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

Posez votre question
Plop,

LA BASE DE DONNEES

Plutôt mal faite ces tables ça aide pas, surtout que c'est la partie la plus importante. Le développement et les risques d'erreur se retrouvent multipliés.

Mais normal quand on utilise pas l'analyse Merise. Si c'est un forum il y a plus de chance que news et n'importe quel sujet ou n'importe quel commentaire aient tout en commun(un titre, un message, un auteur...).
Il faut les réunir dans une seule table quitte à ajouter un champ type qui va indiquer si le message est une news, une réponse ou le premier message d'un fil de discussion(et encore en utilisant la date le sujet est forcément celui qui a la première date(et heure) pour un fil de discussion).

Dans notre cas présent on voit que le risque d'erreur, la complexité inutile et la nécessité d'avoir des contraintes est multiplié par le seul fait qu'il y ait le champ nombre_comm:

C'est une information qui est déjà dans les tables, donc il est inutile.
Comment obtenir le nombre de commentaires?
Le nombre de commentaires pour une news est exactement le nombre de ligne dans la table commentaire pour chaque news. Chaque news dans la table commentaire est identifié par le champ news.

La requête compteras les commentaires de chaque news:
SELECT COUNT(id) FROM commentaire WHERE news="identifiant de la news"
En français ça se traduit par : compte les lignes de la table commetaire où la valeur de la news est identique à celle de la news concennée.

La requête comptant les commentaires de toutes les news:
SELECT COUNT(id) FROM commentaire

L'identifiant de la news(news) est la valeur de news_id reportée sur la table commentaire.

Je vous invite à refaire l'analyse de vos tables pour un développement plus propre et ainsi y perdre moins de temps, votre système d'information n'est pas bon et devra être refait tôt ou tard si vous voulez quelque chose de fiable.
Voici une version simplifié de l'analyse d'un système d'informations:
http://www.commentcamarche.net/contents/merise/mcd.php3

Toujours pour l'exemple que vous avez donné le champ nombre_com sur la table news, il est qui plus est obligatoire(NOT NULL). Ce qui signifie qu'à chaque fois qu'un commentaire est ajouté (requête) il faut incrémenter(ajouter 1). En plus d'ajouter du développement inutile(puisque le nombre de commentaire est déjà contenu dans les tables) c'est un risque d'erreur et un temps de traitement supplémentaire. Bien inutile donc. Supprimez ce champ qui ne sert à rien à part vous compliquer la tâche et ralentir l'exécution du programme.


En message suivant je met le développement à intégrer à vos pages.
0
TRAITEMENT avec php

La requête comptes les commentaires de chaque news:
SELECT COUNT(id) FROM commentaire WHERE news="identifiant de la news"


// je part du principe que l'identifiant de la table news est fournit:  
// soit $news_id contenant bien la valeur de la news concernée  

//-- la connexion au serveur doit bien sûr être établie, sinon pas de requête  

/* --  effectue la requête et retourne son résultat(ressource) dans la variable $reponse*/  
$reponse=mysql_query("SELECT COUNT(*) FROM commentaire WHERE news=".$news_id)  
or die("erreur lors du compte des commentaires de".$news_id.mysql_error()) ; 
//--- récupère le compte, ce qui nous intéresse: la valeur du COUNT  
//-fetch_row retournes les colonnes du curseur dans un tableau php  
$compte=mysql_fetch_row($reponse);  


echo $compte[0];  
/* afficheras le compte du nombre de commentéaires pour l'actu identifié par $news_id */


Sans les commentaires:

$reponse=mysql_query("SELECT COUNT(*) FROM commentaire WHERE news=".$news_id) or die("erreur lors du compte des commentaires de ".$news_id.mysql_error()) ;
$compte=mysql_fetch_row($reponse);

echo $compte[0];
0
COUNT comptant le nombre de lignes et non les champs on peut utiliser invariablement SELECT COUNT(*) ou SELECT COUNT(id)
0
Si vous voulez quand même garder votre champ 'nombre_com' int(255) NOT NULL, qui est calculable comme on vient de voir il faudra à chaque fois qu'un commentaire est ajouté/supprimer modifier ce champ dans la table.
Comme ceci:
mysql_query("UPDATE news SET nombre_comm=".$compte[0]." WHERE news_id=".$news_id) or die("Une erreur s'est produite et toutes vos tables sont fausses, vous pouvez jeter tout le programme!!!!!!!!!!! ".mysql_error());




Supprimez le tout court hein^^
0
lionel53480 Messages postés 30 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 6 décembre 2014
19 févr. 2012 à 17:00
dac j'essaye sa
et comment savoir si son site est vulnérable au attaque(injection sql,cross site scripting...)?
0
Encore une fois je ne peut que vous conseiller d'aller voir le cours du site du zéro, s'adressant au débutant.
http://www.siteduzero.com/tutoriel-3-14668-concevez-votre-site-web-avec-php-et-mysql.html

Pour protéger les variables POST et GET d l'injection mysql vous pouvez utiliser la fonction mysql_real_escape_string() lors de l'attribution de cette variable et avant exécution de la requête.

$news_id=mysql_real_escape_string($_POST[news_id']);

Comme toute technologie quand on sait pas on regarde la notice; La notice c'est le manuel de php:
http://php.net/manual/fr/function.mysql-real-escape-string.php


Bon courage, si vous avez décidé de faire les choses vous même vous aurez quelque chose qui ne peut être enlevé: un savoir.
0
lionel53480 Messages postés 30 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 6 décembre 2014
19 févr. 2012 à 17:29
merci de ton aide ,
j'ai réussi ce que je voulais faire

et quand j'ai sa
if (isset($_GET['news_id']))
je fait comment pour mettre sa mysql_real_escape_string ?
0
if (isset($_GET['news_id']) && !empty($_GET['news_id'])){
// --si $_GET['news_id'] est bien définie(isset) et n'est pas vide(!empty)
$news_id=mysql_real_escape_string($_POST[news_id']);
} else{
// sinon on arretes le script
exit();

}

Bon la prochaine question je prépare le devis ? :p
0
lionel53480 Messages postés 30 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 6 décembre 2014
19 févr. 2012 à 22:32
c'est bizarre . pourquoi dis tu qu'il y a des risque d'injection.
J'ai cherché sur internet mais je n'ai jamais d'erreur.
y a t-il des logiciel pour tester son site?
et pourquoi n'ai je pas d'erreur?

j'ai essayer
http://localhost/toast/newsEN.php?news_id=14'
http://localhost/toast/newsEN.php?news_id='14
http://localhost/toast/newsEN.php?news_id=- 14
0