Probleme de unserialize mise a jour de donnée serialize

Eléphanteau du PHP | 45 Messages

22 sept. 2011, 01:51

Bonjour, j'ai un problème avec ce morceau de code. Je voudrais effacer la valeur obtenue par ($_GET["del"])) dans le champs friends de la ligne uid (uid correspondant à la session de l'identifiant de de l'utilisateur) de ma base de donnée qui comporte plusieurs colonne dont uid et friends. mais je ne comprends pas tres bien la boucle foreach avec les données serializés, je voudrais effacer de la table la valeur obtenue par ($_GET["del"]) dans le champ friends de la ligne uid
  if(isset($_GET["del"])) {

$friend_No=($_GET["del"]);
        $query ="SELECT friends FROM users WHERE uid=$uid" ;
        $result=mysql_query($query)or die(mysql_error());      
        while($row = mysql_fetch_array($result)){
        $friend_No = unserialize($row["friends"]);

                   foreach($friend_No as $friend_Nos => $friend_Nos_value)
               {

if($friend_No == $friend_Nos_value)
                 {
                                $friend_No[] = $friend_Nos_value;
                              $query2 ="DELETE FROM users WHERE uid=$uid AND friends=$friend_Nos_value";
                                $result2=mysql_query($query2)or die(mysql_error());    
                   }      
               }                      
       }
}

ViPHP
AB
ViPHP | 5818 Messages

22 sept. 2011, 03:05

Utilises les balises php qu'on y voit un peu quelque chose !!!

Tu le sort d'où ce code ?

En première ligne tu écris
$friend_No=($_GET["del"]);
puis ensuite
$friend_No = unserialize($row["friends"]);
donc la dernière variable définie écrase la première... Faudrait un peu de logique dans ton code.

Quand tu écris
foreach($friend_No as $friend_Nos => $friend_Nos_value)
{

if($friend_No == $friend_Nos_value)
tu comprends ce que tu fais ?

Regardes comment on peut lister un tableau

Au passage tu crois vraiment que ce sujet à sa place dans php avancé ?

Eléphanteau du PHP | 45 Messages

22 sept. 2011, 10:22

Alors tu a une réponse à ma question? je trouve toujours pas.

ViPHP
ViPHP | 2577 Messages

22 sept. 2011, 10:58

Alors tu a une réponse à ma question? je trouve toujours pas.
Il faudrait peut être que tu prennes en compte les premières remarques.

Sur le principe :
1) transformer la chaine de caractères en tableau (ce que tu fais)
2) supprimer du tableau l'élément à supprimer (ce que tu ne fais pas)
3) remettre le tableau sous forme de chaine de caractères (ce que tu ne fais pas)
4) mettre à jour la base de données et non pas supprimer un enregistrement

Eléphanteau du PHP | 45 Messages

22 sept. 2011, 11:41

Si tu te sent écris moi le même type de code et qui marche, car le miens ne fonctionne pas. Comment on fait pour supprimer un élément du tableau?

Eléphanteau du PHP | 45 Messages

22 sept. 2011, 12:39

J'ai modifié le code et ça marche mais pas tout a fait. au lieu de m'effacer l'enregistrement du tableau, il m'ajoute le même enregistrement, comment faire pour effacer cet enregistrement.
if(isset($_GET["del"])) {

$friend_No=($_GET["del"]);
$array_No=($_GET["del"]);
        $query ="SELECT friends FROM users WHERE uid=$uid" ;
        $result=mysql_query($query)or die(mysql_error());      
        while($row = mysql_fetch_array($result)){
        $friend_No = unserialize($row["friends"]);

                   foreach($friend_No as $key => $friend_Nos_value)
              {
     echo "Clé :" .$key. " Valeur : ".$friend_Nos_value."<br />\n";

if($friend_No == $array_No)  {
                                $friend_No[] = $friend_Nos_value;
        $friend_Noq = serialize($friend_No);
						$query2 ="UPDATE users SET friends = '".$friend_Noq."' WHERE uid = $uid" ;
  //                         $query2 ="DELETE FROM users WHERE uid=$uid AND friends=$friend_Nos_value";
                                $result2=mysql_query($query2)or die(mysql_error());    
              }      
          }                      
     }
}

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 sept. 2011, 12:57

Modération :
Zebu, merci d'utiliser les balises [php] quand tu postes du code PHP pour que ça soit lisible (plus de détails ici)

Si tu ne tiens pas compte de cet avertissement, le sujet pourrait être fermé
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 2577 Messages

22 sept. 2011, 16:08

      $friend_old = unserialize($row["friends"]);  
      $friend_New = array();
      foreach($friend_old as $key => $value)       
      {
             echo "Clé :" .$key. " Valeur : ".$value."<br />\n";
             if($value <> $array_No)  
             {
                   $friend_New[] = $value;
             }
      }
      $friends = serialize($friend_New);
      $query2 ="UPDATE users SET friends = '".$friends."' WHERE uid = $uid" ;
      $result2=mysql_query($query2)or die(mysql_error());    

ViPHP
AB
ViPHP | 5818 Messages

22 sept. 2011, 16:16

Pour visualiser rapidement un tableau durant le développement tu peux faire :
echo '<pre>';
print_r($mon_tableau);
echo '</pre>';
Quand tu fais :
foreach($friend_No as $key => $friend_Nos_value)
{
if($friend_No == $array_No)
tu compare un tableau à une variable (c'est comme comparer un tiroir à un document) or il faudrait comparer les valeurs du tableau à cette variable :
foreach($friend_No as $key => $friend_Nos_value)
{
if($array_No == $friend_Nos_value)

Eléphanteau du PHP | 45 Messages

22 sept. 2011, 18:18

Ton code marche bien merci beaucoup, ça me fais gagner du temps pour le développement du reste du site Internet. C'est la première fois que je travail avec la sérialisation. Tu es un expert, tu me rend un grand service pour ce morceau de code.
Salut

Eléphanteau du PHP | 45 Messages

22 sept. 2011, 18:27

Voiçi le code complet correspondant à ce morceau de code qui est un systeme de suppression d'ami de la friendlist du site Internet.
  if(isset($_GET["del"])) {

$array_No=($_GET["del"]);
      $query ="SELECT friends FROM users WHERE uid=$uid" ;
      $result1=mysql_query($query)or die(mysql_error());      
      while($row = mysql_fetch_array($result1)){
      $friend_No = unserialize($row["friends"]);
                   foreach($friend_No as $friend_No => $friend_Nos_value)
              {
     	echo "Clé :" .$friend_No. " Valeur : ".$friend_Nos_value."<br />\n";

		if($array_No == $friend_Nos_value)  {
      $friend_old = unserialize($row["friends"]);  
      $friend_New = array();
      foreach($friend_old as $key => $value)      
      {
             echo "Clé :" .$key. " Valeur : ".$value."<br />\n";
             if($value <> $array_No)  
             {
                   $friend_New[] = $value;
             }
      }
      $friends = serialize($friend_New);
      $query2 ="UPDATE users SET friends = '".$friends."' WHERE uid = $uid" ;
      $result2=mysql_query($query2)or die(mysql_error()); 
                    }      
               }                      
	   }
}

ViPHP
AB
ViPHP | 5818 Messages

22 sept. 2011, 19:54

Tu as mélangé le code de Mazarini qui était presque complet, avec mon exemple qui n'était que partiel pour te faire comprendre le fonctionnement...

Bref c'est un peu n'importe quoi et tu as bien de la chance que cela fonctionne... Faudrait essayer de comprendre sinon tu n'avanceras pas bien loin. Il y a des tutos pour débuter dans phpdebutant.org , developpez.net et des tutos plus ciblés sur ce site. Ce n'est pas un luxe d'en faire quelques uns avant de faire du code.

ViPHP
ViPHP | 2577 Messages

23 sept. 2011, 08:59

En fait, un array_keys() suivi d'un unset() du post du tableau trouvé serai surement mieux.

Eléphanteau du PHP | 45 Messages

23 sept. 2011, 20:15

Ca fonctionne a merveille waw. Je peux effacer un ami de ma liste d'amis en deserializan les données qui proviennent de la database, en effaçant les données qu'on veux effacer, sérialiser et renvoyer tout ce la dans l'enregistrement de la base de donnée. Si vous voulez je peux vous donner le code de la page complète, qui permet d'ajouter, accepter, mettre en file d'attente, les amis. j'ai travailler deux jours dessus.
Et toi AB ne sois pas jaloux de moi. j'essaie toujours de comprendre mais je dois terminer le site dans 10 jours, alors ça ne me laisse pas beaucoup de temps. Mais ne t’inquiète pas que j'ai compris.

Eléphanteau du PHP | 45 Messages

23 sept. 2011, 20:17

Tu propose quoi Mazarini as tu une solution plus performante ?