[RESOLU] problème php et mysql

Eléphanteau du PHP | 11 Messages

03 mars 2021, 22:54

Bonjour,
je viens de transférer sur mon hébergeur le site que je fais pour ma petite association..... Mais je rencontre un problème.
Celui-ci fonctionnait tout a fait bien avec mamp en local.... mais en l'hébergeant ailleurs j'ai un soucis que je n'arrive à résoudre.

La connexion à la bdd est bien bonne, car je peux créer de nouveaux adhérents depuis le site. Par contre cette partie la ne fonctionne pas, un extrait:

Code : Tout sélectionner

$req4=$db->prepare('SELECT * FROM adherent_'.$num_adherent.''); $req4->execute(); echo'<br><form action="ajout.php" method="post">'; echo '<h6>Choix du client:</h6><select name="choix_client">'; while($data4=$req4->fetch()){ echo '<option value="'.$data4['id'].'">'.$data4['nom_client'].' au '.$data4['adresse_client'].' '.$data4['CP_client'].' '.$data4['commune_client'].' - '.$data4['mail_client'].' - '.$data4['tel_client'].'</option>'; } echo '</select>';
Je suis sensé retrouvé les clients qui sont dans la bdd... Mais ça me met un menu déroulant vide sur l'hébergeur. C'est la partie $data4['xxx'] qui ne fonctionne pas, la page s'ouvre et s'affiche, sauf que la liste est vide et la suite de la page (des formulaires) qui suivent cette liste ne s'affiche pas.

Si je remplace par:

Code : Tout sélectionner

echo'<br><form action="ajout.php" method="post">'; echo '<h6>Choix du client:</h6><select name="choix_client">'; while($data4=$req4->fetch()){ echo '<option value="x">test</option>'; } echo '</select>';
Ma liste est composé de "test" autant de fois qu'il y a de clients dans la bdd... Donc elle il y a bien lecture. Mais pourquoi l'affichage des champs ne fonctionne pas ?! Comprend vraiment pas... car ça marche sur mon mamp en local..

Si quelqu'un peut m'aider..
Merci !!

Mammouth du PHP | 2703 Messages

03 mars 2021, 23:04

qu'est-ce que cela affiche (placé dans le while) ?
var_dump($data4);

Avatar du membre
Mammouth du PHP | 1609 Messages

03 mars 2021, 23:07

Salut, tu dois avoir une erreur que tu n'as pas en local pour x ou y raison. Commence par faire en sorte que les erreurs s'affichent ou essaie de voir si tu n'as pas un log d'erreurs sur le serveur.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 11 Messages

03 mars 2021, 23:08

Bonsoir et merci de me répondre ! Voici le retour
object(stdClass)#8 (7) { ["id"]=> string(1) "1" ["nom_client"]=> string(6) "DUPONT" ["adresse_client"]=> string(18) "rue de la corniche" ["commune_client"]=> string(8) "CHABEUIL" ["CP_client"]=> string(5) "26120" ["tel_client"]=> string(9) "475605040" ["mail_client"]=> string(17) "[email protected]" } object(stdClass)#9 (7) { ["id"]=> string(1) "2" ["nom_client"]=> string(6) "VALLON" ["adresse_client"]=> string(17) "impasse de la rue" ["commune_client"]=> string(7) "VALENCE" ["CP_client"]=> string(5) "26000" ["tel_client"]=> string(9) "604506040" ["mail_client"]=> string(13) "[email protected]" } object(stdClass)#8 (7) { ["id"]=> string(1) "3" ["nom_client"]=> string(11) "ROGER HENRI" ["adresse_client"]=> string(18) "chemin de la combe" ["commune_client"]=> string(17) "TOURNON SUR RHONE" ["CP_client"]=> string(4) "7300" ["tel_client"]=> string(9) "504030504" ["mail_client"]=> string(21) "[email protected]" } object(stdClass)#9 (7) { ["id"]=> string(1) "4" ["nom_client"]=> string(11) "TOUTOUFETTE" ["adresse_client"]=> string(14) "rue de la touf" ["commune_client"]=> string(7) "VILLAGE" ["CP_client"]=> string(5) "13210" ["tel_client"]=> string(9) "908070605" ["mail_client"]=> string(16) "[email protected]" } object(stdClass)#8 (7) { ["id"]=> string(1) "5" ["nom_client"]=> string(4) "oreo" ["adresse_client"]=> string(11) "chemin dune" ["commune_client"]=> string(17) "BOURG LES VALENCE" ["CP_client"]=> string(5) "26000" ["tel_client"]=> string(9) "405060302" ["mail_client"]=> string(11) "[email protected]" }

Avatar du membre
Mammouth du PHP | 1609 Messages

03 mars 2021, 23:12

Tu as visiblement des objets et non des tableaux associatifs (et surement une erreur non affichée qui aurait pu te guider). La syntaxe $data4['id'] n'est donc pas bonne et devrait être $data4->id.

Normalement quand tu ne déclares pas le fetch style tu devrais être en FETCH_BOTH et donc avoir un tableau mais en l'occurrence le serveur doit être configuré de sorte que tu es en FETCH_OBJ.

PS : chose étrange, le fetch style, "par défaut, vaut la valeur de PDO::ATTR_DEFAULT_FETCH_MODE (qui vaut par défaut la valeur de la constante PDO::FETCH_BOTH).". C'est modifiable en utilisant PDO::setAttribute mais je n'ai pas vu que cela puisse être configuré au niveau du serveur.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 11 Messages

04 mars 2021, 08:52

Bonjour, tout cela est un peu compliqué à mon triste niveau.
Le problème se produit selon toi à quel moment ? création base, table, insertion des données ? Sur phpmyadmin je ne vois pas de différence sur cette table....

Je suis paumé la dedans..

Mammouth du PHP | 688 Messages

04 mars 2021, 09:18

"La syntaxe $data4['id'] n'est donc pas bonne et devrait être $data4->id"

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 mars 2021, 11:57

Bonjour, tout cela est un peu compliqué à mon triste niveau.
Le problème se produit selon toi à quel moment ? création base, table, insertion des données ? Sur phpmyadmin je ne vois pas de différence sur cette table....

Je suis paumé la dedans..
Salutations !

Le problème est au niveau de l'appel à la méthode fetch() qui curieusement sur ton serveur, retourne le résultat de ta requête sous la forme d'un objet dont les noms des propriétés correspondent aux noms des colonnes, comme si tu avais explicitement codé $req4->fetch(PDO::FETCH_OBJ)

Comme indiqué par Saian, le comportement par défaut de cette méthode (quand aucun paramètre n'est passé) devrait correspond à ce que tu constates sur mamp : elle retourne un tableau indexé par les noms de colonnes et aussi par les numéros de colonnes. Et il est effectivement étonnant que ce ne soit pas le cas. Cela laisse supposé que l'attribut PDO::ATTR_DEFAULT_FETCH_MODE a été modifié sur le serveur pour avoir comme valeur par défaut PDO::FETCH_OBJ au lieu de PDO::FETCH_BOTH.

Idéalement il faudrait savoir ce qui cause ce changement, mais à défaut pour résoudre le problème rapidement, tu peux modifier ton fetch en passant explicitement la valeur $req4->fetch(PDO::FETCH_FETCH_ASSOC), pour retourner un tableau indexé par nom de colonne uniquement comme tu sembles l'attendre.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Mammouth du PHP | 1609 Messages

04 mars 2021, 12:42

Je suis d'accord avec Ryle, le plus simple pour remédier à ton problème est de définir explicitement le fetch style à PDO::FETCH_ASSOC lors de l'appel du fetch.

Tu peux sinon dans ton script de connexion à la base de données, juste après le new PDO (qui est à priori de la forme $db = new PDO(...) d'après le $db->prepare) tenter un :
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
ça s'appliquerait ainsi à tous les fetch sans avoir à le spécifier.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 11 Messages

04 mars 2021, 21:02

Bonsoir,

J'ai consulté mon fichier db.php.... Et j'ai trouvé cela

Code : Tout sélectionner

<?php session_start(); try{ $db = new PDO('mysql:hos=localhost;dbname=z', 'y', 'x', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => true, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, ]); } catch(Exception $e){ die('Erreur : '.$e->getMessage()); }
Pour autant si je met ASSOC ou BOTH au lieu de OBJ, je ne peux du coup plus me connecter tout court à mon interface d'administration, vu l'erreur le code n'accède plus aux identifiants donc a priori ce n'est pas une solution miraculeuse.... Je tente de suite le remplacement par le changement de syntaxe.

Merci à tous pour votre aide

Eléphanteau du PHP | 11 Messages

04 mars 2021, 21:16

Alors en changeant la syntaxe, cela fonctionne j'ai bien l'affichage dans ma liste déroulante.
Cependant le formulaire qui suit et qui enregistre dans une table ne fonctionne plus dorénavant... J'ai changé la syntaxe des quelques data qui se trouvent dans le traitement du formulaire... Mais non....
Moi qui était fier de mon résultat malgré ma méconnaissance, je pensais pas buter sur autant de difficulté en transférant un site fonctionnel -.-

Eléphanteau du PHP | 11 Messages

04 mars 2021, 21:23

Je suis vraiment une buse en faite......
Avant la migration, j'avais toujours la connexion en doublon dans mes php

Code : Tout sélectionner

try { $bdd = new PDO('mysql:host=localhost;dbname=membres;charset=utf8', 'test', 'test'); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); }
que j'ai supprimé sur chaque page pour ne pas avoir à mettre à jour sur chacune des pages le nom de la base et les identifiants en migrant le site, comme j'avais aussi un fichier db.php.
Sauf que le fichier db contenait ce que je vous ai copié sur un message précédent, pourquoi je ne sais pas.
A cet instant j'ai simplement remplacé le contenu de db.php par ce que je viens de vous montrer, remis la syntaxe originale et évidemment cela fonctionne.

Sur mamp, malgré le db.php comme j'avais à chaque page de nouveau la connexion "correcte", cela prenait la main sur le db.php erroné....

#-o #-o #-o

Avatar du membre
Mammouth du PHP | 1609 Messages

04 mars 2021, 21:51

Ok tout s'explique donc, ce n'était pas un problème de configuration serveur mais bien du script de connexion. :P
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 11 Messages

05 mars 2021, 18:57

Bonsoir!
La vie n'est pas un long fleuve tranquille... Me voila arrivé à faire fonctionner l'envoi de mail par le serveur en cas de perte de mot de passe.... Que j'ai un problème. Impossible de me connecter avec le nouveau mot de passe, ni l'ancien... Pourtant je regarde la base est le mdp crypté change lors de l'opération. Je bidouille mon accès administrateur à l'interface pour accéder à ma page de création d'un nouvel utilisateur, il s'ajoute bien à la bdd niquel... Impossible de se connecter non plus !
Après 40min à regarder tous les fichiers... Auquel je n'avais de toute façon pas touché, je me dis..... Et si je remet mon db.php comme initialement, et bingo! la connexion remarche.
Il y a de quoi devenir chèvre, car évidemment tout le reste ne fonctionne plus !! Je crois avoir mon idée.... faire une connexion $dbet $bdd par exemple avec la syntaxe qui va pour la connexion, et tout le reste avec celle dernièrement essayé.

Allez j'espère que vous ne me reverrez pas, ce sera bon signe pour moi! et pour vous ! :D

Eléphanteau du PHP | 11 Messages

06 mars 2021, 11:20

Bonjour,
je suis bien désolé de vous contacter à nouveau... 1h en étant gentil que je n'arrive pas à faire quelque chose, qui pourtant .....!!!
Je ne sais si c'est une bonne idée mais je vous transmet le code en entier. Je voudrais que lorsque le champ mail_client n'est pas remplit, soit automatiquement mis dans la bdd le mail de l'adhérent, pioché dans la table info_adherents.
Je tourne le truc dans tous les sens, mais la reprise de la variable $mail ne fonctionne pas dans mon insert into et cela ne fonctionne donc pas.
Pour autant en bas de code au milieu du formulaire, echo $mail; me retourne bien le mail... Je vais devenir fou avec ça :roll:
Si quelqu'un a quelques minutes de temps à perdre à jeter un coup d'oeil...

Code : Tout sélectionner

<?php require('db.php'); if(empty($_SESSION['user'])) { header('Location: login.php'); } require 'vendor/autoload.php'; use Intervention\Image\ImageManagerStatic as Image; Image::configure(array('driver' => 'imagick')); $user = $_SESSION['user']; $title = "Ajout d'un client"; $num_adherent = $user->id; $adherent = 'Numéro adhérent: '.$user->id; if(!empty($_POST)) { $post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); extract($post); $errors = []; if(!empty($_POST["mail_client"])) { if(!empty($_POST["nom_client"] && $_POST["adresse_client"] && $_POST["CP_client"] && $_POST["commune_client"])) { if(empty($errors)) { $req3 = $bdd->prepare('INSERT INTO clients_particuliers (nom_client, adresse_client, commune_client, CP_client, tel_client, mail_client, id_adherent) VALUES (:nom_client, :adresse_client, :commune_client, :CP_client, :tel_client, :mail_client, '.$num_adherent.') '); $req3->bindValue(':nom_client', $nom_client, PDO::PARAM_STR); $req3->bindValue(':adresse_client', $adresse_client, PDO::PARAM_STR); $req3->bindValue(':commune_client', $commune_client, PDO::PARAM_STR); $req3->bindValue(':CP_client', $CP_client, PDO::PARAM_STR); $req3->bindValue(':tel_client', $tel_client, PDO::PARAM_STR); $req3->bindValue(':mail_client', $mail_client, PDO::PARAM_STR); $req3->execute(); unset($errors, $nom_client, $adresse_client, $tel_client, $mail_client, $CP_client, $commune_client); $success = 'Les coordonnées de votre nouveau client sont ajoutés, nous vous invitons à réaliser votre<a href="ajout.php"> devis</a>.'; } } }else{ if(!empty($_POST["nom_client"] && $_POST["adresse_client"] && $_POST["CP_client"] && $_POST["commune_client"])) { if(empty($errors)) { $req0=$db->prepare('SELECT * FROM info_adherents WHERE id = '.$num_adherent.''); $req0->execute(); $data=$req0->fetch(); $mail = ''.$data['mail_adherent'].''; $req3 = $bdd->prepare('INSERT INTO clients_particuliers (nom_client, adresse_client, commune_client, CP_client, tel_client, mail_client, id_adherent) VALUES (:nom_client, :adresse_client, :commune_client, :CP_client, :tel_client, '.$mail.', '.$num_adherent.') '); $req3->bindValue(':nom_client', $nom_client, PDO::PARAM_STR); $req3->bindValue(':adresse_client', $adresse_client, PDO::PARAM_STR); $req3->bindValue(':commune_client', $commune_client, PDO::PARAM_STR); $req3->bindValue(':CP_client', $CP_client, PDO::PARAM_STR); $req3->bindValue(':tel_client', $tel_client, PDO::PARAM_STR); //$req3->bindValue(':mail_client', $mail_client, PDO::PARAM_STR); $req3->execute(); unset($errors, $nom_client, $adresse_client, $tel_client, $mail_client, $CP_client, $commune_client); $success = 'Les coordonnées de votre nouveau client sont ajoutés, nous vous invitons à réaliser votre<a href="ajout.php"> devis</a>.'; } } } }else { array_push($errors, 'Veuillez remplir tous les renseigments client. <br>Si votre client ne possède pas de mail, veuillez entrer le votre pour la transmission des différents documents liés à cette prestation'); } ?> <?php include('header.php');?> <h2><?=$title;?></h2> <?php include('messages.php');?> <br><br><br><br><br> <h6><FONT color="red">Vous devez remplir tous les champs et si votre client n'a pas de mail connu, entrez votre mail pour recevoir les documents liés à ce client</font></h6> <?php $req0=$db->prepare('SELECT * FROM info_adherents WHERE id = '.$num_adherent.''); $req0->execute(); $data=$req0->fetch(); $mail = $data['mail_adherent']; echo $mail; ?> <br> <form action="nouveau_client.php" method="post"> <div class="form-group row"> <input type="text" name="nom_client" class="form-control champs375" placeholder="Nom client" value="<?= $nom_client ?? '';?>"> <input type="email" name="mail_client" class="form-control champs300" placeholder="Mail client" value="<?= $mail_client ?? '';?>"> <input type="tel" pattern="[0-9]{10}" name="tel_client" class="form-control champs300" placeholder="Tel client" value="<?= $tel_client ?? '';?>"> </div> <div class="form-group row"> <input type="text" name="adresse_client" class="form-control champs500" placeholder="Adresse client" value="<?= $adresse_client ?? '';?>"> <input type='number_format' maxlength="5" minlength="5" name="CP_client" class="form-control champs175" placeholder="Code postal client" value="<?= $CP_client ?? '';?>"> <input type="text" name="commune_client" class="form-control champs300" placeholder="Commune client" value="<?= $commune_client ?? '';?>"> </div> <button type="submit" class="btn btn-primary">Enregistrer</button> </form> <?php include('footer.php');?>