Bonjour,
Voila je rencontre un petit problème avec mon code.
Je conçois un panel de gestion des utilisateurs pour un serveur de jeu. J'aimerais permettre aux membres du staff de pouvoir gérer toutes les infos joueur en base de données sans pour autant être en root sur la machine. L'idée est de faire une 1ère page qui demande de renseigner le numéro de téléphone du joueur. Cette page, une fois le formulaire de type GET soumis, va rediriger la 2ème page. Cette 2ème page va être également composée d'un formulaire, avec autant d'inputs que le nombre de colonnes dans la table SQL. L'idée est d'afficher toutes les données joueur, avec la condition "WHERE telephone = ?" dans ma requête pour filtrer uniquement le joueur en question. Une fois fait, je vais donc faire des "values=" pour définir à l'avance chacune des valeurs relatives au joueur, précédemment filtré par ma première requête SQL ( je sais, c'est le bordel, j'en suis désolé, mais c'est pas si simple d'écrire tout ça :') )
Voici donc mon formulaire, qui est sensé recevoir les valeurs relatives au joueur précédemment sélectionné via ma requête SQL :
( PS : C'est du Boostrap Twitter Paper )
<form class="form-horizontal" method="post" action="manage-done.php">
<fieldset>
<legend>Gérer les Informations du Joueur : </legend>
<div class="form-group">
<label for="inputEmail" class="col-lg-2 control-label"><i class="mdi mdi-steam"></i> Identifiant Steam </label>
<div class="col-lg-10">
<input type="text" class="form-control" name="identifier" value="<?= $donnees['identifier']; ?>">
</div>
</div>
<div class="form-group">
<label for="inputEmail" class="col-lg-2 control-label"><i class="mdi mdi-account-circle"></i> Nom</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="nom" value="<?= $donnees['nom']; ?>">
</div>
</div>
<div class="form-group">
<label for="inputEmail" class="col-lg-2 control-label"><i class="mdi mdi-account-box"></i> Prénom</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="prenom" value="<?= $donnees['prenom']; ?>">
</div>
</div>
<div class="form-group">
<label for="select" class="col-lg-2 control-label"><i class="mdi mdi-sort-alphabetical"></i> Type de Joueur</label>
<div class="col-lg-10">
<select class="form-control" name="group">
<option>user</option>
<option>owner</option>
</select>
</div>
</div>
<div class="form-group">
<label for="select" class="col-lg-2 control-label"><i class="mdi mdi-sort-numeric"></i> Niveau de Permission</label>
<div class="col-lg-10">
<select class="form-control" name="permission_level">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
</select>
</div>
</div>
<div class="form-group">
<label for="inputEmail" class="col-lg-2 control-label"><i class="mdi mdi-cash-multiple"></i> Argent en Poche</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="money" value="<?= $donnees['money']; ?>">
</div>
</div>
<div class="form-group">
<label for="inputEmail" class="col-lg-2 control-label"><i class="mdi mdi-cash"></i> Compte Bancaire</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="bankbalance" value="<?= $donnees['bankbalance']; ?>">
</div>
</div>
<div class="form-group">
<label for="inputEmail" class="col-lg-2 control-label"><i class="mdi mdi-cash-100"></i> Argent Sale</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="dirtymoney" value="<?= $donnees['dirtymoney']; ?>">
</div>
</div>
<div class="form-group">
<label for="inputEmail" class="col-lg-2 control-label"><i class="mdi mdi-content-paste"></i> Métier du joueur</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="job" value="<?= $donnees['job']; ?>">
</div>
</div>
<div class="form-group">
<label for="select" class="col-lg-2 control-label"><i class="mdi mdi-chevron-double-up"></i> Grade LSPD</label>
<div class="col-lg-10">
<select class="form-control" id="select" name="police">
<option value="<?= $donnees['police'];?>">
<?php
switch($donnees['police'])
{
case 1:
echo 'Cadet';
break;
case 2:
echo 'Brigadier';
break;
case 3:
echo 'Sergent';
break;
case 4:
echo 'Lieutenant';
break;
case 5:
echo 'Capitaine';
break;
case 6:
echo 'Commandant';
break;
case 7:
echo 'Colonel';
break;
}?>
</option>
<option value="1">Cadet</option>
<option value="2">Brigadier</option>
<option value="3">Sergent</option>
<option value="4">Lieutenant</option>
<option value="4">Capitaine</option>
<option value="4">Commandant</option>
<option value="4">Colonel</option>
</select>
</div>
</div>
<input type="hidden" class="form-control" name="telephone" value="<?= $donnees['telephone']; ?>">
<div class="form-group">
<div class="form-group">
<div class="col-lg-10 col-lg-offset-2"><br>
<button type="submit" class="btn btn-primary"><i class="mdi mdi-content-save"></i> Enregistrer</button>
<button type="reset" class="btn btn-default"><i class="mdi mdi-cancel"></i> effacer</button>
</div>
</div>
</fieldset>
</form>
Jusque là tout va bien, ma page s'affiche, avec les valeurs attendues. Les complications vont arrivées une fois ce second formulaire soumis.
Lorsque que je vais modifier ( ou pas ) l'une des valeurs du formulaire, et que je soumets le formulaire, une erreur apparaît :
Voici donc mon 3ème fichier, qui est sensé UDPATE les valeurs en base :
<?php
if(isset($_POST['group']) && isset($_POST['permission_level']) && isset($_POST['money']) && isset($_POST['bankbalance']) && isset($_POST['dirtymoney']) && isset($_POST['job']) && isset($_POST['police']) && isset($_POST['nom']) && isset($_POST['prenom']) && isset($_POST['telephone']))
{
$req = $bdd->prepare('UPDATE `gta5_gamemode_essential`.`users` SET group = :group, permission_level = :permission_level, money = :money, bankbalance = :bankbalance, dirtymoney = :dirtymoney, job = :job, police = :police, nom = :nom, prenom = :prenom WHERE telephone = :telephone');
$req->execute(array(
'group' => $_POST['group'],
'permission_level' => $_POST['permission_level'],
'money' => htmlspecialchars($_POST['money']),
'bankbalance' => htmlspecialchars($_POST['bankbalance']),
'dirtymoney' => htmlspecialchars($_POST['dirtymoney']),
'job' => htmlspecialchars($_POST['job']),
'police' => $_POST['police'],
'nom' => htmlspecialchars($_POST['nom']),
'prenom' => htmlspecialchars($_POST['prenom']),
'telephone' => htmlspecialchars($_POST['telephone'])
));
echo "<div class=\"alert alert-dismissible alert-success\">
<button type=\"button\" class=\"close\" data-dismiss=\"alert\">×</button>
<h4><i class=\"mdi mdi-checkbox-marked-circle-outline\"></i> Information</h4>
<p>Modification effectuée avec succès.</p>
</div><br>";
}
?>
Et je ne comprend pas bien pour j'aurais un problème, au début j'ai pensé au fait que de mon fichier 1 à 3, les valeurs acquises en GET, seraient perdues, mais j'avoue que je suis un peu perdu là...
Merci d'avance à ceux qui ont le courage de tout lire, de comprendre, et de m'aider bien sûr :D
A bientôt !
J'ai trouvé le problème !
En fait, le nom de l'une de mes colonnes était un terme resérvé pour MySQL... Pour pouvoir inclure ces termes comme nom de table ou de colonne, il faut les entourer avec des accents graves. Cependant, une bonne pratique est de les utiliser sur tout les noms de colonnes.
Voici la liste des termes réservés de MySQL depuis la documentation de MySQL :
https://dev.mysql.com/doc/refman/5.7/en/keywords.html
Ma requête finale et fonctionnelle ressemble donc à ça :
UPDATE `users` SET `group` = :group, `permission_level` = :permission_level, `money` = :money, `bankbalance` = :bankbalance, `dirtymoney` = :dirtymoney, `job` = :job, `police` = :police, `nom` = :nom, `prenom` = :prenom WHERE `telephone` = :telephone;
Salut,
je crois que c'est parce-que tu essaies de modifier 2 tables en même temps, alors que tu ne précises pas à quelle table appartiennent les champs.
Si tu 'update' une seule table, alors oui tu peux donner les 'champs' comme ça,
mais si tu 'update' 2 tables en une seule requête, tu dois spécifier la table pour CHACUN des champs que tu mentionnes,
sous la forme : "nom_table.nom_champ" (au lieu de juste "nom_champ")
Je ne suis pas sûr de moi, c'est quelque chose que je n'ai pas l'habitude de faire.
Et puis ça me parait étrange les "`" (backquote), et le "." (point) pour séparer les tables.
Je les enlèverai, et je mettrai des 'alias'.
Genre :
$req = $bdd->prepare('UPDATE gta5_gamemode_essential g, users u SET g.group = :group, g.permission_level = :permission_level, u.money = :money, u.bankbalance = :bankbalance, ...
Ici dans l'exemple, j'ai CONSIDÉRÉ que les champs "group" et "permission_level" sont dans ta table "gta5_gamemode_essential",
et les champs "money", et "bankbalance" sont dans ta table "users".
Mais bien sur j'en sais rien hein, à toi de modifier pour que ça coïncide avec ta base de données.
Salut
Je ne crois pas qu'il essaie de modifier 2 tables en même temps, il a jsute précisé la BDD danas laquelle la table users se trouve.
Dans ta fonction execute, les clefs des paramètres doivent avoir le ':' (http://php.net/manual/fr/pdostatement.execute.php exemple #2), soit:
$req->execute(array(
':group' => $_POST['group'],
':permission_level' => $_POST['permission_level'],
':money' => htmlspecialchars($_POST['money']),
':bankbalance' => htmlspecialchars($_POST['bankbalance']),
':dirtymoney' => htmlspecialchars($_POST['dirtymoney']),
':job' => htmlspecialchars($_POST['job']),
':police' => $_POST['police'],
':nom' => htmlspecialchars($_POST['nom']),
':prenom' => htmlspecialchars($_POST['prenom']),
':telephone' => htmlspecialchars($_POST['telephone'])
)
);
Dis moi si c'est ça l'erreur ;)
Ah peut-être, je suis trop mauvais en SQL.
Ah ouais tiens, le manuel dis que tu as raison...
C'est bizarre moi j'ai toujours écris les clé entre "double quote", et SANS le ":"
Comme ça :
"group" => $_POST['group'],
Mais en même temps... L'erreur dit bien :
"...près de 'group' = 'owner'..."
On dirait que PHP (ou PDO) arrive à comprendre comme il l'a marqué :
'group' => $_POST['group'],
L'erreur ne semble pas venir d'ici.
J'essaierai bien ce que j'ai dis quand même pour voir.
A oui exact, j'avais pas vu (petite typo sur le screenshot ^^)
J'utilise quasiment plus PDO (les ORM c'est la vie !).
@G1.3
Salut :)
Alors, pour ce qui est des ":" devant le nom dans le execute, ce n'est pas le problème c'est sûr, car j'utilise déjà la même méthode pour le formulaire précédent, et aucune erreur est retournée.... :/
Personne d'autre n'a de solution ? :/
Bonsoir,
As-tu essayer de passer ta requête en " au lieu de ' car je vois owner est entourné de simple quote.