Problème avec la classe MDB2

Eléphant du PHP | 70 Messages

14 août 2008, 17:22

Bonjour à tous. :D

Voilà, je suis un de ceux qui préfèrent coder en procédural (plus simple quand on n'est pas développeur de métier :wink: :lol: ).
Toutefois, pour ne pas mourrir idiot... et surtout essayer de faire une application indépendante du serveur de BDD, j'essaye de me mettre petit à petit à l'objet (mais j'aime pô... :oops: ) et surtout MDB2 pour l'interface avec la BDD.

Dans un premier temps, je vais surtout avoir besoin des instructions suivantes : SELECT, INSERT et UPDATE, mais en dépit de recherche de docs/exemples sur le net, je rencontre un certain nombre de problèmes :cry: .
Voici le code de mon test (sont inclus les fichiers PEAR.php et MDB2.php):
<?php
//On définit le tableau pour la connexion
$aDBParam = array(
"phptype" => "mysql",
"username" => "mon_user",
"password" => "mon_pwd",
"hostspec" => "mon_host",
"database" => "ma_bdd"
);

//On effectue la connexion à la BDD
$mdb =& MDB2::connect($aDBParam);

if (PEAR::isError($mdb))
{
	die ("Problème de connexion : ".$mdb->getMessage());
}

//RECUPERATION
//On initialise le mode de récupération des données
$mdb->setFetchMode(MDB2_FETCHMODE_ASSOC);

//On charge le module des fonctions supplémentaires
$mdb->loadModule("Extended");

//On va récupérer les infos des users
$sReq01 = "SELECT * FROM site_user";

$aUtilisateur = $mdb->extended->getAll($sReq01);

//Pour chaque résultat, on affiche
foreach ($aUtilisateur as $unUtilisateur)
{
	echo "Identifiant : ".$unUtilisateur["user_id_site"];
	echo "<br />";
	echo "FK Forum : ".$unUtilisateur["user_id_phpbb_fk"];
	echo "<br />";
	echo "Pseudo : ".$unUtilisateur["user_pseudo"];
	echo "<br />";
	echo "Surnom : ".$unUtilisateur["user_surnom"];
	echo "<br />";
	echo "Nom : ".$unUtilisateur["user_nom"];
	echo "<br />";
	echo "Prénom : ".$unUtilisateur["user_prenom"];
	echo "<br />";
	echo "mail : ".$unUtilisateur["user_mail_association"];
	echo "<br /><br />";	
}

//INSERTION
//On indique le type de données
$aTypes = array('integer', 'integer', 'text', 'text', 'text', 'text', 'text', 'text', 'text');

//La requête d'insertion
$sReq02 = "INSERT INTO site_user (user_id_site, user_id_forum, user_pseudo, user_surnom, user_nom, user_prenom, user_mail) VALUES (?, ?, ?, ?, ?, ?, ?);";

//On met les données dans un tableau
/*$aDonnees = array(
"user_id_site" => $mdb->nextID('site_user'),
"user_id_forum" => 54,
"user_pseudo" => "Toto",
"user_surnom" => "Blague à",
"user_nom" => "TUTU",
"user_prenom" => "Toto",
"user_mail" => "[email protected]"
);

//On prépare la requête avec les types choisis et le formatage du SQL
$sReqPreparee = $mdb->extended->prepare($sReq02, $aTypes, MDB2_PREPARE_MANIP);

//On l'exécute
$sReqPreparee->execute($aDonnees);

//On libère la mémoire
$sReqPreparee->free();

//On se déconnecte de la BDD
$db->disconnect();
?>
1- Pour la récupération des données, tout semble OK (peut être le code n'est pas propre/bon ?), mais je retrouve bien mes infos.
2- Par contre, au niveau de l'insertion..., rien ne se passe ! :?
  • - est-ce que mon code vous parait "juste" ?
    - j'ai un souci au niveau de l'identifiant... sur ma base de test (MySQL), c'est un auto-increment, et "avant" (en procédural) je laissais le champ vide et MySQL le remplissait automatiquement.
    Là... ça me pose problème car le champ vide, c'est pas bon... j'ai voulu essayer le "nextID()", mais ça ne semble pas fonctionner.
Voilà, si vous pouviez éclairer ma lanterne... car ce principe me parait très pratique... quand on arrive à s'en servir :wink: :lol:
Merci d'avance à tous.
Cordialement.

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Eléphant du PHP | 70 Messages

14 août 2008, 17:25

Oups... la suite du code n'a pas été prise... :oops:
La voici :
//On met les données dans un tableau
$aDonnees = array(
"user_id_site" => $mdb->nextID('site_user'),
"user_id_forum" => 54,
"user_pseudo" => "Toto",
"user_surnom" => "Blague à",
"user_nom" => "TUTU",
"user_prenom" => "Toto",
"user_mail" => "[email protected]"
);

//On prépare la requête avec les types choisis et le formatage du SQL
$sReqPreparee = $mdb->extended->prepare($sReq02, $aTypes, MDB2_PREPARE_MANIP);

//On l'exécute
$sReqPreparee->execute($aDonnees);

//On libère la mémoire
$sReqPreparee->free();

//On se déconnecte de la BDD
$db->disconnect();
?>
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Eléphant du PHP | 70 Messages

18 août 2008, 20:32

A tout hasard...
Personne n'aurait de solution ou bien verrait d'où vient le problème ?
J'ai eu beau chercher sur le net et refaire tout de 0 plusieurs fois... j'arrive bien à récupérer les infos, mais pas à les insérer. :cry: :evil:
Pourtant c'est la même syntaxe que sur les tutoriaux ou même la doc de MDB2 (enfin je crois).

Merci encore pour votre aide.

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

19 août 2008, 13:35

Tu dois avoir la possibilité d'afficher un éventuel d'erreur, ça te renseignerait je pense.

Eléphant du PHP | 70 Messages

19 août 2008, 15:54

Bonjour Ouckileou.

Merci pour ta réponse.
J'ai déjà regardé au niveau de mes logs Apache et... rien ! :shock:
Ensuite, au niveau du script, si je met des contrôles du type :
if (MDB2::isError($mdb))
{
    die ("Problème de connexion : ".$mdb->getMessage());
}
Aucun message ne s'affiche et le script semble s'arrêter juste à ce niveau... et rien n'est exécuter ensuite :
//On prépare la requête avec les types choisis et le formatage du SQL
$sReqPreparee = $mdb->extended->prepare($sReq02, $aTypes, MDB2_PREPARE_MANIP); 
Le plus surprenant, c'est que ça fonctionne très bien pour la récupération... (donc pas de problème de connexion et/ou paramètres).
J'avoue que je ne sais plus quoi faire ! :( :cry:

Je vais encore regardr un peu... tenter d'autres tests. :evil:

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Eléphant du PHP | 70 Messages

19 août 2008, 18:14

Bon, après remise à 0 (encore une fois !) de mon code..., j'ai rajouté de nouveaux controles.
Maintenant, voici ce que j'obtiens comme erreur :

Code : Tout sélectionner

MDB2 Error: not found - [Error message: Unable to bind to missing placeholder: 0]
Je viens de chercher sur Google, mais rien de plus... ou alors je ne comprends pas ce que je cherche...
Là si j'ai bien compris, c'est qu'il n'arrive pas à faire correspondre les données avec les caractères "joker" ? c'est ça ?
Est-ce que quelqu'un aurait une idée ?

En vous remerciant encore pour votre aide...

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Eléphant du PHP | 70 Messages

21 août 2008, 16:48

Bon, je viens de rerefaire encore un essai...
Je viens de me rendre compte que si j'utilise les caractères "?" pour mes insertions, mon tableau ne doit pas contenir les "clés", mais simplement les valeurs, sinon, il me faut les noms des colonnes précédé de ":".

En revanche, ça ne change rien à mon problème..., j'ai toujours le même message d'erreur... :? :cry:

Nouveau code :
<?php
//On définit le tableau pour la connexion
$aDBParam = array(
"phptype" => "mysql",
"username" => "mon_user",
"password" => "mon_pwd",
"hostspec" => "mon_host",
"database" => "ma_bdd"
);

//On effectue la connexion à la BDD
$mdb =& MDB2::connect($aDBParam);

if (PEAR::isError($mdb))
{
    die ("Problème de connexion : ".$mdb->getMessage());
}

//RECUPERATION + AFFICHAGE DE BASE
//On initialise le mode de récupération des données
$mdb->setFetchMode(MDB2_FETCHMODE_ASSOC);

//On charge le module des fonctions supplémentaires
$mdb->loadModule("Extended");

//On va récupérer les infos des users
$sReq01 = "SELECT * FROM site_user";

$aUtilisateur = $mdb->extended->getAll($sReq01);

//Pour chaque résultat, on affiche
foreach ($aUtilisateur as $unUtilisateur)
{
    echo "Identifiant : ".$unUtilisateur["user_id_site"];
    echo "<br />";
    echo "FK Forum : ".$unUtilisateur["user_id_phpbb_fk"];
    echo "<br />";
    echo "Pseudo : ".$unUtilisateur["user_pseudo"];
    echo "<br />";
    echo "Surnom : ".$unUtilisateur["user_surnom"];
    echo "<br />";
    echo "Nom : ".$unUtilisateur["user_nom"];
    echo "<br />";
    echo "Prénom : ".$unUtilisateur["user_prenom"];
    echo "<br />";
    echo "mail : ".$unUtilisateur["user_mail_association"];
    echo "<br /><br />";    
}

//TEST D'INSERTION
//On indique le type de données
$aTypes = array('integer', 'integer', 'text', 'text', 'text', 'text', 'text', 'text', 'text');

//La requête d'insertion
$sReq02 = "INSERT INTO site_user (user_id_site, user_id_forum, user_pseudo, user_surnom, user_nom, user_prenom, user_mail) VALUES (:user_id_site, :user_id_forum, :user_pseudo, :user_surnom, :user_nom, :user_prenom, :user_mail);";

//On met les données dans un tableau
$aDonnees = array(
"user_id_site" => $mdb->getBeforeId('site_user'),
"user_id_forum" => 54,
"user_pseudo" => "Toto",
"user_surnom" => "Blague à",
"user_nom" => "TUTU",
"user_prenom" => "Toto",
"user_mail" => "[email protected]"
);

//On prépare la requête avec les types choisis et le formatage du SQL
$sReqPreparee = $mdb->extended->prepare($sReq02, $aTypes, MDB2_PREPARE_MANIP);

//On l'exécute
$sReqPreparee->execute($aDonnees);

//On libère la mémoire
$sReqPreparee->free();

//On se déconnecte de la BDD
$db->disconnect();
?>
Et sinon, est-ce que "$mdb->getBeforeId("site_user")" est correct pour l'ID de la table qui est un auto-increment ?

Une idée ?
Merci d'avance, je désespère complètement là...