plusieurs date dans la même colonne PMA est ce possible ?

Mammouth du PHP | 643 Messages

01 juil. 2018, 11:35

Bonjour tout le monde.
Voilà j'avance un peu mais je suis confronté à un petit soucis.
Dans mon csv que je lis il y a une colonne date_debut_sortie qui renvoie par exemple : 25/12/2018 pas de problème.

Mais j'ai également des résultats sous la forme : 16/07/2018 | 23/07/2018 | 30/07/2018 | 06/08/2018
Du coup j'aimerais savoir comment traiter ce type de résultat aux mieux.

Dois je faire un explode et séparer les différentes date et faire par exemple 4 champ Date ou puis je tout mettre dans la même colonne ?

Mon code actuel avec l'essentiel:
<?php
    include("include/conndb.php");
    include("include/variables.php");
	$fichier = 'bretagne.csv';
	$csv = new SplFileObject($fichier);
	$csv->setFlags(SplFileObject::READ_CSV);
	$csv->setCsvControl(';');

      $num_ligne = 0; // Valeur de ligne par defaut
		
	// Parcourt du fichier CSV + stockage variables
	foreach($csv as $ligne){
	$num_ligne ++; // Incrémentation

$date_debut_sortie =  addslashes($ligne[19]);
	// Début de l'évènement
	$date_debut_sortie = date_create_from_format('d/m/Y',$date_debut_sortie);
	$date_debut_sortie = date_format($date_debut_sortie, 'Y-m-d');
		
		if(empty($date_debut_sortie)) {
		$date_debut_sortie = NULL;
		}else{
			$date_debut_sortie = $date_debut_sortie;
		}
		
		
	if($num_ligne>1 ) {
	
	// Insertion
    $req = $bdd->prepare("INSERT INTO `loisirs` (id_simply_user,titre,phone,email,city,rue,postcode,descriptif,date_debut_sortie) VALUES ('$id_simply_user','$titre','$phone','$email','$city','$rue','$postcode','$descriptif','$date_debut_sortie')");
    $req->execute(array(
             		  'id_simply_user'=>$id_simply_user,
                      'titre'=>$titre,
					  'phone'=>$phone,
					  'email'=>$email,
					  'city'=>$city,
					  'rue'=>$rue,
					  'postcode'=>$postcode,
					  'descriptif'=>$descriptif,
					  'date_debut_sortie'=>$date_debut_sortie
					  
                      )) or die('Problème lors de l\'insertion');
		}
	}
Merci pour le coup de pouce

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

01 juil. 2018, 12:37

Hello,

Tout dépend de l'utilisation que tu vas en faire ensuite.
Si c'est juste pour de l'affichage, alors tu peux stocker cette info dans un seul champ par exemple au format JSON.
En revanche, si tu compte faire des recherches sur ces dates ou proposer des filtres de date à tes visiteurs, alors il faut que tu le mettes dans des champs séparés.

Si le nombre de dates possible est limité (3, 4 par exemple) alors tu peux créer 3 ou 4 champs date attaché à ton évènement, ce n'est pas le plus optimisé techniquement mais ça te simplifiera la vie pour faire tes requêtes en limitant le besoin de jointure.
En revanche, si le nombre de date peut fluctuer ou dépasse les 4, alors il faut que tu crées une autre table evenement_dates par exemple dans laquelle tu va créer un enregistrement par date attaché à un id_evenement
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 643 Messages

01 juil. 2018, 23:14

Oui effectivement en fait, j'ai des évènement avec jusqu'à 20 Dates....
Donc je pense partir sur le choix le plus complexe en créant une table evenement_dates.
Je ne sais pas trop comment faire correspondre le tout mais bon...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

01 juil. 2018, 23:44

chaque évènement a un ID unique dans ta table, non ?
Si non, alors tu ajoute une colonne id_evenement en INT avec un AUTO_INCREMENT, ça va leur en attribuer automatiquement au moment de l'insertion d'un nouvel évènement.
Puis dans ta table evenement_dates, tu crée une colonne id_evenement également dans laquelle tu stockera l'identifiant de l'évènement à laquelle cette date correspond.

Ensuite tu fais une jointure entre les 2 tables dans une requête SQL pour avoir toutes les dates et toutes les infos d'un évènement
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 643 Messages

02 juil. 2018, 06:16

Oui biensur ma table loisirs posséde un id en auto increment.

# Nom Type Interclassement Attributs Null Valeur par défaut Commentaires Extra
1 id_loisirsPrimaire int(11) Non Aucun(e) AUTO_INCREMENT
2 id_simply_user int(11) Non Aucun(e)
3 titre varchar(255) utf32_general_ci Non Aucun(e)
4 phone varchar(255) utf8_general_ci Oui NULL
5 email varchar(255) utf8_general_ci Oui NULL
6 city varchar(255) utf8_general_ci Oui NULL
7 rue text utf8_general_ci Oui NULL
8 postcode varchar(255) utf8_general_ci Oui NULL
9 descriptif text utf8_general_ci Non Aucun(e)
10 date_debut_sortie datetime Non Aucun(e)


J'ai également créer du coup ma 2 ème table evenement_date:

# Nom Type Interclassement Attributs Null Valeur par défaut Commentaires Extra
1 id_loisirs int(11) Non Aucun(e)
2 date_1 datetime Non Aucun(e)
3 date_2 datetime Non Aucun(e)
4 date_3 datetime Non Aucun(e)
5 date_4 datetime Non Aucun(e)

Du coup il faut créer autant de colonne qu'il y a de date je suposse....

Mammouth du PHP | 1967 Messages

02 juil. 2018, 08:16

Non justement.

l'utilisation d'une table evenement_date t'évite de devoir créer plus d'une colonne de date.
l'idée est de créer une ligne dans cette table par date.

donc un évenement A qui n'a qu'une date n'aura qu'une ligne enregistré dans chacune des 2 tables, mais l'évenement B qui a 3 date aura une ligne dans ta table loisirs et 3 lignes dans ta table evenement_date
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 643 Messages

02 juil. 2018, 19:23

Bon j'ai un peu avancé .
J'ai donc créer ma table date_evenement:
je précise que code revient à un code unique pour les événement fournis par le fichier csv que je lis
# Nom Type Interclassement Attributs Null Valeur par défaut Commentaires Extra
1 code varchar(255) latin1_swedish_ci Non Aucun(e)
2 date_event datetime Non Aucun(e)

Mon code actuel.
( Je ne vous met que l'essentiel )
Tout s'insere correctement sauf que la le script s'arrete car je suis confronté à un résultat du type par exemple :
16/07/2018 | 23/07/2018 | 30/07/2018 | 06/08/2018
$num_ligne = 0; // Valeur de ligne par defaut
		
	// Parcourt du fichier CSV + stockage variables
	foreach($csv as $ligne){

	
	$num_ligne ++; // Incrémentation


	$date_event =  addslashes($ligne[19]);
	// Date(s) de l'évènement Transformation PMA
	$date_event = date_create_from_format('d/m/Y',$date_event);
	$date_event = date_format($date_event, 'Y-m-d');
		
	
	if ($num_ligne >1)  {
	// Insertion pour la talbe loisirs
    $req = $bdd->prepare("INSERT INTO `loisirs` (id_simply_user,titre,code,phone,email,city,rue,postcode,descriptif) VALUES ('$id_simply_user','$titre','$code','$phone','$email','$city','$rue','$postcode','$descriptif')");
    $req->execute(array(
             		  'id_simply_user'=>$id_simply_user,
					  'code'=>$code,
                      'titre'=>$titre,
					  'phone'=>$phone,
					  'email'=>$email,
					  'city'=>$city,
					  'rue'=>$rue,
					  'postcode'=>$postcode,
					  'descriptif'=>$descriptif
					  )) or die('Erreur d\'insertion pour la table Loisirs');
					  
		
	// Insertion pour la talbe evenement date
    $req = $bdd->prepare("INSERT INTO `evenement_date` (code,date_event) VALUES ('$code','$date_event')");
    $req->execute(array(
             		    'code'=>$code,
						'date_event'=>$date_event
					  )) or die('Erreur d\'insertion pour la table Date_event');
		
		}
	}
Du coup comment dois je procedé ? Explode ? Mais après ?

Mammouth du PHP | 643 Messages

04 juil. 2018, 07:02

Alors du coup ça marche oui et non, ca s'integre bien en bdd mais ca ne me créer pas plusieurs dates pour le meme code si il y en a.
  $date_event =  $ligne[19];
	    $exp_date = (explode('| ', $ligne[19]));  // DU COUP **** le fameux explode 
		
		if ($num_ligne >1 )  { // On ignore la premiere ligne du CSV qui correspond au colonne
		// Table Loisirs
		$req = $bdd->prepare("INSERT INTO loisirs (`id_simply_user`, `titre`, `code`,`phone`,`email`,`city`,`rue`,`postcode`,`descriptif`) VALUES (:id_simply_user, :titre, :code, :phone, :email, :city, :rue, :postcode, :descriptif)");

		$req->bindParam(':id_simply_user', $id_simply_user);
		$req->bindParam(':titre', $titre);
		$req->bindParam(':code', $code);
		$req->bindParam(':phone', $phone);
		$req->bindParam(':email', $email);
		$req->bindParam(':city', $city);
		$req->bindParam(':rue', $rue);
		$req->bindParam(':postcode', $postcode);
		$req->bindParam(':descriptif', $descriptif);
		$req->execute();

		// Table Date evenement
		$req = $bdd->prepare("INSERT INTO evenement_date (`code`, `date_event`) VALUES (:code, :date_event)"); 
		$req->bindParam(':code', $code);
		$req->bindParam(':date_event', $date_event);

		foreach($exp_date AS $date)
		{
		$date_event=$date;
			
		// Date(s) de l'évènement Transformation PMA
		$date_event = date_create_from_format('d/m/Y',$date_event); // Date format lut 28/06/2018
	    $date_event = date_format($date_event, 'Y-m-d'); // Date format transformé 2018-06-28
		//var_dump($date_event);
			
		$req->execute();
		}
  	 }

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

04 juil. 2018, 08:13

A première vu, je dirai que si tu fixe les paramètres de ta requête en dehors de ta boucle, ça ne peut pas marcher ;)
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 643 Messages

05 juil. 2018, 19:00

Alors en fait il ne prend que la deniere date lut de la ligne du csv en modifiant mon code au lieu d'inserer autant de fois le code qu'il ya de date:

Il y a du mieux, plus de cohérance, le but ultime quasi atteint.
J'ai fait un var dump de $date_event et je vois ce message quand j'ai plusieurs date:
SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '' for column 'date_event


Tout s'insere parfaitement sauf que si j'ai plusieurs date pour le même "code" alors il n'insere que la dernière date lut du csv.

Exemple pour le code 20180307_123 : j'ai les dates : 16/07/2018 | 23/07/2018 | 30/07/2018 | 06/08/2018 mais en bdd je n'ai que:

code : 20180307_123 et pour date_event 2018-08-06.

Alors que je devrais avoir en bdd :

20180307_123 2018-08-06 puis

20180307_123 2018-07-30

20180307_123 2018-07-23

Ainsi de suite:

My code:
// Table Loisirs
        $req = $bdd->prepare("INSERT INTO loisirs (`id_simply_user`, `titre`, `code`,`phone`,`email`,`city`,`rue`,`postcode`,`descriptif`) VALUES (:id_simply_user, :titre, :code, :phone, :email, :city, :rue, :postcode, :descriptif)");
    
        $req->bindParam(':id_simply_user', $id_simply_user);
        $req->bindParam(':titre', $titre);
        $req->bindParam(':code', $code);
        $req->bindParam(':phone', $phone);
        $req->bindParam(':email', $email);
        $req->bindParam(':city', $city);
        $req->bindParam(':rue', $rue);
        $req->bindParam(':postcode', $postcode);
        $req->bindParam(':descriptif', $descriptif);
  
    
        // Table Date evenement
        $req2 = $bdd->prepare("INSERT INTO evenement_date (`code`, `date_event`) VALUES (:code, :date_event)");
        $req2->bindParam(':code', $code);
        $req2->bindParam(':date_event', $date_event);
          
$fichier = 'bretagne.csv';
        $csv = new SplFileObject($fichier);
        $csv->setFlags(SplFileObject::READ_CSV);
        $csv->setCsvControl(';');
   
        $num_ligne = 0; // Valeur de ligne par defaut
   
        // Parcourt du fichier CSV + stockage variables
        foreach($csv as $ligne){
   
        $num_ligne ++; // Incrémentation
        if ($num_ligne >1 )  { // On ignore la premiere ligne du CSV qui correspond au colonne
        $id_simply_user = '1000';
        $code =  $ligne[0];
        $titre =  $ligne[1];
        $phone =  $ligne[2];
        $website =  $ligne[5];
        $email =  $ligne[6];
        $postcode =  $ligne[11];
        $city =  $ligne[13];
        $descriptif =  $ligne[16];
               
        // Adresse Postal
        if(empty($ligne[9])) {
            $rue = $ligne[8];
        }else{
            $rue = $ligne[9];
        }
        $req->execute();
        $exp_date = (explode('| ', $ligne[19]));  // DU COUP **** le fameux explode
               
        // Date(s) de l'évènement Transformation PMA
                
            
  
            foreach($exp_date AS $date)
            {
        $dateF = date_create_from_format('d/m/Y',$date); // Date format lut 28/06/2018
        $dateSQL = date_format($dateF, 'Y-m-d'); // Date format transformé 2018-06-28
        $date_event=$dateSQL;
        $req2->execute();
            }
     }
  }