Page 1 sur 1

Insérer null plutôt que 0000-00-00 pour des dates

Posté : 04 févr. 2019, 10:52
par kevin254kl
Bonjour à tous,

Encore moi :)

Je fais appelle à votre sagesse pour un problème ou je ne sais pas comment procéder.

J'ai cette fonction qui va récupérer un objet mission et l'initialiser dans un array

Code : Tout sélectionner

private function update_mission_api($mission) { try { $db = $this->db; $crud = $this->crud; $data = array( 'mission_competence' => $mission->competence, 'mission_depart_groupe_possible' => $mission->departGroupePossible, 'mission_numero' => $mission->numero, 'mission_description' => $mission->descriptif, 'mission_dispositif_possible' => $mission->dispositifPossible, 'mission_historique_partenaire_local' => $mission->historiquePartenaireLocal, 'mission_langues' => $mission->langues, 'mission_name' => $mission->name, 'mission_nb_beneficiaires' => $mission->nbBeneficiaire, 'mission_nb_min_volontaires' => $mission->nbMinVolontaires, 'mission_niveau_langues' => $mission->niveauLangues, 'mission_nb_max_volontaires' => $mission->nbMaxVolontaires, 'mission_objectif_justification' => $mission->objectifJustification, 'mission_profil_niveau_beneficiaires' => $mission->profilNiveauBeneficiaires, 'mission_partenaire_nom' => $mission->nomPartenaire, 'mission_pays' => $mission->pays, 'mission_thematique' => $mission->thematique, 'mission_type_beneficiaires' => $mission->typeBeneficiaires, 'mission_ville' => $mission->ville, 'mission_intervention_attendu_volontaire' => $mission->interventionAttenduVolontaire, 'mission_aeroport_arrivee' => $mission->aeroportArrivee, 'mission_accueil_transfert' => $mission->accueilTransfert, 'mission_hebergement' => $mission->hebergement, 'mission_materiel_disponible_sur_place' => $mission->materielDisponibleSurPlace, 'mission_remarque' => $mission->remarque, 'mission_motivation_attendu' => $mission->motivationAttendu ); // update all field date for($i= 1; $i < 5; $i++) { $dateDebut = (!empty($mission->datesDebuts[$i-1])) ? $mission->datesDebuts[$i-1] : NULL; $tmp = array( 'mission_date_debut_' . $i => $dateDebut); $data = array_merge($tmp, $data); } for($i= 1; $i < 21; $i++) { $dateFin = (!empty($mission->datesFins[$i-1])) ? $mission->datesFins[$i-1] : NULL; $tmp = array( 'mission_date_fin_' . $i => $dateFin); $data = array_merge($tmp, $data); } // get dates, dates is cleaned by main php function no need to control echo '<pre style="background-color:black;color:white;">';var_dump( $data );echo '</pre>'; $crud->pdoUpdate('missions', $data, $db, 'mission_id_sf', $mission->idMission); } catch(\Exception $e) { echo "update_mission_api: " . $e->getMessage(); } }
Dans ma base j'ai des dates de début et de fin, si elle n'existe pas dans mon objet je mets à null

Code : Tout sélectionner

for($i= 1; $i < 21; $i++) { $dateFin = (!empty($mission->datesFins[$i-1])) ? $mission->datesFins[$i-1] : NULL; $tmp = array( 'mission_date_fin_' . $i => $dateFin); $data = array_merge($tmp, $data); }
Dans mon var_dump c'est ok

Code : Tout sélectionner

'mission_date_fin_20' => null 'mission_date_fin_19' => null 'mission_date_fin_18' => null 'mission_date_fin_17' => null 'mission_date_fin_16' => null 'mission_date_fin_15' => null 'mission_date_fin_14' => null 'mission_date_fin_13' => null 'mission_date_fin_12' => null 'mission_date_fin_11' => null 'mission_date_fin_10' => null 'mission_date_fin_9' => null 'mission_date_fin_8' => null 'mission_date_fin_7' => null 'mission_date_fin_6' => null 'mission_date_fin_5' => null 'mission_date_fin_4' => null 'mission_date_fin_3' => null 'mission_date_fin_2' => null 'mission_date_fin_1' => string '2018-12-30' (length=10) 'mission_date_debut_4' => null 'mission_date_debut_3' => null 'mission_date_debut_2' => null 'mission_date_debut_1' => string '2017-12-31' (length=10)
Par contre à la fin j'appelle ma fonction qui va mettre à jour

Code : Tout sélectionner

$crud->pdoUpdate('missions', $data, $db, 'mission_id_sf', $mission->idMission);
qui est

Code : Tout sélectionner

/* update data . * * @param string $tableName Name of the table we are inserting into. * @param array $data An "array" containing our row data. * @param PDO $pdoObject Our PDO object. * @param string $idName name of id table. * @param string $idValue id salesforce with alphanumeric caracters * @return boolean TRUE on success. FALSE on failure. */ public function pdoUpdate(string $tableName, array $data, \PDO $pdoObject, string $idName, string $idValue) : bool { try { //Will contain SQL snippets. $rowsSQL = array(); //Will contain the values that we need to bind. $toBind = array(); $sql = "UPDATE $tableName SET "; //Loop through our $data array. $params = array(); $i = 0; $len = count($data); // construct sql foreach($data as $columnName => $columnValue){ if(strlen($columnValue) < 1) continue; $sql .= $columnName . ' = :' . $columnName .' '; $param = ":" . $columnName; $params[] = $param; $toBind[$param] = $columnValue; $sql .= ','; $i++; } // delete last comma for avoid sql error $sql = rtrim($sql, ','); $sql .= " WHERE $idName = :idValue"; //Prepare our PDO statement. $pdoStatement = $pdoObject->prepare($sql); //Bind our values. foreach($toBind as $param => $val){ $pdoStatement->bindValue($param, $val); } //bind id values $pdoStatement->bindValue(':idValue', $idValue); return $pdoStatement->execute(); } catch(\PDOException $e) { echo "pdoUpdate: " . $e->getMessage(); } }
Le problème c'est que les dates sont mises à jour à 0000-00-00 et non à NULL . J'ai cru comprendre que c'est dû aux quotes le problème si je modifie la fonction juste pour les dates elle ne sera plus générique? Quel sont vos conseils?

Merci.

Re: Insérer null plutôt que 0000-00-00 pour des dates

Posté : 27 févr. 2019, 00:54
par kevin254kl
Finalement il faut juste dans le script traiter le cas ou la valeur est null est mettre null dans la requête préparé.

Re: [RESOLU] Insérer null plutôt que 0000-00-00 pour des dates

Posté : 27 févr. 2019, 09:43
par Jc71
Bonjour,

Lorsque vous récupérez vos données dans votre base, si les dates ne sont pas définies, alors elles seront définies à null dans votre objet, pas besoin de les redéfinir à null pour avoir null dans la base.
Si maintenant vous chargez votre objet à partir d'un formulaire ou autre et que vous souhaitez transmettre null à votre base pour toutes les dates qui ne sont pas définies, je ne comprends pas trop votre méthodologie. En effet les données affichées dans votre application sont une chose, les données stockées en base en sont une autre. Par exemple, pour une date définie au 10 janvier 2019, vous devrez afficher 10 Janvier 2019 dans votre vue ou encore 10/01/2019 et vous devrez enregistrer 2019-01-10 dans votre base (format de stockage standard SQL). Donc je vous recommande de traiter les dates dans votre application au même format que votre base, et de les transformer qu'au moment où vous souhaitez les afficher dans la vue applicative. On fait ceci grâce à un helper, surtout si vous devez gérer la localisation dans votre application (la langue d'affichage en fonction de l'utilisateur), qui selon le pays, change la façon d'afficher votre date. Dans votre helper, si vous avez $date='' dans votre formulaire, le helper le transformera en $date=null;
Je vous rappelle également que 0000-00-00 représente tout sauf une date. J'ose donc espérer que vous ne stockez pas vos dates dans un varchar en base de données!

Bonne journée.