Undefined property depuis migration PHP5x vers PHP8x [PHP][Résolu] - PHP - Programmation
Marsh Posté le 25-11-2024 à 13:26:41
Un peu dur de t'aider, la ligne 46 correspond à quoi ?
C'est juste un warning sur un undefined, ça se trouve tu avais déjà ce problème avant mais il passait sous le tapis...
Tu as essayé de mettre une valeur par défaut dans le construct ?
Y'a ptet un endroit ou tu instancie ta connexion sans mettre la valeur debug.
Pour la connexion à la base de donnée, un singleton est peut être plus approprié:
https://www.google.com/search?q=php+pdo+class+singleton
Marsh Posté le 25-11-2024 à 14:04:27
C'est bizarre d'avoir dans le code mysql::$mdbug alors que dans ce que tu montres, on a $this->mdbug. Tu es sûr que ta classe a été déclarée de manière statique ?
Marsh Posté le 26-11-2024 à 00:24:09
mechkurt a écrit : |
Oui la ligne 46 c'est le
if ($this->mdbug == '1') { |
J'ai tenté une valeur par défaut, mais ça change rien
Et mon appel initial contient toujours $_DB_DEBUG qui est déjà initialisé à 0 ou 1.
$SQL = new mysql($_DB_USER, $_DB_PASS, $_DB_HOST, $_DB_BASE, $_DB_DEBUG);
Mon workaround actuel c'est d'enlever ce if/then avec $this->mdbug
Mais j'aurais voulu trouver la rootcause, ça fait longtemps que j'ai pas assez touché la prog objet, alors ya certainement qq chose que j'ai loupé.
Et c'est vrai qu'il y a PDO mais le move mysql vers mysqli était plus simple
Marsh Posté le 26-11-2024 à 00:39:22
rufo a écrit : C'est bizarre d'avoir dans le code mysql::$mdbug alors que dans ce que tu montres, on a $this->mdbug. Tu es sûr que ta classe a été déclarée de manière statique ? |
Tu parles de déclarer les variables de la classe en "public static" ?
Comme dit, il va me falloir un refresh sur la prog objet
Sur le principe, je ne comprends pas que mon objet $SQL, qui est une instance de la classe "mysql", construit à partir de 5 variables passées en argument, ne me permettent pas de réutiliser ces variables au sein de l'objet.
Marsh Posté le 26-11-2024 à 00:42:40
A l'occasion, RTFM :
https://www.php.net/manual/fr/language.oop5.php
(faut que je prenne le temps )
Marsh Posté le 26-11-2024 à 07:41:14
Déjà je penses que tes déclarations de propriétés de classe avec "var" ne sont pas correct, ça devrait être public ou private :
https://www.php.net/manual/fr/langu [...] erties.php
Edit: et essayes de debuger en faisant des affichage de variable avec var_dump lors du construct, avant ton if else, etc...
Marsh Posté le 27-11-2024 à 00:08:15
Bon j'ai la solution, le var_dump m'a mis sur la voie !
Le bout de code qui a le problème :
Code :
|
Sauf qu'en copié collé ici, le problème disparait ^^
En fait, j'avais en fait un caractère invisible entre mdbug et ==, qui fait que c'était pas la variable mdbug que j'appelais
Et pour ce qui est du public ou private des variables.
https://www.php.net/manual/fr/langu [...] erties.php
"Note: Une propriété déclarée sans modificateur de Visibilité sera déclarée comme public."
J'ai testé en public ou en private, ça ne change pas l'exécution de mon code, du coup j'ai laissé private.
Merci pour l'aide à la résolution
Marsh Posté le 10-12-2024 à 20:54:21
mrmaxpower a écrit : Bon j'ai la solution, le var_dump m'a mis sur la voie !
|
C'est quoi l'éditeur que tu utilises pour que cela n'ait pas été détecté avant ??
Marsh Posté le 24-11-2024 à 18:02:24
Hello
J'ai un soucis sur la migration d'une classe mysql vers mysqli.
Historiquement (on parle d'un site internet php4/5 qui doit avoir bientôt 20ans ), j'ai une classe dédiée pour mysql, et je crée mon objet / j'ouvre ma connexion via :
$SQL = new mysql($_DB_USER, $_DB_PASS, $_DB_HOST, $_DB_BASE, $_DB_DEBUG);
avec la variable DB_DEBUG qui me permettait d'afficher ou non la requête complète.
En version PHP5, j'avais ceci :
class mysql {
var $muser;
var $mpass ;
var $mhost ;
var $mdb ;
var $mdbug;
var $mport;
var $mconnect_id ;
var $mresultat ;
var $mnum_res ;
var $last_id_insert ;
var $sqlerreurno ;
function mysql($_DB_USER, $_DB_PASS, $_DB_HOST, $_DB_BASE, $_DB_DBG)
{
$this->muser = $_DB_USER;
$this->mpass = $_DB_PASS;
$this->mhost = $_DB_HOST;
$this->mdb = $_DB_BASE;
$this->mdbug = $_DB_DBG;
$this->mport = 3306;
$this->sqlerreurno = 0 ;
$this->connect();
}
function connect()
{
$this->mconnect_id = @mysql_pconnect($this->mhost.":".$this->mport,$this->muser,$this->mpass) or die("Problème de connexion à la base de données...<br />Il se peut que le problème soit dû à une surcharge des serveurs Free : retentez votre connexion d'ici une vingtaine de minutes." );
@mysql_select_db($this->mdb,$this->mconnect_id) or die( "Problème de connexion à la base de données... (selection de la base impossible)" );
}
function query($query)
{
if ($this->mdbug == '1') {
$this->mresultat = @mysql_query($query, $this->mconnect_id) or die(" Erreur de base de données - Exécution de requête impossible :<br />".$query."" ) ;
} else {
$this->mresultat = @mysql_query($query, $this->mconnect_id) or die(" Erreur de base de données - Exécution de requête impossible." ) ;
}
}
...
J'ai adapté en PHP8 (changement vers mysqli* et modification constructeur) :
class mysql {
var $muser;
var $mpass;
var $mhost;
var $mdb;
var $mdbug;
var $mport;
var $mconnect_id;
var $mresultat;
var $mnum_res;
var $last_id_insert;
var $sqlerreurno;
function __construct($_DB_USER, $_DB_PASS, $_DB_HOST, $_DB_BASE, $_DB_DBG)
{
$this->muser = $_DB_USER;
$this->mpass = $_DB_PASS;
$this->mhost = $_DB_HOST;
$this->mdb = $_DB_BASE;
$this->mdbug = $_DB_DBG;
$this->mport = 3306;
$this->sqlerreurno = 0 ;
$this->connect();
}
function connect()
{
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$this->mconnect_id = mysqli_connect($this->mhost, $this->muser, $this->mpass, $this->mdb) or die("Problème de connexion à la base de données...<br />" );
mysqli_set_charset($this->mconnect_id, 'utf8mb4');
$database = mysqli_select_db($this->mconnect_id, $this->mdb);
}
function query($query)
{
if ($this->mdbug == '1') {
$this->mresultat = mysqli_query($this->mconnect_id, $query) or die(" Erreur de base de données - Exécution de requête impossible :<br />".$query."" ) ;
} else {
$this->mresultat = mysqli_query($this->mconnect_id, $query) or die(" Erreur de base de données - Exécution de requête impossible." ) ;
}
...
Mais mes pages m'insultent Warning: Undefined property: mysql::$mdbug in inc/db.inc.php on line 46
J'ai déjà pas mal googlé/die&retry des choses (passage des variables en public), mais sans succès.
Que faire pour qu'au sein de mon objet je puisse accéder à mdbug ? J'arrive bien à accéder à mhost/muser/mpass/mdb pour la fonction connect, pourquoi pas pour la suite ?
Merci aux courageux d'avoir lu jusqu'au bout
Message édité par mrmaxpower le 27-11-2024 à 00:15:24