8797 sujets
Salut,
eh bien oui c'est possible. Cela pourrait donner par exemple :
eh bien oui c'est possible. Cela pourrait donner par exemple :
<?php
$host = "localhost";
$user = "root";
$passwd = "";
$database = "test";
// Connexion au serveur
$link = mysql_connect($host, $user,$passwd);
if (!$link) {
die('Erreur de connexion au serveur. Merci de contacter johndoe@fai.com si le problème persiste');
}
// Connexion à la base
$db_selected = mysql_select_db($database, $link);
if (!$db_selected) {
die ('Erreur de connexion à la base de données. Merci de contacter johndoe@fai.com si le problème persiste');
}
$sql = 'Update matable set champ1 = champ1 + 1 where id = 33';
mysql_query($sql);
?>
Pour la liste des fonctions PHP voir http://fr.php.net/manual/fr/book.mysql.php Ok, j'explique rapidement.
j'ai fait une système messagerie. Une page qui affiche les messages reçus. Quand on clique sur un message nous sommes envoyés ( en récupérant l'id du message via GET ) vers une page (lire.php + paramètres) qui affiche le message en question.
Dans ma table "messages" j'ai un champs "read" qui contient par défaut la valeur "0" qui correspond à message non lu. J'aimerais qu'au chargement de ma page lire.php ma requête UPDATE fonctionne mais pas moyen. Cette requête doit changer la valeur "0" en "1" qui correspond à un message lu.
Voici mon code pour la page lire.php
j'ai fait une système messagerie. Une page qui affiche les messages reçus. Quand on clique sur un message nous sommes envoyés ( en récupérant l'id du message via GET ) vers une page (lire.php + paramètres) qui affiche le message en question.
Dans ma table "messages" j'ai un champs "read" qui contient par défaut la valeur "0" qui correspond à message non lu. J'aimerais qu'au chargement de ma page lire.php ma requête UPDATE fonctionne mais pas moyen. Cette requête doit changer la valeur "0" en "1" qui correspond à un message lu.
Voici mon code pour la page lire.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>PHP / SQL</title>
</head>
<body>
<?php
// ----- Connexion SQL ----- //
$dbhost = "localhost";
$dbname = "php";
$dbuser = "root";
$dbpass = "";
$mysql = mysql_pconnect($dbhost, $dbuser, $dbpass);
if(!$mysql) {
echo 'erreur !';
exit;
}
$mysql = mysql_select_db($dbname);
if(!$mysql) {
echo 'erreur !';
exit;
}
$readMessage = mysql_query("select * from messages where idTo = '".$id."' and idMessage = '".$_GET['idMessage']."'");
while ($row = mysql_fetch_array($readMessage)) {
$idMessage = $row['idMessage'];
$idTo = $row['idTo'];
$message = $row['message'];
// ------ Requête SQL pour passer la valeur 0 en 1 ----- //
$sql = "update messages set read = 1 where idMessage = '".$idMessage."'";
mysql_query($sql);
$read = $row['read'];
echo $idMessage;
echo $idFrom;
echo $idTo;
echo $message;
}
?>
</body>
</html>
Comment est alimentée la variable $id ?
Et accessoirement es-tu sûr d'avoir besoin d'une connexion persistante ?
Et accessoirement es-tu sûr d'avoir besoin d'une connexion persistante ?
Non effectivement pour la variable persistante, c'est juste pour mes essais.
Quand tu parles de la variable $id tu veux dire la variable $idMessage ou $itTo ?
Elles sont alimentées par :
Ce lien est cliqué sur la page ou sont listés tous les messages reçus.
Les variables contenus dans le liens sont alimentées par ma table "messages".
Modifié par Remay (07 Jun 2009 - 23:41)
Quand tu parles de la variable $id tu veux dire la variable $idMessage ou $itTo ?
Elles sont alimentées par :
<a href="lire.php?idMessage='.$idMessage.'&idTo='.$idTo.'">
Ce lien est cliqué sur la page ou sont listés tous les messages reçus.
Les variables contenus dans le liens sont alimentées par ma table "messages".
Modifié par Remay (07 Jun 2009 - 23:41)
Arf ! C'est plus facile avec tout le code.
Sinon c'est simple : il suffit de debugger.
Par exemple en rajoutant or die(mysql_error()) après les mysql_query, en affichant les variables avant d'exécuter les requêtes, etc...
Edit: d'ailleurs il n'est pas trop tard pour montrer tout le code. Par exemple est-ce qu'il commence bien par session_start(); ?
Modifié par Heyoan (07 Jun 2009 - 23:52)

Sinon c'est simple : il suffit de debugger.
Par exemple en rajoutant or die(mysql_error()) après les mysql_query, en affichant les variables avant d'exécuter les requêtes, etc...
Edit: d'ailleurs il n'est pas trop tard pour montrer tout le code. Par exemple est-ce qu'il commence bien par session_start(); ?
Modifié par Heyoan (07 Jun 2009 - 23:52)
<?php
include 'sql.php';
if (!isset($_SESSION['session'])) {
header('Location: index.php');
}
$id = $_SESSION['id'];
if (isset($_GET['idMessage']) && isset($_GET['idTo'])) {
if (empty($_GET['idMessage']) || empty($_GET['idTo']) || ($_GET['idTo'] != $id)) {
header('Location: page3.php');
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>PHP / SQL</title>
</head>
<body>
<?php
$readMessage = mysql_query("select * from messages where idTo = '".$id."' and idMessage = '".$_GET['idMessage']."'");
while ($row = mysql_fetch_array($readMessage)) {
$idMessage = $row['idMessage'];
$idTo = $row['idTo'];
$message = $row['message'];
// ------ Requête SQL pour passer la valeur 0 en 1 ----- //
$sql = "update messages set read = 1 where idMessage = '".$idMessage."'";
mysql_query($sql);
$read = $row['read'];
echo $idMessage;
echo $idFrom;
echo $idTo;
echo $message;
}
?>
</body>
</html>
J'obtiens cette erreur sur l'UPDATE :
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 'read = 1 where idMessage = '36'' at line 1
Dand sql.php il y a les infos de connexions à la BDD (les mêmes que plus haut). avec en plus effectivement
<?php session_start();
?>
Modifié par Remay (08 Jun 2009 - 00:12)
Déjà il faudrait remplacer
Et en passant c'est une bonne habitude de préciser la langue utilisée dans le document : <html lang="fr">
if (isset($_GET['idMessage']) && isset($_GET['idTo'])) {
if (empty($_GET['idMessage']) || empty($_GET['idTo']) || ($_GET['idTo'] != $id)) {
header('Location: page3.php');
}
}
parif (isset($_GET['idMessage']) && isset($_GET['idTo'])) {
if (empty($_GET['idMessage']) || empty($_GET['idTo']) || ($_GET['idTo'] != $id)) {
header('Location: page3.php');
}
} else {
header('Location: page3.php');
}
Pour ton problème je n'avais pas fait gaffe mais tu as utilisé un des mots réservés MySQL pour ton champ read. Le plus simple serait de le renommer.Et en passant c'est une bonne habitude de préciser la langue utilisée dans le document : <html lang="fr">
Salut,
Et si tu ne souhaites pas renommer ton champ (ou impossibilité pour des raisons quelconques), tu peux utiliser les délimiteurs pour encadrer le nom de ton champ :
De manière générale, c'est une bonne habitude à prendre que de les utiliser. En effet, d'une version MySQL à une autre, on ne peut pas prévoir quel mot deviendra mot réservé, donc utiliser les délimiteurs permet d'éviter qu'un nom de champ ou de table qui devient mot réservé dans une version ultérieure (màj des versions de ton hébergeur en mutualisé par exemple) ne génère des erreurs SQL.
Et si tu ne souhaites pas renommer ton champ (ou impossibilité pour des raisons quelconques), tu peux utiliser les délimiteurs pour encadrer le nom de ton champ :
`read`
De manière générale, c'est une bonne habitude à prendre que de les utiliser. En effet, d'une version MySQL à une autre, on ne peut pas prévoir quel mot deviendra mot réservé, donc utiliser les délimiteurs permet d'éviter qu'un nom de champ ou de table qui devient mot réservé dans une version ultérieure (màj des versions de ton hébergeur en mutualisé par exemple) ne génère des erreurs SQL.
Ah merci beaucoup, effectivement c'était bien l'utilisation du "read" dans mySQL qui posé problème. Tout fonctionne bien maintenant.
J'ai une autre question d'ordre plus pratique :
- prenons deux utilisateurs A et B.
- A envoi un message à B,
- B lit le message puis le supprime,
- Problème : si B supprime le message il disparait également des messages envoyés de A.
Une solution ? (j'ai pensé à doubler les champs de ma table, mais il doit y avoir plus astucieux).
J'ai une autre question d'ordre plus pratique :
- prenons deux utilisateurs A et B.
- A envoi un message à B,
- B lit le message puis le supprime,
- Problème : si B supprime le message il disparait également des messages envoyés de A.
Une solution ? (j'ai pensé à doubler les champs de ma table, mais il doit y avoir plus astucieux).