par
Chakra Spirit » 18 déc. 2006, 11:38
Hello,
Tout d'abord, merci pour vos réponses, ça met du beaume au coeur...
Je ne te parlerai pas de ta class mais c'est pas très objet.
Ah ? Flute...

Il est où le soucis ?
Tu veux lui assigner 4 paramètres ton erreur est donc logique.
Ben non ?!

Je lui passe bien trois paramètres, le premier représentant le type des paramètres comme indiqué sur
cette page. Dans le doute, j'ai testé sans les 'sss' mais ça ne passe pas plus, malheureusement.
Ligne 15, tu appelles une méthode de façon statique alors qu'elle n'a pas été déclarée "static".
Ligne 20, il est déconseillé de préfixer le nom d'une méthode d'un double underscore, il vaut mieux laisser ce préfixe aux méthodes magiques de PHP (comme __construct(), __destruct(), __get(), etc...)
Ligne 33, si je ne me trompe pas, trigger_error() ne stoppe pas l'exécution d'un script donc si tu utilises le gestionnaire d'erreur par défaut le script continuera même en cas d'erreur.
Ligne 43, je recommande d'appeler les objets de requêtes préparées $stmt (pour "statement", de "prepared statement"). Ce n'est pas un résultat, d'où un nom différent.
Ligne 46, pourquoi utiliser un nouveau nom de variable ? tu ne te serviras plus du $requete original donc autant réutiliser la variable ici.
Ligne 53, ben voilà, à force de multiplier les noms de variables tu t'es planté de nom dans celle-là

(tu as utilisé $requete à la place de $requete2) Mon conseil : réutilise toujours le même nom de variable si tu ne te sers plus de la variables originales. Ici, $resultat2 deviendrait $stmt.
ok, j'ai changé tout ça. Merci.
Ligne 63, je ne sais pas ce que fait cette instruction

Si tu veux libérer une requête préparée, c'est $stmt->close()
J'ai ajouté $stmt->close() mais j'ai conservé $mysqli->close() parce que ça me sert à fermer la connexion manuellement.
A quoi sert une class qui n'est utilisable qu'une fois ?
Si on l'utilise deux, elle plante (Création d'une table qui existe -- utilisateur --).
On ne devrait pas pouvoir utiliser cette classe deux fois puisque le formulaire en question n'apparaît qu'une seule fois en début d'application et si tout se déroule comme prévu, l'utilisateur est redirigé sur une autre page. Est-ce une mauvaise pratique que de créer une classe pour celà ?
Jamais de variables en dur dans une class, dans ce cas elles deviennent des constantes.
Si ce sont des constantes, le jour ou un paramètre de connexion à la base change ==> Réecriture de la class. Le principe de la réutilisabilité est baffoué.
Ne jamais utiliser de variables globales dans une class ($_POST[], etc...)
En effet, j'avais défini mes variables de connexion au sein de cette classe mais bon, j'avais prévu de les passer dans un fichier à part par la suite... C'était plus pour le test... Voilà qui est changé aussi du coup.
Donc, mon code est maintenant le suivant :
Fichier connexion.inc.php
<?php
// Données d'accès à la BDD
$nom = *******;
$mdp = *******;
$serveur = 'localhost';
$base = 'galerie';
$mysqli = new mysqli($serveur, $nom, $mdp, $base);
if(mysqli_connect_errno())
{
printf("Connexion échouée : %s\n", mysqli_connect_error());
exit();
}
?>
Fichier verif.php
<?php
session_start();
class DefineUser
{
// Méthode de création d'instance de l'objet
public function __construct()
{
$this->define();
return header('Location: ../interface.php5');
}
// Insertion des données utilisateurs dans la BDD
private function define()
{
// Si l'utilisateur envoie un login et un mot de passe
if(isset($_POST['txtLogin']) && isset($_POST['pwdPassword']))
{
// Si une variable de session 'submitLogPwd' existe et est égale à celle renvoyée par le formulaire
if(isset($_SESSION['submitLogPwd']) && $_POST['submitLogPwd'] == $_SESSION['submitLogPwd'])
{
// Création de la connexion à la BDD
include_once 'connexion.inc.php';
// Création d'une table utilisateur pour contenir les données
$requete = "CREATE TABLE utilisateur(
id int(11) NOT NULL auto_increment,
login char(40),
motdepasse char(32),
graindesel char(32),
PRIMARY KEY (id)
)";
$stmt = $mysqli->query($requete);
$stmt->close();
// Requête d'insertion des données
$requete = "INSERT INTO utilisateur(
login, mdp, graindesel
) VALUES(
?, ?, ?
)";
// Préparation de la requête et insertion des données
$stmt = $mysqli->prepare($requete);
$stmt->bind_param('sss', $txtLogin, $pwdPassword, $graindesel);
// Données à insérer
$graindesel = md5(uniqid(rand(), true));
$txtLogin = htmlentities($_POST['txtLogin']);
$pwdPassword = md5((htmlentities($_POST['pwdPassword'])).$graindesel);
// Exécution de la requête
$stmt->execute();
$mysqli->close();
}
}
}
}
$user = new DefineUser;
?>
Ben... ça ne marche pas !
J'obtiens ceci :
Fatal error: Call to a member function close() on a non-object in E:\workdraft\verif.php5 on line 38
Mon objet est pourtant bien créé non ?

Hello,
Tout d'abord, merci pour vos réponses, ça met du beaume au coeur... :o
[quote]Je ne te parlerai pas de ta class mais c'est pas très objet. [/quote]
Ah ? Flute... :? Il est où le soucis ?
[quote]Tu veux lui assigner 4 paramètres ton erreur est donc logique.[/quote]Ben non ?! :shock: Je lui passe bien trois paramètres, le premier représentant le type des paramètres comme indiqué sur [url=http://fr.php.net/manual/fr/function.mysqli-stmt-bind-param.php]cette page[/url]. Dans le doute, j'ai testé sans les 'sss' mais ça ne passe pas plus, malheureusement.
[quote]Ligne 15, tu appelles une méthode de façon statique alors qu'elle n'a pas été déclarée "static".
Ligne 20, il est déconseillé de préfixer le nom d'une méthode d'un double underscore, il vaut mieux laisser ce préfixe aux méthodes magiques de PHP (comme __construct(), __destruct(), __get(), etc...)
Ligne 33, si je ne me trompe pas, trigger_error() ne stoppe pas l'exécution d'un script donc si tu utilises le gestionnaire d'erreur par défaut le script continuera même en cas d'erreur.
Ligne 43, je recommande d'appeler les objets de requêtes préparées $stmt (pour "statement", de "prepared statement"). Ce n'est pas un résultat, d'où un nom différent.
Ligne 46, pourquoi utiliser un nouveau nom de variable ? tu ne te serviras plus du $requete original donc autant réutiliser la variable ici.
Ligne 53, ben voilà, à force de multiplier les noms de variables tu t'es planté de nom dans celle-là :lol: (tu as utilisé $requete à la place de $requete2) Mon conseil : réutilise toujours le même nom de variable si tu ne te sers plus de la variables originales. Ici, $resultat2 deviendrait $stmt. [/quote]ok, j'ai changé tout ça. Merci. :wink:
[quote]Ligne 63, je ne sais pas ce que fait cette instruction :?: Si tu veux libérer une requête préparée, c'est $stmt->close() [/quote]J'ai ajouté $stmt->close() mais j'ai conservé $mysqli->close() parce que ça me sert à fermer la connexion manuellement.
[quote]A quoi sert une class qui n'est utilisable qu'une fois ?
Si on l'utilise deux, elle plante (Création d'une table qui existe -- utilisateur --).[/quote]On ne devrait pas pouvoir utiliser cette classe deux fois puisque le formulaire en question n'apparaît qu'une seule fois en début d'application et si tout se déroule comme prévu, l'utilisateur est redirigé sur une autre page. Est-ce une mauvaise pratique que de créer une classe pour celà ? :?
[quote]Jamais de variables en dur dans une class, dans ce cas elles deviennent des constantes.
Si ce sont des constantes, le jour ou un paramètre de connexion à la base change ==> Réecriture de la class. Le principe de la réutilisabilité est baffoué.
Ne jamais utiliser de variables globales dans une class ($_POST[], etc...)[/quote]
En effet, j'avais défini mes variables de connexion au sein de cette classe mais bon, j'avais prévu de les passer dans un fichier à part par la suite... C'était plus pour le test... Voilà qui est changé aussi du coup. :wink:
Donc, mon code est maintenant le suivant :
[b]Fichier connexion.inc.php[/b]
[php]<?php
// Données d'accès à la BDD
$nom = *******;
$mdp = *******;
$serveur = 'localhost';
$base = 'galerie';
$mysqli = new mysqli($serveur, $nom, $mdp, $base);
if(mysqli_connect_errno())
{
printf("Connexion échouée : %s\n", mysqli_connect_error());
exit();
}
?>[/php]
[b]Fichier verif.php[/b]
[php]<?php
session_start();
class DefineUser
{
// Méthode de création d'instance de l'objet
public function __construct()
{
$this->define();
return header('Location: ../interface.php5');
}
// Insertion des données utilisateurs dans la BDD
private function define()
{
// Si l'utilisateur envoie un login et un mot de passe
if(isset($_POST['txtLogin']) && isset($_POST['pwdPassword']))
{
// Si une variable de session 'submitLogPwd' existe et est égale à celle renvoyée par le formulaire
if(isset($_SESSION['submitLogPwd']) && $_POST['submitLogPwd'] == $_SESSION['submitLogPwd'])
{
// Création de la connexion à la BDD
include_once 'connexion.inc.php';
// Création d'une table utilisateur pour contenir les données
$requete = "CREATE TABLE utilisateur(
id int(11) NOT NULL auto_increment,
login char(40),
motdepasse char(32),
graindesel char(32),
PRIMARY KEY (id)
)";
$stmt = $mysqli->query($requete);
$stmt->close();
// Requête d'insertion des données
$requete = "INSERT INTO utilisateur(
login, mdp, graindesel
) VALUES(
?, ?, ?
)";
// Préparation de la requête et insertion des données
$stmt = $mysqli->prepare($requete);
$stmt->bind_param('sss', $txtLogin, $pwdPassword, $graindesel);
// Données à insérer
$graindesel = md5(uniqid(rand(), true));
$txtLogin = htmlentities($_POST['txtLogin']);
$pwdPassword = md5((htmlentities($_POST['pwdPassword'])).$graindesel);
// Exécution de la requête
$stmt->execute();
$mysqli->close();
}
}
}
}
$user = new DefineUser;
?>[/php]
Ben... ça ne marche pas ! :(
J'obtiens ceci :
[quote]Fatal error: Call to a member function close() on a non-object in E:\workdraft\verif.php5 on line 38[/quote]
Mon objet est pourtant bien créé non ? :shock: