problème requête SQL dans une fonction PHP

Nouveau WRInaute
bonjour à tous et merci d'avance pour votre aide! :D

j'ai une base de données oracle et pour faire un INSERT dans la base je recupere le ID depuis une class qui s'appelle magic mais j'ai un erreur : Fatal error: Call to a member function dbquery() on a non-object quand j'essaye d'inserer de données..

voici un bout de mon code:

appelle de la fonction:
$magic= new magic($database);
$database = new database();
$database->dbquery( "INSERT INTO AS_PRODUIT( DATE_CREATION,USER_CREATION,ELEMENT_CREATION,STATUS,DB_ELEMENT_ID,ID,AS_TYPROD_CI,AS_FAMILLE_ID,REFERENCE_INT_1)
VALUES('$DATE_CREATION','$USER_CREATION','$ELEMENT_CREATION','$STATUS','$DB_ELEMENT_ID'," . $magic->getid("AS_PRODUIT") . ",'$AS_TYPROD_CI','$AS_FAMILLE_ID','$NArt')");
$database->dbclose();

et voici la classe:

class magic{
var $database;
function magic($database)
{
$this->database=$database;
}
function getid($table_name)
{
$lastid = $this->database->dbquery("SELECT dernier_numero FROM db_sequence WHERE nom_table='$table_name'");
$lastid = $lastid[0][0];
$lastid++;

$this->database->dbquery("UPDATE db_sequence SET dernier_numero='$lastid' WHERE nom_table='$table_name'");
return($lastid); // Renvoi le dernier ID disponible pour la table
}
};

et pour finir la classe database:

class database{
function database($ora_user='xxxx', $ora_password='xxxxx',$ora_connect_string='xxxxx')
{
$this->debug=false;
$this->dbconnect($ora_user, $ora_password, $ora_connect_string);
}
function dbconnect($ora_user, $ora_password, $ora_connect_string) // Fonction de connexion à une base de donnée Oracle
{
$this->conn=OCILogon($ora_user, $ora_password, $ora_connect_string);
}
function show_errormsg($query=null)
{
if($this->debug)die(OCIError($this->conn) . "SQL QUERY: $query");
else die();
}

function dbquery($query) // Exécution de la requête SQL
{
// Execute une requête SQL puis retourne un tableau avec le résultat (s'il y a lieu)

$i=0;

if(!($this->stmt=OCIParse($this->conn,$query))) // Vérification de la syntaxe (Si fausse, afficher l'erreur Oracle)
$this->show_errormsg($query);
if(sizeof($this->blobsbind)>0) // Si il y'a des liaison de variables à faire, créer les liaisons
do
{
$lobs[$i] = OCINewDescriptor($this->conn, OCI_D_LOB);
$mixedvar = &$lobs[$i];
OCIBindByName($this->stmt, ":" . $this->blobsbind[$i][0], $mixedvar, -1, OCI_B_BLOB);
$i++;
}
while(next($this->blobsbind));

if (!OCIExecute($this->stmt,OCI_DEFAULT))
$this->show_errormsg($query);

if (strtoupper(substr($query, 0, 6))=="SELECT")
{
// Récupération des données et de ces données dans une Array
$this->numcolumns = ocinumcols($this->stmt);

$this->numrows=0;

while(OCIFetchInto($this->stmt, $row, OCI_ASSOC))
{
for($column=1;$column<=$this->numcolumns;$column++)
if(ocicolumntyperaw($this->stmt, $column)==_BLOB_RAWTYPEID)
$result[$this->numrows][$column-1]=$row[ocicolumnname($this->stmt, $column)]->load();
else
$result[$this->numrows][$column-1]=$row[ocicolumnname($this->stmt, $column)];

$this->numrows++;
};
return($result);
}
else
{
// ECRITURE, MISE A JOUR, EFFACEMENT
$i=0;
if(sizeof($this->blobsbind)>0)
do
{
if(!$lobs[$i]->save($this->blobsbind[$i][1]))
$this->show_errormsg($query);
$i++;
}
while(next($this->blobsbind));
}

OCICommit($this->conn);
OCIFreeStatement($this->stmt);
}
function dbclose()
{
// Fermeture de la connexion oracle
OCILogoff($this->conn);
}

};

dsl je sais que c'est beaucoup de code mais j'arrive pas à trouver l'erreur :cry:
 
WRInaute discret
Tu n'as pas de constructeur dans tes classes. Je pense que le problème vient de là. Ou alors tu ne nous a pas mis les constructeurs ?

Si c'est le cas, est-ce que tes classes sont dans des fichiers séparés de ton bout de code ?

Si oui, as-tu bien mis :
require('fichier_de_magic.php')
require('fichier_de_database.php'); ?

sinon, rajoute les en haut de ton fichier.

Le problème est que pour php, database n'est pas un objet, ça veut dire qu'il ne peut pas l'initialiser.

EDIT : j'ai dit une connerie pour les constructeurs, je cherchais une fonction __construct(). désolé :oops:
 
WRInaute passionné
narayana a dit:
euh ce ne serait pas mieux de poster ce genre de message sur un site qui traite d'Oracle ?

... Google c'est pas notre oracle à tous :?:

Je sais, je sais... j'ai l'habitude :arrow:
 
Nouveau WRInaute
mes fonctions sont dans un fichier qui s'appelle fonctions.php :)
et je l'appelle dans ma page ou je fais l'appelle de fonction:
require 'fonctions.php';
et dans ma page fonctions j'appelle aussi le fichier avec les variables de conneccion:
include ($DOCUMENT_ROOT . "/shop/admin/webdata/database/shopadmin_connexion.ini");
 
Nouveau WRInaute
voilà le code d'une de mes classes:

// Pour initialiser cette classe il faut passer au constructeur un pointeur sur un objet database connecté
class magic{
var $database;
function magic($database)
{
$this->database=$database;
}
function getid($table_name)
{
$lastid = $this->database->dbquery("SELECT dernier_numero FROM db_sequence WHERE nom_table='$table_name'");
$lastid = $lastid[0][0];
$lastid++;

$this->database->dbquery("UPDATE db_sequence SET dernier_numero='$lastid' WHERE nom_table='$table_name'");
return($lastid); // Renvoi le dernier ID disponible pour la table
}
};
 
WRInaute discret
Je pense que le problème vient du fait que tu déclare $magic avant $database.

En faisant ça, au moment de l'instanciation de $magic, php créé une nouvelle variable vierge $database (puisque tu l'utilise et qu'elle n'est pas déclarée).

Du fait que cette variable soit vierge, lorsque dans magic->getid(), tu appelle $database->dbquery(), php répond que cette variable n'est pas un objet, d'où le message d'erreur.

Pour résoudre le problème, inverse la déclaration de $magic et $database, et je pense que ça sera bon ...

:wink:
 
WRInaute discret
Juste pour tester essaye de modifier le nom ed tes variables :

$magic= new magic($database);
$database = new database();
$database->dbquery( "INSERT INTO AS_PRODUIT( DATE_CREATION,USER_CREATION,ELEMENT_CREATION,STATUS,DB_ELEMENT_ID,ID,AS_TYPROD_CI,AS_FAMILLE_ID,REFERENCE_INT_1)
VALUES('$DATE_CREATION','$USER_CREATION','$ELEMENT_CREATION','$STATUS','$DB_ELEMENT_ID'," . $magic->getid("AS_PRODUIT") . ",'$AS_TYPROD_CI','$AS_FAMILLE_ID','$NArt')");
$database->dbclose();

Je trouve pas ca terrible quand il s'agit du meme nom de variable que celles de ta classe...
C'est juste une idée
 
Nouveau WRInaute
ok! :D
alors j'ai inversé :

$database = new database();
$magic= new magic($database);

et mnt ça marche!

merci à tous pour votre aide!

bonne journée!
 
Discussions similaires
Haut