problème requête SQL dans une fonction PHP
10 messages • Page 1 sur 1
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
bonjour à tous et merci d'avance pour votre aide!
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
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
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é
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é
Dernière édition par pedouille le Mer Juin 01, 2005 16:03, édité 1 fois.
- roblescriso
- Nouveau WRInaute
- Messages: 33
- Inscription: Mer Avr 20, 2005 12:18
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");
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");
- roblescriso
- Nouveau WRInaute
- Messages: 33
- Inscription: Mer Avr 20, 2005 12:18
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
}
};
// 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
}
};
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 ...

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 ...
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
$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
ok!
alors j'ai inversé :
$database = new database();
$magic= new magic($database);
et mnt ça marche!
merci à tous pour votre aide!
bonne journée!
alors j'ai inversé :
$database = new database();
$magic= new magic($database);
et mnt ça marche!
merci à tous pour votre aide!
bonne journée!
10 messages • Page 1 sur 1
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 :
- AdSense Tracking : statistiques détaillées sur les clics AdSense
- Yahoo France propose des requêtes avec les recherches suggérées
- The Technology Behind Google
- Google ajoute la Navigation par nom dans sa Toolbar
- Référencement d'un forum phpBB
- Les sites les plus visibles pour le mot Google
- Personnalisation et recherche locale sur Google
- Le baromètre de la visibilité des sites pour le terme "Google"
- Le marketing viral au service du référencement
- Configurer les options de passage de Googlebot sur son site
Consultez la description détaillée des produits ou services de Google suivants : Google Phonebook, Google Related Links
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités






le forum