Pb d'enregistrement

Eléphant du PHP | 166 Messages

05 mars 2017, 14:10

Bonjour
Mon code :

Code : Tout sélectionner

<!-- Formulaire --> <div id="cadre1"> <h1>Chercher une ville</h1> <form method="post"> <p>Nom de la ville : <input type="text" name="ville_nom" /></p> <p><input type="submit" value="valider" /></p> </form> <h3>Ville trouvé :</h3><?php // Vérification du $_POST, si vide if (empty($_POST['ville_nom'])) // Si OUI {echo '<h1>Pas de ville correspondante !</h1>';} else { // Si NON, connection à la base require ('inc_connexion.php'); // Récupération du POST $city_name = $_POST['ville_nom']; // Recherche de la ville, si existante ! if ($result = $mysqli->query ('SELECT * FROM villes WHERE ville_nom LIKE ("'.$city_name.'")')); while ($row = $result->fetch_array()){ $ville_id = $row['ville_id']; $ville_nom = $row['ville_nom']; $ville_detail = $row['ville_detail']; // Affichage en forme de lien echo '<a href="index.php">' .$ville_id. ' - ' .$ville_nom. '</a>'; // Enregistrement des recherches "valide" if ($ville_nom = $city_name) {$mysqli -> query('INSERT INTO user (user_search) VALUES ("'. $ville_nom .'")');} } // Libération des résultats $result->free(); // Fermeture de la connexion $mysqli->close(); } ?>
le soucis est que quand je recherche une ville, je la trouve, et ensuite je valide, cela devrait l'enregistrer dans ma table "user", et bien là non ?

Eléphanteau du PHP | 35 Messages

05 mars 2017, 17:07

Bonjour quattro,

Dans ta requète ou tu inserts dans ta base de données
if ($ville_nom = $city_name) {$mysqli -> query('INSERT INTO user (user_search) VALUES ("'. $ville_nom .'")');}
   }
Je pense que tu devrais remplacer le query par exec :
if ($ville_nom = $city_name) {$mysqli ->exec('INSERT INTO user (user_search) VALUES ("'. $ville_nom .'")');}
   }
Programmation - tuto pour débutant fait par un débutant -> http://mycodingway.com/

Eléphant du PHP | 166 Messages

05 mars 2017, 17:43

Merci
Mais là il me met une erreur.
Fatal error: Call to undefined method mysqli::exec()
de plus cela fonctionnait bien avant avec mon code, j'ai juste rajouter un champ dans ma table, et plus rien??

Eléphanteau du PHP | 35 Messages

05 mars 2017, 17:59

C'est plutôt étrange j'utilisais toujours exec pour mes requêtes d'insertions.

Donc tu dis qu'avant cela fonctionnait mais maintenant ça ne fonctionne plus depuis que tu as ajouté un champ. Dans ce cas il se peut que le champ que tu as ajouté doit nécessité une valeur qui ne peut être valeur null par défault.
Programmation - tuto pour débutant fait par un débutant -> http://mycodingway.com/

Mammouth du PHP | 1967 Messages

06 mars 2017, 10:11

Il faut que tu affiche les erreurs si il y en a, si rien ne se passe, il y a probablement des message d'erreur qui s'affihce pas.

de plus, dans ton if c'est un double = qu'il faut pour une comparaison sinon c'est une assignation de variable
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 166 Messages

06 mars 2017, 10:19

Merci
Comment affiche t'on les erreurs ?

Mammouth du PHP | 1967 Messages

06 mars 2017, 10:20

Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

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

06 mars 2017, 11:21

salut,

A priori tu as un problème de conception.
La table user devrait faire référence à un utilisateur. Que tu y associé une recherche pourquoi pas mais il faut quand même savoir à quel utilisateur cette recherche "appartient".
pour moi il serait logique que ta requête soit un update plutôt qu'un insert.
et pour aller plus loin, vu que tu as plusieurs ville a insérer tu devrais avoir une table à part (user_research par exemple) dans laquelle tu insères les résultat avec l'id de l'utilisateur pour la référence à l'utilisateur.
c'est simple et facile à utiliser. ton modèle reste clair tu as tout à y gagner ;)

sinon, il est fort probable que ta table est pus d'un champs et que donc tu ai une erreur SQL. Regarde la doc de query il y a un (de mémoire) un exemple de gestion des erreurs (avec un try catch).

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 166 Messages

06 mars 2017, 12:28

Merci
J'ai déjà une table "ville" ou les champs sont pré-remplie. Ensuite l'utilisateur cherche une ville. Si elle existe, elle s'affiche et ensuite j'enregistre la recherche dans la table "user", c'est là que sa coince.
Moogli , je pense que ce que tu me décris au dessus, c'est se que je fais déjà?
Je regarde se soir les différentes propositions
Merci

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

06 mars 2017, 13:10

je ne pense pas tu sembles vouloir enregistrer une sélection de ville(s) pour un utilisateur or tu as des utilisateur et des villes mais pas jointure en les deux

après sans le modèle SQL c'est juste de supposition non ne sommes pas (enfin en tout cas) omniscient :)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 166 Messages

06 mars 2017, 23:51

Je bloque complet, j'ai fait ce bout de code :

Code : Tout sélectionner

<!-- Formulaire --> <div id="cadre1"> <h1>Chercher une ville</h1> <form method="post"> <p>Nom de la ville : <input type="text" name="ville_nom" /></p> <p><input type="submit" value="valider" /></p> </form> <h3>Ville trouvé :</h3> <?php error_reporting(E_ALL); // Vérification du $_POST, si vide if (empty($_POST['ville_nom'])) // Si OUI {echo '<h1>Pas de ville correspondante !</h1>';} else { // Si NON, connection à la base require ('inc_connexion.php'); // Récupération du POST $city_name = $_POST['ville_nom']; // Recherche de la ville, si existante ! if ($result = $mysqli->query ('SELECT * FROM villes WHERE ville_nom LIKE ("'.$city_name.'")')); while ($row = $result->fetch_array()){ $ville_id = $row['ville_id']; $ville_nom = $row['ville_nom']; $ville_detail = $row['ville_detail']; // Affichage en forme de lien echo '<a href="index.php">'.$ville_id. '-' .$ville_nom. '-(' .$ville_detail. ')' .'</a>'; // Jointure des tables "villes et user" $result = $mysqli->query ('SELECT * FROM villes INNER JOIN user'); // Enregistrement des recherches dans la table "user" $result = $mysqli -> query('INSERT INTO user (user_id,user_search,ville_id) VALUES ("'. $ville_id .'","'. $ville_nom .'","'. $ville_detail .'")'); } // Libération des résultats $result->free(); // Fermeture de la connexion $mysqli->close(); } ?>
cela me met une erreur : Fatal error: Call to a member function fetch_array() on boolean

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

07 mars 2017, 10:41

met des {} pour les structures de contrôle dont ton if.
la ton ; finit le if et du coup ton while n'est pas conditionné par le if.

Même pour une seule ligne dans le if il faut mettre les {} cela permet vraiment une meilleur lecture et évite ce genre problème.

pour info le message indique que $result n'est pas un objet, c'est donc que la requête SQL se passe pas et que donc il faut vérifier le message d'erreur fournit par mysql.

pense aussi à indenter ton code, toujours pour la lisibilité du code. Un IDE ou un éditeur de texte avancé (atom, sublimtext, visual sutio code etc.) te feras le boulot facilement.

quand je vois cela

Code : Tout sélectionner

'INSERT INTO user (user_id,user_search,ville_id) VALUES ("'. $ville_id .'","'. $ville_nom .'","'. $ville_detail .'")'
je vois : une erreur de conception, si il y a l'id de la ville tu n'as pas besoin du détails ou quoi que ce soit d'autre tu le retouve facilement avec une jointure.

tu insères
- ville_id dans user_id O_o ça te choque pas toi ?
- ville_detail dans une colonne qui s'appel ville_id y'a de grande chances que ça coince (genre un gros problème de type texte => entier)
donc vire la colonne user_search et garde seulement ville_id

Tu écrase $result dans la boucle while avec ton insert. Tu ne risque donc pas d'avoir plus d'un seul enregistrement dans user (si c'est ce que tu souhaite vire le while).

utilise les requêtes préparée cela t'éviteras des soucis et rendras le code plus clair.
http://php.net/manual/fr/mysqli.prepare.php
http://php.net/manual/fr/mysqli-stmt.bind-param.php
voilà a quoi peux ressembler ton code
<!-- Formulaire -->
<div id="cadre1">
   <h1>Chercher une ville</h1>
   <form method="post">
   <p>Nom de la ville : <input type="text" name="ville_nom" /></p>
   <p><input type="submit" value="valider" /></p>
   </form>

<h3>Ville trouvé :</h3>
<?php
   error_reporting(E_ALL);
   // Vérification du $_POST, si vide
if (empty($_POST['ville_nom'])) {
    echo '<h1>Pas de ville correspondante !</h1>';
} else {
   // Si NON, connection à la base
    require ('inc_connexion.php');
    $stmtInsert = $mysqli->prepare('INSERT INTO user_ville(user_id, ville_id) values('.$mysqli->real_escape_string($_SESSION['user_id']).',?)');
    $villeID = null;
    $stmtInsert->bind_param('i',$villeID);
   // Recherche de la ville, si existante !
   $sql = 'SELECT ville_id, ville_nom, ville_detail FROM villes WHERE ville_nom LIKE ("'.$mysqli->real_escape_string($_POST['ville_nom']).'")';
    if ($result = $mysqli->query ($sql)) {
        while ($row = $result->fetch_array()) {
            // y sert pas a grand chose ce lien faudrait p'tet lui donner des paramètres ?
            echo '<a href="index.php">'.$row['ville_id']. '-' .$row['ville_nom']. '-(' .$row['ville_detail']. ')' .'</a>';
            $villeID = $row['ville_id'];
            $stmtInsert->execute();
        }
        // Libération des résultats
        $result->free();
        // fermeture de la requête préparée
        $stmtInsert->close();
        // Fermeture de la connexion
        $mysqli->close();
    }else{
        echo '<div class="error sql">Erreur SQL : <br/>',$mysqli->error(),'<br /><br/>Avec la requête<code>',$sql,'</code></div>';
    }
}
j'ai supposé que lorsqu'un utilisateur est connecté il y a une variable de session $_SESSION['user_id'] pour savoir qui est connecté.

pour finir je persiste tu a un problème de conception, c'est pour cela que la table où je fait l'insertion s'appelle user_ville.

si tu veux ajouter une ville à un utilisateur (existant), alors dans ce cas ce n'est pas une insertion qu'il faut faire mais une requête de mise à jour : UPDATE. Dans ce cas la colonne ville_id suffit et une jointure sur la table des villes permet de sélectionner la ville en même temps que le reste des infos utilisateurs ;)


@+
Il en faut peu pour être heureux ......