Aide sur multi requêtes

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Aide sur multi requêtes

Re: Aide sur multi requêtes

par Fre3z69 » 15 mars 2012, 08:26

Oui c'est vrai qu'il faut que je comprenne mieux le sql.

Mais le problème ne venait pas des tables ou des clefs étrangères.

En fait, ça venait du fait que j'ai instruit la demande d'uptade dans la condition que j'ai mise, à savoir si on à une catégorie (enfin qu'elle existe)

Vu que j'ai effacé la catégorie, forcement je répondait plus à cela, donc je suis sortis de la condition.

J'ai fait une redirection en fait, pour m’assurer que je récupère l'ordre de la catégorie préalablement effacée.

Ainsi j'ai pallier d'une manière à ce problème.

De toute manière c'est pas tout les jours qu'on efface des catégories ^^, ce qui me laisse le temps de me perfectionner un peux en sql, et de revenir plus tard sur le scipt afin d'optimiser tout cela ^^

Enfin, c'est pas évident de toujours tout comprendre, et je prend mon temps pour assimiler correctement les choses.

Ca fait même pas 2 semaines que je me rend compte de l’intérêt du sql, et de faire correctement les tables, leurs relations et les requêtes.

En fin je finirais un jours par y arrivé ^^, après tout, même en sql j'ai pas mal progresser, je comment à mieux structurer mes bases.

Merci en tout cas pour toute l'aide apportée.

Et pour info, j'ai déjà lu ce tuto, et je continu à le lire, il apporte pas mal d'éclaircissements, mais je suis le genre de personne à préférer apprendre oralement, la lecture me laisse souvent perplexe, et de plus c'est pas mon fort ^^

Cordialement

Re: Aide sur multi requêtes

par moogli » 15 mars 2012, 07:38

Système de Gestion de Bases de Données la plus part ajoute un R pour relationnel.

Et justement ce relationnel te manque dans tes connaissances les contrainte de clefs étrangères peuvent en transparents ce que tu fait avec tes multiples requêtes.

Ajouté à cela les procédures stockées et les udf (user define fonction, enfin les fonctions utilisateurs quoi) tu a un langage complet.

Je te conseil de mettre php en stand by pour un peu de lecture sur http://sqlpro.developpez.com pour en apprendre plus sur SQL. La modélisation de la base est aussi importante que celle du code ou de l'ergonomie de l'interface.

@+

Re: Aide sur multi requêtes

par Fre3z69 » 14 mars 2012, 21:46

J'ai séparé les requête, en fessant une redirection.

Je supprime dans un premier temps, puis je redirige vers une page qui se charge de trouver et updater toutes les catégories dont l'order est supérieur à celui de la catégorie effacée.

Cela me semble plus fonctionnel, puisque je récupère bien les bonnes valeurs, et que ça update sans soucis les catégories.

Merci de votre aide

Cordialement

Re: Aide sur multi requêtes

par Fre3z69 » 14 mars 2012, 19:56

Eu, j’exécute simplement les update ou les delete dans les while, j'ai pas trop le choix, si je veux supprimer toutes les données correspondant à la clause définit dans la requête bouclée.

Je sais pas utiliser les requêtes préparé, mais si je comprend bien, en haut de mon fichier, je met toutes les préparations, et dans les while, j’exécute c'est ça?

J'ai enlever les close en dessous des update et delete, ça fonctionne bien, sauf cette requête
			$query = $cnx->prepare('
			SELECT 
			 cat_id,
			 cat_order
			FROM t_cat
			WHERE cat_order > :catorder');
			$query->bindValue(':catorder', $catorder,PDO::PARAM_INT);
			$query->execute();
			while ($datao = $query->fetch())
			{
				$majorder = $datao['cat_order']-1;
				$ocatid = $datao['cat_id'];
				// on leur soustrait -1
				$order=$cnx->prepare('UPDATE t_cat SET cat_order = :majorder WHERE cat_id = :ocatid');
				$order->bindValue(':ocatid',$ocatid,PDO::PARAM_INT);
				$order->bindValue(':majorder',$majorder,PDO::PARAM_INT);
				$order->execute();
			}
rappel moi ce que signifie SGBD, j'ai un trou de mémoire Oo

Merci de ton (votre) aide

Cordialement

Re: Aide sur multi requêtes

par moogli » 14 mars 2012, 18:58

Le code est trop long pour que je regarde tout.
- as tu regarder la doc du rowcount d'un PDOStatement ? C'est méthode n'est pas sûre lorsque l'on utilise un select (et la doc n'indique pas sur quels sgbd cela fonctionne :/).
- Tu fait des requêtes dans une boucle ce n'est pas bon. Il y a forcément une autre solution (requête mieux ficelée, procédure stockée etc). Enfin la tu utilise presque bien la requête préparée pour le delete ;) le prépare est à faire en dehors de la boucle. C'est à cela que sert une requête préparée a être exécutée plein de fois sans redefinir la requête. Donc le prépare en dehors de la boucle while et le bondValue + execute reste dedans.

- tu fait des closeCursor() juste après l'exécute (d'ailleurs tu ne recupere pas les infos O_o) c'est pas bon tu ne peux pas l'utiliser ainsi. De plus le closeCursor() permet de fermer un curseur (si si ;) ) et un curseur ce n'est ni plus ni moins qu'un jeux de résultats, c'est le retour d'un select. Donc à virer après les update.


Pourquoi boucler ?
Connais tu les contraintes de clef étrangères qui peuvent t'epargner tout ce travail ? Au d'ailleurs devrait être sur le SGBD et non en php ! Pourquoi ?
Parce que c'est pour, ça ira plus vite etc etc ;)

@+

Aide sur multi requêtes

par Fre3z69 » 14 mars 2012, 17:58

Salut à vous

J'ai un soucis tout bête

je suis entrain de faire la partie administrative de mon forum (enfin poffiner et régler certains détails), et je m'attaque à la partie gestion des catégories.

Pour effacer une catégorie entière il faut pour cela, effacer les postes, les topics, les forums (liè à la catégorie) et la catégories elel même.
Ensuite, il faut attribuer un nouveau ordre pour les éventuelles catégories étant en dessous, afin de les replacer correctement (ne pose pas de problem dans le forum lui même, en revanche sur le panel d'admin, là où il y a les flèches pour déplacer les catégories, oui. (voir ici pour plus d'infos.)

Voici donc ce que j'ai fait, mais je ne sais pas pourquoi, rien de fonctionne, alors que toutes mes requêtes sont testée via phpmyadmin et fonctionnelles.
<?php
// si il s'agit d'une catégorie
if ($_GET['cat_id']){
// on s'assure qu'on a pas cliquer sur le bouton par erreur
	if (isset($_GET['action']) && $_GET['action']=='oui')
	{
		$cat_id = $_GET['cat_id'];
		// on séléctionne tout les forums, les topics et les postes liés à la catégorie
		$query = $cnx->prepare('
		SELECT 
		 cat_id
		FROM t_cat
		WHERE cat_id = :catid');
		$query->bindValue(':catid',(int) $cat_id,PDO::PARAM_INT);
		$query->execute();
		if ($query->rowCount()>0){
			// on boucle et on supprime les postes, les topics, les forum et la catégorie
			$datai = $query->fetch();
			$catid = $datai['cat_id'];
			$catorder = $data['cat_order'];
			
			$query = $cnx->prepare('
			SELECT 
			 cat_id,
			 cat_order
			FROM t_cat
			WHERE cat_order > :catorder');
			$query->bindValue(':catorder',(int) $catorder,PDO::PARAM_INT);
			$query->execute();
			$query->CloseCursor();
			while ($datao = $query->fetch())
			{
				$majorder = $datao['cat_order']-1;
				$ocatid = $datao['cat_id'];
				// on leur soustrait -1
				$query=$cnx->prepare('UPDATE t_cat SET cat_order = :majorder WHERE cat_id = :ocatid');
				$query->bindValue(':ocatid',$ocatid,PDO::PARAM_INT);
				$query->bindValue(':majorder',$majorder,PDO::PARAM_INT);
				$query->execute();
				$query->CloseCursor();
			}
			
			// on séléctionne tout les forums, les topics et les postes liés à la catégorie
			$query = $cnx->prepare('
			SELECT 
			 t_cat.cat_id,
			 t_forum.forum_id,
			 t_topic.topic_id,
			 t_post.post_id
			FROM t_cat
			LEFT OUTER JOIN t_forum
				ON t_cat.cat_id = t_forum.cat_id
			LEFT OUTER JOIN t_topic
				ON t_forum.forum_id = t_topic.forum_id
			LEFT OUTER JOIN t_post
				ON t_post.topic_id = t_topic.topic_id
			WHERE t_cat.cat_id = :catid');
			$query->bindValue(':catid',(int) $catid,PDO::PARAM_INT);
			$query->execute();
			$query->CloseCursor();
			
			// on boucle et on supprime les postes, topics, forum et la catégorie
			while ($data = $query->fetch())
			{
				$postid = $data['post_id'];
				$topicid = $data['topic_id'];
				$forumid = $data['forum_id'];
				if (!empty($postid)) {
					// on supprime tout les postes contenu dans les topics apartenants aux forums, qui sont liés à la catégorie
					$query=$cnx->prepare('DELETE FROM t_post WHERE post_id = :postid');
					$query->bindValue(':postid', $postid,PDO::PARAM_INT);
					$query->execute();
					$query->CloseCursor();
				}
				
				if (!empty($topicid)) {
					// on supprime tout les topics apartenants au forum, qui sont liés à la catégorie
					$query=$cnx->prepare('DELETE FROM t_topic WHERE topic_id = :topicid');
					$query->bindValue(':topicid',(int) $topicid,PDO::PARAM_INT);
					$query->execute();
					$query->CloseCursor();
				}
				
				if (!empty($topicid)) {
					// on supprime toutes les données concernant t_topic_view, liès à la catégorie par les topics
					$query=$cnx->prepare('DELETE FROM t_topic_view WHERE topic_id = :topicid ');
					$query->bindValue(':topicid', $topicid,PDO::PARAM_INT);
					$query->execute();
					$query->CloseCursor();
				}
				
				if (!empty($forumid)) {
					// on supprime tout les forum liès à la catégorie
					$query=$cnx->prepare('DELETE FROM t_forum WHERE cat_id = :catid');
					$query->bindValue(':catid',(int) $catid,PDO::PARAM_INT);
					$query->execute();
					$query->CloseCursor();
				}
				
				if (!empty($catid)) {
					// on suprime la catégorie
					$query=$cnx->prepare('DELETE FROM t_cat WHERE cat_id = :catid ');
					$query->bindValue(':catid', $catid,PDO::PARAM_INT);
					$query->execute();
					$query->CloseCursor();
				}
			}
			// on renvoie en arrière
			header('Location: '.SITE_ADRESSE.'admin/index.php?r=forum');
		}
		$query->CloseCursor();
	}
	else
	{
		alerte('Êtes-vous sûr de vouloir supprimer cette catégorie ?');
		echo '<p>Attention toutte fois, supprimer une catégorie, supprimera les postes, topics et forums liès à cette dernière!</p>
		<p><a href="'.SITE_ADRESSE.'admin/index.php?r=forum&mode=supp&cat_id='.$_GET['cat_id'].'&action=oui">oui</a> - <a href="'.SITE_ADRESSE.'admin/index.php?r=forum">non</a></p>';
	}
}
// si il s'agit d'un forum
if (isset($_GET['forum_id'])){

}
?>
Pouvez vous m'aider à déterminer le pourquoi du comment svp?

Merci de votre aide

Cordialement