8797 sujets

Développement web côté serveur, CMS

Bonsoir à tous,

Je cherche à lancer une requête SQL "UPDATE" au chargement d'une page.
En fait je voudrais savoir si c'est possible ?

J'ai essayer de regarder du côté de fonctions PHP mais je vois pas trop pour l'instant.
Merci d'avance pour vos réponses.
Modifié par Remay (08 Jun 2009 - 17:48)
Salut,

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 merci, donc mon problème ne doit pas venir de là.
Est ce que la requête UPDATE pourrait poser problème dans un While ?
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


<!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>
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 :

<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)
Non je parle de $id dans
$readMessage =  mysql_query("select * from messages 
where idTo = '".[b]$id[/b]."' and idMessage = '".$_GET['idMessage']."'"); 
qui, si elle n'est alimentée nulle part est certainement à l'origine du problème.
Modifié par Heyoan (07 Jun 2009 - 23:44)
Ah ok désolé (la fatigue Smiley cligne ).
$id est bien alimenté par :

$id = $_SESSION['id'];


J'avais oublié de le mettre dans mon code au dessus.
Le problème ne viens pas de là, au niveau de mes sessions j'ai aucun soucis à priori.

Merci pour ton aide en tout cas.
Arf ! C'est plus facile avec tout le code. Smiley lol

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
if (isset($_GET['idMessage']) && isset($_GET['idTo'])) {
	if (empty($_GET['idMessage']) || empty($_GET['idTo']) || ($_GET['idTo'] != $id)) { 
		header('Location: page3.php');
	}
}
par
if (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 :

`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).
Re',

ben il suffit d'avoir 2 champs distincts : deleted_by_to et deleted_by_from. Il ne s'agit donc plus d'une suppression physique de l'enregistrement mais d'un flag (tu peux éventuellement supprimer physiquement l'enregistrement si les 2 flags sont à ON.
Modifié par Heyoan (08 Jun 2009 - 14:45)