problème requête SQL dans une fonction PHP

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics

roblescriso
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 33
Inscription: 20 Avr 2005

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 impliqué
WRInaute impliqué
 
Messages: 835
Inscription: 28 Jan 2005

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: 24 Mai 2005

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 passionné
WRInaute passionné
 
Messages: 2485
Inscription: 7 Mai 2005

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
Nouveau WRInaute
 
Messages: 33
Inscription: 20 Avr 2005

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: 24 Mai 2005

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
Nouveau WRInaute
 
Messages: 33
Inscription: 20 Avr 2005

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: 24 Mai 2005

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 occasionnel
WRInaute occasionnel
 
Messages: 253
Inscription: 19 Mai 2005

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
Nouveau WRInaute
 
Messages: 33
Inscription: 20 Avr 2005

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!


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

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 les experts Google Analytics de Ranking Metrics.

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