[RESOLU] AJOUTER UNE VILLE EN LUI ASSOCIANT LE PAYS PAR FORMULAIRE

Eléphanteau du PHP | 24 Messages

28 janv. 2021, 15:05

Bonjour, j'ai une table villes et une table pays :

- Dans la table villes, j'ai des colonnes intitulés ville_id, ville_nom, ville_texte et pays_id.

- Dans la table pays, j'ai des colonnes intitulés pays_id et pays_nom.

Comment puis-je rentré dans le champs pays_id de la table villes le numéro correspondant au pays par formulaire ?

Merci d'avance & bonne journée.

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

28 janv. 2021, 15:30

Salutations !

Je comprends bien que tu veux mettre à jour ta table de ville avec l'id pays qui convient, mais je ne suis pas certain de bien comprendre comment tu veux le faire. En fait il te faut déterminer pour chaque ville dans quel pays elle se trouve, aller chercher dans ta table pays l'id correspondant et l'insérer dans ta table des villes... après dire à quel moment intervient ton formulaire, je vois pas trop...

Tu veux faire un formulaire qui liste toutes les villes et propose une liste de pays qui permet à utilisateur d'associer le bon pays à chaque ville ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 24 Messages

28 janv. 2021, 16:41

quand je veux ajouter une ville dans la table villes à partir de l'administration par formulaire, je ne peux pas parce que je dois renseigné le champs pays_id. C'est la que ça bloque.

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

28 janv. 2021, 19:02

Dans ton formulaire d'ajout de ville, ajoute un menu déroulant contenant la liste des pays que tu as dans table pays. Pour chaque option de ce select utilise le pays_id :
<option value="<?php echo ... 'pays_id' ... ?>"> <?php echo ... 'pays_nom' ... ?> </option>

Au moment où tu enregistres ta ville, tu recevras ainsi également le pays_id dy pays que tu as sélectionné et tu pourras l'enregistrer dans ta table :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 24 Messages

29 janv. 2021, 16:19

Bonjour, J'ai fait exactement ce que vous m'avez dit de faire, mais J'ai ce message d'erreur :

Fatal error: Uncaught Exception: PAYS_ID doit être un entier.L'objet ne peut pas être créé. in C:\wamp64\www\villes-site-en-poo-et-pdo\class\Ville.php on line 27

Exception: PAYS_ID doit être un entier.L'objet ne peut pas être créé. in C:\wamp64\www\villes-site-en-poo-et-pdo\class\Ville.php on line 27

Besoin d'aide, merci d'avance & bonne journée.

voici mon code :

process/process-ajout-ville.php
require('../includes/inc-connexion.php');
require('../class/Ville.php');
require('../class/villeManager.php');

if(isset($_POST['submit_form'])) {

	$ville_nom_form = trim($_POST['ville_nom_form']);
	$ville_texte_form = trim($_POST['ville_texte_form']);
	$pays_id_form = trim($_POST['pays_id_form']);

	if((empty($ville_nom_form)) OR empty($ville_texte_form) OR !isset($pays_id_form)) {

		$message = '<p class="error">Veuillez remplir tous les champs !</p>';
	}
	else {

		$ville_data = array(
            
            'ville_id' => 1,
			'ville_nom' => $ville_nom_form,
			'ville_texte' => $ville_texte_form,
			'pays_id' => $pays_id_form
		);

		$city_data = new Ville($ville_data);

		$manager = new villeManager($db);
	    
	    if(!$manager->getVilleExiste($ville_nom_form)) {

	    	$manager->insertVille($city_data);

	    	$message = '<p class="success">La ville ' . $ville_nom_form . ' a bien été ajouté !</p>';
	    }
	    else {

	    	$message = '<p class="error">La ville ' . $ville_nom_form . ' n\'a pas été ajouté !</p>';
	    }
	}
}
admin/ajout.php
<head>
	<title>Ajouter une ville</title>
	<meta charset="utf-8">
	<link rel="stylesheet" href="css/style.css">
</head>

<body>
	<div id="wrapper">
		<div id="container_add">
			<h1>ajouter une ville</h1>
		    <form method="post" action="">
		    	<p>Nom de la ville : <input type="text" id="ville_nom_form" name="ville_nom_form"></p> 
            
                <p>Texte de présentation<br>
                	<textarea name="ville_texte_form" cols="75" rows="25"></textarea> 
                </p>

                <p>
                	<label>Choisissez le pays : </label>
				    <select name="pays_id_form">
				    	<?php if(!empty($pays_data)) : ?>
	                        <?php foreach($pays_data as $pays) : ?>
	                        	<option value="<?php echo $pays['pays_id']; ?>"><?php echo $pays['pays_nom']; ?></option>
	                        <?php endforeach; ?>
	                    <?php endif; ?>
				    </select>
                <p><input type="submit" id="submit_form" name="submit_form" value="valider"></p>
            </form>

            <?php if(isset($message)) echo $message; ?>
        </div>
    </div>
</body>
class/Ville.php
class Ville {

    private $_ville_id;
	private $_ville_nom;
	private $_ville_texte;
    private $_pays_id;

    private static $error;

    const MSG_ERROR_VILLE_ID = 'VILLE_ID doit être un entier.';
    const MSG_ERROR_VILLE_NOM = 'VILLE_NOM doit être une chaîne de caractères.';
    const MSG_ERROR_VILLE_TEXTE = 'VILLE_TEXTE doit être une chaîne de caractères.';
    const MSG_ERROR_PAYS_ID = 'PAYS_ID doit être un entier.';
    const MSG_ERROR_END = 'L\'objet ne peut pas être créé.';
			
	public function __construct(array $data) {

        $this->setVilleId($data['ville_id']);
        $this->setVilleNom($data['ville_nom']);
        $this->setVilleTexte($data['ville_texte']);
        $this->setPaysId($data['pays_id']);

        if(!empty(self::$error)) {

            throw new Exception(self::$error . self::MSG_ERROR_END);
        }
    }

    public function setError($msg) {

        self::$error = $msg;
    }
 
    public function getError() {

        return self::$error;
    }
 
    public function setVilleId($ville_id) {

        if((is_int($ville_id)) AND ($ville_id > 0)) {

            $this->_ville_id = $ville_id;
        }
        else {

            $this->setError(self::MSG_ERROR_VILLE_ID);
        }
    }
 
    public function setVilleNom($ville_nom) {

        if(is_string($ville_nom)) {

            $this->_ville_nom = $ville_nom;
        }
        else {

            $this->setError(self::MSG_ERROR_VILLE_NOM);
        }
    }
 
    public function setVilleTexte($ville_texte) {

        if(is_string($ville_texte)) {

            $this->_ville_texte = $ville_texte;
        }
        else {

            $this->setError(self::MSG_ERROR_VILLE_TEXTE);
        }
    }

    public function setPaysId($pays_id) {

        if((is_int($pays_id)) AND ($pays_id > 0)) {

            $this->_pays_id = $pays_id;
        }
        else {

            $this->setError(self::MSG_ERROR_PAYS_ID);
        }
    }
 
    public function getVilleId() {

        return $this->_ville_id;
    }
 
    public function getVilleNom() {

        return $this->_ville_nom;
    }
 
    public function getVilleTexte() {

        return $this->_ville_texte;
    }

    public function getPaysId() {

        return $this->_pays_id;
    }
}
class/villeManager.php
class villeManager {

	private $_db;

	public function __construct($db) {

		$this->setDb($db);
	}

	public function setDb(PDO $dbh) {

		$this->_db = $dbh;
	}
        
        public function getVilleExiste($ville_nom) {

        $sql = 'SELECT ville_nom FROM villes WHERE ville_nom = :ville_nom';

        $stmnt = $this->_db->prepare($sql);

        $stmnt->execute(

            array(

                ':ville_nom' => $ville_nom
            )
        );

        $count = $stmnt->rowCount();

        if($count > 0) {

            return true;
        }
        else {

            return false;
        }
    }

    public function insertVille(Ville $ville) {

        $sql = 'INSERT INTO villes (ville_nom, ville_texte, pays_id) VALUES (:ville_nom, :ville_texte, :pays_id)';

        $ville_nom = htmlspecialchars($ville->getVilleNom());
        $ville_texte = htmlspecialchars($ville->getVilleTexte());
        $pays_id = $ville->getPaysId();

        $stmnt = $this->_db->prepare($sql);

        $stmnt->bindParam(':ville_nom', $ville_nom);
        $stmnt->bindParam(':ville_texte', $ville_texte);
        $stmnt->bindParam(':pays_id', $pays_id);

        $stmnt->execute();
    }

Mammouth du PHP | 2703 Messages

29 janv. 2021, 16:24

<option value="<?php echo $pays['pays_id']; ?>"><?php echo $pays['pays_nom']; ?></option>
quel est le html généré par ce code ?

Eléphanteau du PHP | 24 Messages

29 janv. 2021, 17:01

Je n'ai pas compris le sens de votre question.

Eléphanteau du PHP | 24 Messages

29 janv. 2021, 17:58

J'ai réussi à trouver :

process/process-ajout-ville.php
require('../includes/inc-connexion.php');
require('../class/Ville.php');
require('../class/villeManager.php');

if(isset($_POST['submit_form'])) {

  $ville_nom_form = trim($_POST['ville_nom_form']);
  $ville_texte_form = trim($_POST['ville_texte_form']);
  $pays_id_form = trim($_POST['pays_id_form']);

  if((empty($ville_nom_form)) OR empty($ville_texte_form) OR !isset($pays_id_form)) {

    $message = '<p class="error">Veuillez remplir tous les champs !</p>';
  }
  else {

    $ville_data = array(
            
            'ville_id' => 1,
      'ville_nom' => $ville_nom_form,
      'ville_texte' => $ville_texte_form,
      'pays_id' => (int) $pays_id_form
    );

    $city_data = new Ville($ville_data);

    $manager = new villeManager($db);
      
      if(!$manager->getVilleExiste($ville_nom_form)) {

      	$manager->insertVille($city_data);

      	$message = '<p class="success">La ville ' . $ville_nom_form . ' a bien été ajouté !</p>';
      }
      else {

      	$message = '<p class="error">La ville ' . $ville_nom_form . ' n\'a pas été ajouté !</p>';
      }
  }
}

Mammouth du PHP | 2703 Messages

29 janv. 2021, 18:04

https://www.php.net/manual/fr/function.is-int.php
" Pour tester si une variable est un nombre ou une chaîne numérique (comme les entrées de formulaire, qui sont toujours des chaînes), vous devez utiliser la fonction is_numeric(). "

Eléphanteau du PHP | 24 Messages

29 janv. 2021, 18:12

Ok merci pour l'info bon week-end à vous