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
@+
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]'INSERT INTO user (user_id,user_search,ville_id) VALUES ("'. $ville_id .'","'. $ville_nom .'","'. $ville_detail .'")'[/code]
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
[php]<!-- 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>';
}
}[/php]
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 : [url=http://sqlpro.developpez.com/cours/sqlaz/dml/#LIV]UPDATE[/url]. 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 ;)
@+