> Tous les forums > Forum des Webmasters
 simple scripte PHP qui affiche un message erreurSujet résolu
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
jmsch
  Posté le 10/12/2015 @ 23:26 
Aller en bas de la page 
Petit astucien

Bonjour

petit problème avec mon script et là je ne vois pas le problème.

Le script ci-dessous affiche l'heure de dépot. Jusque là pas de problème mais si la variable
$num_devis n'existe pas le tableau est donc vide et là j'ai un message erreur.

Notice: Trying to get property of non-object in C:\wamp\www\fact\test.php on line 36

$num_devis='10-1';

$select1 = $connexion->prepare("SELECT
ID_rdv,
visite,
depot,
reprise

FROM rdv_tb
WHERE num_devis=:num_devis
");

$select1->execute(array(
':num_devis'=>$num_devis
));

$tab_RDV = $select1->fetch(PDO::FETCH_OBJ);

echo $tab_RDV->depot;

Publicité
zoulouman
 Posté le 11/12/2015 à 10:37 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

jmsch
 Posté le 11/12/2015 à 14:20 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour,

bien sur que je connais isset() et empty().

Le problème avec isset et empty c'est qu'il faut faire les contrôles sur toutes les variables lors de l'affichage dans le code html.
Je pensais qu'il y avait une autre possibilité qui puisse se faire côté PHP pour ne pas alourdir le code des templates.

J'ai mes scriptes qui sont bien séparé, d'un côté php et de l'autre le html avec smarty qui fait la liaison entre les deux.

zoulouman
 Posté le 12/12/2015 à 20:19 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Au pire, tu peux faire commencer tes lignes succeptibles de provoquer une erreur par "@"

Le "@" en début de ligne demande à qu'il ne soit pas tenu compte des erreurs.

Tu peux aussi déclarer des "iniset" dans ce style :

ini_set("display_errors", 0);

ini_set("log_errors", 0);

Mais franchement, vu que tu travailles en PDO, je ne te le recommande pas du tout !

Bricoler une base de données en bloquant les erreurs, c'est un coup à partit au crash de database !

Je te recommande plutôt de donner une valeur par défaut à tes variables si elles ne sont pas définies au début du script à l'aide de isset().

Tu peux même ne pas exécuter le script si les variables ne sont pas définies puisqu'elles semblent indispensables.

jmsch
 Posté le 12/12/2015 à 22:08 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

C'est variables ne sont pas indispensable. C'est un simple et bête affichage dans lequel certaines variable n'existent pas toujours.

Voilà la ligne que j'ai mise en haut des pages qui posent problème.
C'est une solution temporaire le temps de modifier mes scripts afin que les diverses variables soit toujours définies.
@ini_set('display_errors', 'off');

Pour plus d'info, j'ai ces erreurs depuis que j'ai fais les mises à jour de mon ancien wamps et php... qui dataient de 2009/2010 voir peut être un peut avant encore.
Avec mon ancienne version mes scripts ne posaient pas de problèmes.

Modifier mes scriptes, je vais le faire, c'est en cour mais ce qui me gène c'est que si je fais un $select1->fetch(PDO::FETCH_OBJ sur une table et si le résutat est vide alors ça me met
Trying to get property of non-objet in..... lors de l'affichage et dans ce cas là pas de possibilité pour initialiser les variables vide côté php.

1) Pour empêcher ça la seul option que je vois c'est de faire un contrôle {if isset(ma_variable)} {ma_variable} {/if}
sur chaque variable lors de l'affichage dans le template mais ça va alourdir le code.

2) Par contre je viens de m'appercevoir que si je fais un $select1->fetch(PDO::FETCH_ASSOC au lieu de $select1->fetch(PDO::FETCH_OBJ
les messages d'erreurs ne s'affichent pas même si les résultats sont vides ???

Serai-ce la solution de passer les select OBJ en ASSOC ??? et si oui pourquoi j'ai des erreurs en OBJ et pas en ASSOC ?



Modifié par jmsch le 12/12/2015 22:59
zoulouman
 Posté le 12/12/2015 à 23:51 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Déjà, les erreurs de variables non définies sont des "notice".

C'est des erreurs qui apparaissent dans les log, mais pas ailleurs. Sauf si c'est demandé dans la config.

Ce n'est pas des erreurs "bien méchantes", mais elles peuvent le devenir. Les ignorer n'est pas bon du tout. PHP les signale, c'est pas pour rien.

Quelle que soit l'utilisation que tu fais d'une variable, il faut qu'elle soit déclarée. Il est possible de s'affranchir de toute déclaration en demandant à ce que aucune erreur n'apparaisse, mais il faut être certain de savoir ce qu'on fait !

Dans ton cas, des variables sont nécessaires, mais elles n'ont pas toujours de valeur ou ne ne sont même pas déclarées. C'est un problème, un gros problème !

Libre à toi de régler ce problème de la façon qui te semblera la meilleure, mais il faut le régler !

jmsch
 Posté le 13/12/2015 à 09:44 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Ok pour ce que tu dis Les modifications sont en cours.

C'est bien pour ça que ma question principale est comment déclarer côté php des variables qui proviennent d'un select et qui vont donc se retrouver dans un array?

zoulouman
 Posté le 13/12/2015 à 10:42 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

La meilleure solution, c'est de définir tes variables avec une valeur par défaut.

Ensuite, si elles sont modifiées, tu fais comme d'hab, tu les vérifies et c'est parti. Sinon, c'est la valeur par défaut qui sera utilisée.

jmsch
 Posté le 13/12/2015 à 20:57 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Au risque d'être lourd, si je suis ton raisonnement ok pour définir mes variables par défaut.

Mais si les variables découlent d'un select je ne peux pas les définir par défaut avant. Il faudrait donc que je fasse un contrôle après mon sélect et si ill n'y a pas de résultat créer manuellement un tableau vide.
C'est bien comme ça que tu veux dire?

$tab_RDV=$select1->fetch(PDO::FETCH_OBJ

if(empty($tab_RDV))
{
$tab_RDV = (object) Array
( 'ID_rdv' => '',
'visite' => '',
'depot' => '',
'reprise' => '',
'observation' => ''
);
}

$smarty->assign('tab_RDV', $tab_RDV);

Publicité
zoulouman
 Posté le 14/12/2015 à 06:47 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Ton script est mal foutu.

A quoi bon interroger une base de données quand on sait que le résultat retourné sera vide ???

Les bases de données sont ce qu'il y a de plus lourd en terme de ressources système. Si tu peux économiser une requête, ne te prive pas, fais le !



Modifié par zoulouman le 14/12/2015 06:48
jmsch
 Posté le 14/12/2015 à 09:14 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

La c pas possible. Je ne peux pas savoir à l'avance si le résultat sera vide ou pas. Dans certain cas il sera vide dans d'autres non. Cette requête se trouve sur une page de synthèse parmi d'autres requêtes.

zoulouman
 Posté le 14/12/2015 à 11:21 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Ton souci, c'est que tu colles tout sur une même page. Les entrées utilisateur, le questionnement de la base et l'affichage du résultat.

C'est pour ça que tu ne vois pas d'issue au souci.

Renseigne toi sur la programmation MVC et tu vas voir que tout va devenir limpide !

Malcolm
 Posté le 15/12/2015 à 22:38 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

C'est vrai que mettre à jour de 2009-2020 à 2015-2016 est un bond de géant, c'est entièrement normal que tu aies ces erreurs.

Je ne suis pas partisan du ini_set, ou pire, de l'arobase pour masquer les erreurs, il faut au contraire en environnement de dév afficher le plus de détails possibles, traiter les erreurs et masquer les éventuelles "en prod". Mettre un ini_set "pour faire beau" c'est se mettre des œillères. (zoulouman : je pousse ton raisonnement à l'extrême ).

jmsch > tu ne peux effectivement pas savoir si la variable sera vide ou non, mais tu peux (et devrais) déclarer toutes les variables que tu vas utiliser. C'est une grosse lacune de PHP, que de pouvoir utiliser une variable sans qu'elle n'ait été déclarée et initialisée au début. Teste sur Java, ou d'autres langages qui sont fortement typés : il te sera impossible d'utiliser une variable si elle n'est pas déclarée et, au mieux, initialisée. C'est assez fastidieux, c'est vrai, mais ça demande aussi de la rigueur notamment pour la gestion de la mémoire (de l'ordinateur, hein !) et pour éviter les effets secondaires comme tu les rencontres.

Ton select peut retourner plusieurs types de résultats, par exemple (liste non exhaustive) :

- un tableau vide (càd array()) ou un NULL ou encore un FALSE

- un objet avec des propriétés et méthodes.

A toi de correctement tester la variable une fois qu'elle est remplie par le retour de select/mysql pour savoir son type et ce qu'elle contient.

Suggestion : utilise ce code : var_dump($tab_RDV); qui te donnera le type (object, Array, int, ...) ainsi que le contenu de cette variable. Teste juste à la sortie du select et vois dans les 2 cas de figures les différents var_dump, et en fonction, à toi de continuer le traitement de la page ou au contraire, de l'arrêter et d'afficher un message générique.

zoulouman > pour "faire mon gros lourd" aussi, l'expression "programmation MVC" que tu utilises n'existe pas, puisque MVC est un modèle conceptuel de développement et non un langage

jmsch
 Posté le 16/12/2015 à 00:02 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

C'est ce que je suis entrain de faire.... rechercher initialiser et déclarer les variables qui ne l'ont pas été.
Au pire si je ne peux pas la déclarer en haut de page je l'assign à smarty sous cette forme. $smarty->assign('nom', isset($nom) ? $nom: '');

var_dump($tab_RDV); > Ok pour savoir de quoi le select est composé.
Mais si le select ne retourne rien, boolean falze tu déclares comment les variables qu'il pourrait contenir.

Pour exemple : J'ai une page qui affiche diverses info qui proviennent de 3 select différents.
Si 1 d'entre eux, par exemple
$tab_RDV ne retourne rien, boolean falze car pas encore de RDV de pris... je le traite comment ?
Je ne vois que 2 options.

Soit : je le fais sur les variable dans le template lors de l'affichage avec isset ou alors côté php de cette façon.

$tab_RDV=$select1->fetch(PDO::FETCH_OBJ

if(empty($tab_RDV))
{
$tab_RDV = (object) Array(
'ID_rdv' => '',
'visite' => '',
'depot' => '',
'reprise' => '',
'observation' => ''
);}

$smarty->assign('tab_RDV', $tab_RDV);



Modifié par jmsch le 16/12/2015 00:05
Malcolm
 Posté le 16/12/2015 à 00:13 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

la 2è option est la plus complète, mais sans doute fastidieuse.

sinon pour ta page, au lieu d'afficher ton RV (parce qu'ilvaut false) tu peux tester : if ($tabRDV === false) { echo "pas d'infos sur le RDV pour le moment."; } else { ... }

mais c'est dur de le faire à l'aveuglette. Question, mais est-ce que smarty est à jour ?

jmsch
 Posté le 16/12/2015 à 09:24 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Oui j'ai tout mis à jour. Wamp smarty phpmailer ....

Effectivement je peux tester $tab_rdv sur la page avant affichage mais je trouve ça un peu dommage de devoir surcharger la page d'affichage juste pour voir si ma variable existe.... lors de l'affichage un emplacement vide me convenait très bien avant.

Ok je vais faire au mieux.

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Les bons plans du moment PC Astuces

Tous les Bons Plans
GratuitJeu PC Rayman Legends gratuit
Valable jusqu'au 03 Avril

Ubisoft offre actuellement l'excellent jeu PC Rayman Legend. Rayman, le héros du jeu de plates-formes le plus acclamé et récompensé en 2011, revient avec Rayman Legends. Rayman, Globox et les Ptizêtres se baladent dans la Croisée des Rêves et découvrent une tente ornée de peintures qui racontent l’histoire de 5 mondes légendaires. En inspectant l’une d’entre elles, ils se retrouvent aspirés et projetés dans un monde inconnu… L’aventure peut commencer ! Rayman et sa bande doivent alors se frayer un chemin dans chacun de ces mondes inspirés des contes et légendes célèbres pour sauver le leur.


> Voir l'offre
8,99 €McAfee Internet Security 2020 (3 appareils, 1 an) à 8,99 €
Valable jusqu'au 03 Avril

Amazon fait une promotion sur la suite antivirus Internet Security 2020 qui passe à 8,99 €. Cette protection intégrale alliant antivirus, protection de l'identité et protection de la confidentialité des données pour tous vos PC, Mac, smartphones et tablettes est valide pour 3 appareils pendant 1 an. La clé d'activation ainsi que le lien de téléchargement vous seront envoyés par email une fois la commande passée. Une très bonne affaire.


> Voir l'offre
54,99 €Liseuse Amazon Kindle avec éclairage frontal à 54,99 €
Valable jusqu'au 03 Avril

Amazon fait une promotion sur sa nouvelle liseuse Kindle qui passe à 54,99 € livrée gratuitement. Cette version est équipée d'un écran tactile à encre électronique qui a l'apparence du papier et se lit comme un livre papier. Elle possède maintenant un éclairage frontal réglable vous permet de lire confortablement pendant des heures, à l'intérieur et à l'extérieur, de jour comme de nuit. Elle possède le WiFi ainsi qu'un port MicroUSB. Cette version peut afficher des publicités discrètes pendant sa mise en veille. Pour ne pas les avoir, vous devez vous tourner vers la version Sans offres spéciales qui coûte 69,99 €. Elle peut lire les fichiers ePub en suivant cette astuce.


> Voir l'offre

Sujets relatifs
Message erreur accès livre d'or
message d'erreur
message d'erreur de script
message d'erreur à la publication
souci de message du commentaire qui n'affiche pas
message d'erreur sur ma page php
Message d'erreur " mysql_connect "
J'ai un message d'erreur étonant..
Dreamweaver mx2004 - message d'erreur
message d'erreur javascript
Plus de sujets relatifs à simple scripte PHP qui affiche un message erreur
 > Tous les forums > Forum Forum des Webmasters