Requête : tout ce qui ne concerne pas...

Mammouth du PHP | 737 Messages

07 janv. 2010, 00:44

Bonsoir et meilleurs voeux à toutes et à tous !!!

J'avais ouvert ce topic fin novembre puis suite au hackage du forum avais mis mon souci en stand by en attendant des jours plus radieux pour tous ;)

Voilà je sais que ce que je cherche à faire est intimement lié au sql mais j'appelle des fonctions PHP donc...

Je cherche désespérément à identifier des enregistrements qui ne sont pas concernés par une requête, tout ce qui ne rentre pas dans un cas de figure.

Mon code est le suivant :
$requete = "DELETE from matable WHERE id_personne = '".$_SESSION["id"]."' AND id_ligne NOT IN ("; 
     foreach ($ligne as $index => $valeur)
          { 
               echo "'".$valeur."',"; 
          } 
     echo "'0');"; //pour boucler la boucle
C'est un traitement tellement tordu que je ne sais pas si c'est ma syntaxe qui ne va pas ou l'algo.

Merci à vous et encore bonne année !

PHPïquement,

Mega
;)
Dyslexics are teople poo

Mammouth du PHP | 568 Messages

07 janv. 2010, 10:31

Hello,

Tu a un problème d'algo.

Lorsque tu fait
foreach ($ligne as $index => $valeur) {
    echo "'".$valeur."',";
}
     
Il y a forcément une virgule de trop à la fin.

Ce que je te conseille de faire, c'est d'une part de vérifier qu'il y a bien des lignes pour ne pas te retrouver avec une syntaxe du type
AND id_ligne NOT IN ()
Ensuite, il te faut supprimer la dernière virgule s'il ya des lignes.

Donc pour résumé, je ferais;
if(count($ligne)) {
		$str_id_ligne = "";
		foreach ($ligne as $index => $valeur) {
			$str_id_ligne .= ($str_id_ligne=="")?$valeur:",".$valeur;
		}
                //un petit echo pour voir ta chaine
		echo $str_id_ligne;
	}
Donc ça, c'est simplement la construction de la chaine, je te laisse l'adapter à ton code et surtout à la création dynamique de te requête.

Eléphant du PHP | 70 Messages

07 janv. 2010, 10:34

Ce n'est pas la virgule de trop qui pose problème vu qu'il ajoute un '0').

Le soucis est le suivant, il créer une variable $requete, puis il veux la complèter, mais au lieu de faire $requete .=, il fais echo.
$requete = "DELETE from matable WHERE id_personne = '".$_SESSION["id"]."' AND id_ligne NOT IN ("; 
     foreach ($ligne as $index => $valeur)
          { 
               $requete.= "'".$valeur."',"; // AND NOT echo "'".$valeur."',"; 
          } 
     $requete. = "'0');"; //pour boucler la boucle
Damien Vande Kerckhove - Developer PHP & .net
Mon blog

Mammouth du PHP | 568 Messages

07 janv. 2010, 12:32

c'est pas faux ^^

Mammouth du PHP | 737 Messages

10 janv. 2010, 00:43

PERFECT, même si c'est pas encore ça (mais c'est pas lié à ça), ça marche mieux :)

MERCI A VOUS 2 !!!

Mega
;)
Dyslexics are teople poo

ViPHP
ViPHP | 4039 Messages

10 janv. 2010, 13:10

Dans ce genre de cas de figure, le plus propre est d'utiliser un implode:
$not_in = array();
foreach ($ligne as $valeur)
          { 
               array_push($not_in,$valeur);
          }

$requete = "DELETE from matable WHERE id_personne = '".$_SESSION["id"]."' AND id_ligne NOT IN ('".implode("','",$not_in)."')"; 
Juste en passant :mrgreen:
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 737 Messages

10 janv. 2010, 21:36

Merci pour ce nouvel apport. Ce bout de code semble fonctionner en effet.

Par contre, j'ai l'impression que mon problème n'a pas de solution grrrrr #-o

Impossible de savoir pourquoi :
}else{
				while($rows4 = mysql_fetch_array($r4)){
					
					$ligne_affectee = $rows4["id"]; //renvoie quelque chose ex : 3
	
					$not_in = array();

					foreach ($ligne_affectee as $valeur){
               			        array_push($not_in,$valeur);
          				}

					$q6 = "DELETE from ma_table WHERE id_personne = '".$_SESSION["id"]."' AND id_ligne NOT IN ('".implode("','",$not_in)."')"; 
					
Ca reste vide entre les () du NOT IN :cry:

Mega
Dyslexics are teople poo

ViPHP
AB
ViPHP | 5818 Messages

10 janv. 2010, 22:17

Merci pour ce nouvel apport. Ce bout de code semble fonctionner en effet.

Par contre, j'ai l'impression que mon problème n'a pas de solution grrrrr #-o

Impossible de savoir pourquoi :
}else{
				while($rows4 = mysql_fetch_array($r4)){
					
					$ligne_affectee = $rows4["id"]; //renvoie quelque chose ex : 3
	
					$not_in = array();

					foreach ($ligne_affectee as $valeur){
               			        array_push($not_in,$valeur);
          				}

					$q6 = "DELETE from ma_table WHERE id_personne = '".$_SESSION["id"]."' AND id_ligne NOT IN ('".implode("','",$not_in)."')"; 
					
Ca reste vide entre les () du NOT IN :cry:

Mega
Faut pas mettre l'initialisation de ton tableau dans la boucle sinon tu le réinitialise (donc tu l'efface) à chaque passage dans la boucle.
Et puis pourquoi ce foreach ?

Mammouth du PHP | 737 Messages

12 janv. 2010, 02:30

Oui AB, tu as raison, c'est tellement tordu que je finis par m'embrouiller...

En gros je dois faire un delta entre des choses cochées et d'autres non cochées. Si l'enregistrement existe, il doit garder ces mêmes valeurs, je ne dois pas l'ajouter puisque déjà présent, mais que dans un cas de figure bref le truc bien chiant ^^.

Pour garder les infos, j'ai créé un tableau temporaire mais le problème c'est que je me base forcément sur des données existantes en base avant suppression et quand je réinjecte mes données, une ligne qui était bonne jadis ne l'est plus forcément sauf qu'elle apparaît. Je sais pas si je suis clair. Je ne vois pas comment faire mon algo #-o

J'pense pourtant plus être très loin. Bizarre, j'ai déjà entendu ça. C'est p'tet parce ce que j'chui persuadé que c'est la bonne à chaque fois :lol:

Mega
;)
Dyslexics are teople poo

Mammouth du PHP | 737 Messages

20 janv. 2010, 15:17

C'est moi qui avait mis résolu ? Car c'est pas le cas :roll:
Dyslexics are teople poo

ViPHP
AB
ViPHP | 5818 Messages

20 janv. 2010, 15:35

Si c'est pas le cas, pour qu'on puisse t'aider il faudrait être plus clair.
Avec simplement du code on ne peut pas t'aider car on ne sait pas si le code est adapté à tes besoins ou non.

Donc pour qu'on puisse te donner des conseils pertinents pour ton algo, il ne faut pas nous écrire des choses "En gros" mais très en détails.
D'ailleurs souvent, ce simple exercice d'écrire (et pas simplement d'y penser) en détails le principe de fonctionnement permet de résoudre beaucoup de pb.

Mammouth du PHP | 737 Messages

05 févr. 2010, 01:32

Bonsoir,

Ok, donc imaginons le cas suivant :
Je fais parti d'un club de foot.
Ce club organise des tournois.
Plusieurs équipes de mon club peuvent se rendre à un tournoi.
Un joueur peut faire parti de plusieurs équipes pour le même tournoi pour aider l'équipe B si nécessaire.
Quand je m'inscris en ligne, il faut que le tout reste cohérent.
J'arrive à gérer pas mal de choses. Le souci est que je dois historiser également les inscriptions donc je peux pas déleter à tout va donc j'ai géré ça en 2 tables. L'autre souci c'est qu'il faut faire le distingo en l'équipe A et l'équipe B.
L'autre hic : si je me désinscris à la dernière minute du tournoi, je dois supprimer les lignes relatives au dit tournoi mais pas le reste.
Par défaut, quand je m'inscris, je dois toujours être dans l'équipe A.
Est-ce plus clair comme énoncé ?

Phpïquement,

Mega
;)
Dyslexics are teople poo