problème requête SQL dans une fonction PHP

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics

roblescriso
Nouveau WRInaute
 
Messages: 33
Inscription: Mer Avr 20, 2005 12:18

problème requête SQL dans une fonction PHP

Message le Mar Mai 31, 2005 15:09

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:


narayana
WRInaute passionné
WRInaute passionné
 
Messages: 835
Inscription: Ven Jan 28, 2005 12:53

Message le Mar Mai 31, 2005 16:26

euh ce ne serait pas mieux de poster ce genre de message sur un site qui traite d'Oracle ?

pedouille
WRInaute discret
WRInaute discret
 
Messages: 85
Inscription: Mar Mai 24, 2005 6:43

Message le Mar Mai 31, 2005 18:59

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:
Dernière édition par pedouille le Mer Juin 01, 2005 16:03, édité 1 fois.


medium69
WRInaute accro
WRInaute accro
 
Messages: 2182
Inscription: Sam Mai 07, 2005 9:36

Message le Mar Mai 31, 2005 20:31

narayana a écrit: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:

roblescriso
Nouveau WRInaute
 
Messages: 33
Inscription: Mer Avr 20, 2005 12:18

Message le Mer Juin 01, 2005 8:36

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");

pedouille
WRInaute discret
WRInaute discret
 
Messages: 85
Inscription: Mar Mai 24, 2005 6:43

Message le Mer Juin 01, 2005 10:29

Et tu as des constructeurs pour tes classes ?

Pourrait tu mettre le code entier pour une des classes

roblescriso
Nouveau WRInaute
 
Messages: 33
Inscription: Mer Avr 20, 2005 12:18

Message le Mer Juin 01, 2005 13:00

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
}
};

pedouille
WRInaute discret
WRInaute discret
 
Messages: 85
Inscription: Mar Mai 24, 2005 6:43

Message le Mer Juin 01, 2005 15:51

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:


cedber
WRInaute impliqué
WRInaute impliqué
 
Messages: 253
Inscription: Jeu Mai 19, 2005 18:40

Message le Mer Juin 01, 2005 17:10

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

roblescriso
Nouveau WRInaute
 
Messages: 33
Inscription: Mer Avr 20, 2005 12:18

Message le Jeu Juin 02, 2005 9:30

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!


Formation recommandée sur ce thème :

Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par Julien Coquet, expert certifié officiellement par Google Analytics.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités