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: 20 Avr 2005
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
- pedouille
- WRInaute discret

- Messages: 85
- Inscription: 24 Mai 2005
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: 20 Avr 2005
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: 20 Avr 2005
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
}
};
- pedouille
- WRInaute discret

- Messages: 85
- Inscription: 24 Mai 2005
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 ...
-

cedber - WRInaute occasionnel

- Messages: 253
- Inscription: 19 Mai 2005
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: 20 Avr 2005
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 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 :
- pb sur requete sql et champs qui correspond 1 fonction php
- Requête SQL en fonction de l'heure
- [PHP/MySQL] Excepter une valeur dans un requête SQL en PHP
- fonction php avec du SQL
- Requete sql complexe en php
- Requete sql INSERT INTO + SELECT (php)
- Petite question requete sql en PHP
- requête sql en php pour mysql
- Problème de requête SQL
- Problème requête SQL
- Google API : guide de développement de l'API Google - 20-09-2002
- AdSense Tracking : statistiques détaillées sur les clics AdSense - 29-02-2004
- Nombre moyen de mots par requête : statistiques AOL Août 2006 - 10-08-2006
- Nombre de clics dans les pages de résultats : statistiques AOL Août 2006 - 11-08-2006
- Informations sur l'infrastructure technique de Google - 01-11-2004
- Gérer l'entête HTTP en PHP - 04-08-2008
- Google indexe le Flash - 28-04-2004
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



