Objet qui se vide tout seul

Noxstyle - Modifié le 13 déc. 2018 à 23:01
 Noxstyle - 14 déc. 2018 à 01:39
Bonjour à tous,
Cela fait plusieurs heures que je cherche une réponse à mon problème, mais hélas, en vain. Alors je viens vers vous en espérant que quelqu'un puisse éclairer ma lanterne.

Voilà mon problème, en résumé :
Je fais une requête SQL avec un SELECT, pour obtenir une entrée particulière de ma BDD.

Ensuite je fais tout un tas de traitement sur les différentes valeur des champs reçues, puis je me prépare à enregistrer mes résultats dans une autre BDD.

Le problème survenu est une erreur me disant qu'à l'enregistrement, un champ ne peut pas être vide. Oui, ok, je le sais, sauf que la variable que je tente d'enregistrer est pour moi initialisée comme il faut, et contient bien une valeur.
Je fais donc différents tests, et je me rend compte au final que, effectivement, au moment où elle est censée être enregistrée, elle vaut NULL.
J'ai donc tenté de trouver le problème, et au final je ne trouve rien.
En faisant des tests, ce qui ressort, c'est que l'objet contenant les variables que je veux enregistrer se vide entièrement au moment où le script entre dans une condition if-else.
Juste avant le 'if', un var_dump sur mon objet m'indique bien l'objet et tout ce qu'il contient, alors que la ligne juste après le 'if', un var_dump m'indique un objet dont tous les attributs valent NULL.
Pourquoi mon objet se vide-t-il tout seul ? Je me suis dit que c'est peut-être parce que ce qu'il contient dépent d'une instance (le résultat de la 1ère requête SELECT) qui ensuite est supprimée, j'ai donc essayé de cloner l'objet pour que toute modification ne joue pas sur ce dernier, mais même là, le problème persiste. Je vous met le code en question :

$query = $bdd->prepare('SELECT * FROM xxx WHERE id = :idcreation AND iduser = :iduser');
$query->execute(array('idcreation' => $idcreation, 'iduser' => $vrftoken->id));
$result = $query->fetch();
// Ici $result contient un array avec toutes les valeurs, pas de problème
// Suite à mon problème, je crée un objet contenant les valeurs de l'array (pour essayer...)
class objetcreation {};
$objetcreation = new objetcreation;
$objetcreation->id = $result['id'];
$objetcreation->iduser = $result['iduser'];
$objetcreation->villevoulue = $result['villevoulue'];
// ...et tout le reste

$prixtotal = $nbjoursvoulus * $result['prixjourproposition'];
if ($result['fraiscreation'] <= $prixtotal) {
      $resteapayer = $prixtotal - $result['fraiscreation'];
      $remboursement = 0;
} else {
      $resteapayer = 0;
      $remboursement = $result['fraiscreation'] - $prixtotal;
}

$query1 = $bdd->prepare('SELECT compteeuros FROM yyy WHERE id = :iduser');
$query1->execute(array('iduser' => $vrftoken->id));
$result1 = $query1->fetch();
$compteeuros = $result1['compteeuros'];
$newcompteeuros = $compteeuros;

if ($deduction === 'oui') {
                if ($compteeuros <= $resteapayer) {
                    $resteapayer = $resteapayer - $compteeuros;
                    $newcompteeuros = 0;
                } else {
                    $newcompteeuros = $compteeuros - $resteapayer;
                    $resteapayer = 0;
                }
} else if ($deduction === 'non') {
                $newcompteeuros = $compteeuros;
                $resteapayer = $resteapayer;
}

class retour {};
$retour = new retour;
$retour->resteapayer = $resteapayer;
$retour->newcompteeuros = $newcompteeuros;
$retour->remboursement = $remboursement;

// Et là commencent les problèmes
var_dump($objetcreation); // Ici l'objet contient bien toutes les valeurs
if ($acceptation === 'oui') {
    var_dump($objetcreation); // Ici l'objet ne contient que des NULL à la place de chaque valeur...
}


C'est donc une version du code qui a subit pas mal de changements depuis mon problème, car j'ai tenté de le contourner de différentes manières.
A savoir qu'avant de créer l'objet, je me servais directement du 1er array $result, mais le problème est le même, il se retrouve vide juste après le 'if($acceptation === 'oui')', alors que la ligne au-dessus, il est encore bien fourni en valeurs.
Auriez-vous une idée ? J'espère être assez clair dans l'explication de mon problème, et vous avoir fourni tout ce dont vous auriez éventuellement besoin pour m'aider.
Merci d'avance !!

2 réponses

jordane45 Messages postés 38221 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 juillet 2024 344
13 déc. 2018 à 23:10
Bonjour,
Difficile de te répondre comme ça.
Je suppose que tes class sont plus "fournies" que ça....
As tu mis un constructeur ?
Ton fichier php est-il bien encore en utf8 (sans bom) ? ( voir chapitre 1 de ce lien : http://www.commentcamarche.net/faq/47069-html-php-caracteres-accentues-et-l-utf8 )

Au passage, vu que tu fais du PDO, je t'invite fortement à appliquer ce qui est indiqué là :
http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

et également à suivre les recommandations présentes ici : http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code


Merci de ta réponse,

Pour les constructeurs, je n'en ai jamais utilisés dans ce genre de class déclarées entre 2 requêtes, je leur assigne 2-3 attributs pour regrouper certaines variables sous forme d'objet (nécessité pour communiquer avec le FrameWork en TypeScript que j'utilise en parallèle), puis elles ne sont jamais réutilisées par la suite. Cela ne m'a jamais posé de problème, ça m'embêterait que ce soit le cas ici lol mais si c'est vraiment une piste, je veux bien en savoir plus.
Et les liens que tu donnes sont sympa, je pense appliquer déjà la plupart des conseils donnés :) Ici, peut-être que je me trompe, mon soucis à plutôt l'air d'être de l'ordre du raisonnement. Ce qui se passe est sûrement normal, mais pourquoi ? à quel moment ?
jordane45 Messages postés 38221 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 juillet 2024 344
13 déc. 2018 à 23:32
Pour les liens...
- Les try/catch pour les requêtes PDO
- La récupération "propre" des variables AVANT de les utiliser
.. ce ne sont que quelques "trucs" à faire correctement pour bien coder.

- Pour l'encodage en utf8 (du FICHIER lui même j'insiste...) tu ne nous as pas répondu.

Quand aux class :
class maclass{
    public $id;
    public $iduser;
    public $villevoulue;
  
    function __construct($id=NULL,$iduser=NULL){
       //tu peux, par exemple remplir les variables depuis le constructeur directement
      $this->id = $id;
      $this->iduser = $iduser;
    }
}

et quand tu instancies ta class :
 $oMaclass = new maclass(10,20);

Il est même conseillé d'utiliser des setter et des getter (mais perso je m'en passe très bien )


Il est également conseillé de placer tes class dans des fichiers à part et de les inclure dans ton script à l'aider de require_once ( afin de ne pas avoir plusieurs fois la même class chargée par erreur dans ton script )
0
Noxstyle > jordane45 Messages postés 38221 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 juillet 2024
14 déc. 2018 à 01:39
Merci de ta réponse,
J'ai mis les try/catch pour mes requêtes, ça ne retourne pas d'erreur, mes requêtes fonctionnent. J'ai bien le résultat voulu à la suite de celles-ci.
En vérifiant la validité des variables, en les récupérant proprement, en ajoutant des outils de debug, au final j'ai toujours le même problème.
Mes fichiers sont bien, si j'en crois la page Paramètres de Visual Studio, encodés en utf8, de base pour tous les fichiers, et sans bom.
Si je déclare ma classe comme dans ton exemple, alors mon framework me sort une erreur d'accès au fichier PHP :

Access to XMLHttpRequest at 'http://xxx.php' from origin 'http://localhost:8100' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Si je déclare la class de cette manière, mais cette fois sans le constructeur, l'accès au fichier m'est rendu, mais les variable sont vides une fois la class instanciée (en ayant bien-sûr utilisé des setters et getters).
Et puis honnêtement, je trouve ça assez lourd de déclarer une chose en 30-40 lignes alors que depuis toujours je le fais en 5-10 sans aucun soucis :/
Car non, mes classes ne sont pas plus fournies que ça, elles ne contiennent qu'une poignée de variables, aucune fonction, et ne sont utilisées qu'une seule fois pour envoyer une entrée de BDD sous forme d'objet dans un fichier JSON qui sera lu par un programme écrit en TypeScript.

Peut-être que je ne regarde pas où il faut, ou alors un aspect que je ne connaissais pas encore et qui attendait sagement que j'en arrive là avant de se montrer haha

Merci du temps que tu m'accordes :)
0
Rejoignez-nous