[RESOLU] Insertion en bdd postgre et parse d'un string en date

Eléphant du PHP | 65 Messages

22 déc. 2017, 11:14

Bonjour à tous,
Suite à votre aide j'ai maintenant le résultat escompté.
J'ai fait ma boucle afin d'afficher mes 14 tableaux.
Maintenant ce que je souhaiterai faire c'est poussé mes données en bdd.
Finalement à la place d'une seule tables il y en a en fait 14, une par type.
Elles ont toutes la même structures (id, temps, valeur).
Voici mon code:

Code : Tout sélectionner

<h1>Gestion des compteurs d'eau</h1> <main> <?php $dossier = glob('csv/*'); // ou bien 'csv/*.[cC][sS][vV]' pour aussi limiter à l'extension csv if(!$nb_fichier = count($dossier)) echo "Il n'y a aucun fichier dans le dossier"; else echo "Il y a <strong>&nbsp;$nb_fichier&nbsp;</strong> fichier(s) dans le dossier"; ?> </main> <div id="rslt"> <ul> <?php foreach($dossier as $fichier) { printf('<li><a href="?fichier=%s">%s</a></li>', urlencode($fichier), pathinfo($fichier, PATHINFO_FILENAME)); } ?> </ul> </div> <?php if(!empty($_GET['fichier']) && in_array($fichier=$_GET['fichier'], $dossier)) { ?> <div id="rslt"> <?php printf('<pre>Sélectionné: <a href="%s" target="_blank">%s</a><br>', $fichier, pathinfo($fichier, PATHINFO_FILENAME)); ?> </div> <?php $lignes = file($fichier); ?> <div id="boucle"> <?php for($j=3;$j<=393;$j=($j+30)) { $tableau = []; $dates = array_filter(str_getcsv($lignes[$j], ';')); $type = array_shift($dates); foreach($dates as $i => $date) { // changer jj/mm/aaaa en aaaa-mm-jj pour MySQL $dates[$i] = implode('-', array_reverse(explode('/',$date))); // un $pdo->quote($date) serait bien } $heures = array_slice($lignes, $j+1, 24); // les 24 lignes contenant les valeures de chacune des heures foreach($heures as $ligne_valeures) { $ligne_valeures = str_getcsv($ligne_valeures, ';'); $heure = intval(array_shift($ligne_valeures)); //enlever l'heure des valeures foreach($ligne_valeures as $i => $nb_procs) { if(!isset($dates[$i])) continue; $tableau[] = [ 'id' => 'NULL', 'type' => "'$type'", // faudrait préférer $pdo->quote($type) ou une requête préparée 'temps' => sprintf("'%s %02d:00:00'", $dates[$i], $heure), 'valeur' => intval($nb_procs), ]; } } ?> <div id="rslt1"> <?php $sql = []; foreach($tableau as $insert) { $sql[] = "\n(" . implode(', ', $insert) . ')'; } $sql = 'INSERT INTO releve (id, type, temps, valeur) VALUES ' . implode(',', $sql); echo "<pre>$sql\n\n</pre></div>"; } ?> </div> <?php echo '</pre>'; }
Ce que je souhaiterai savoir c'est est-ce possible d'ajouter directement tout ce qui est dans la variable $sql en base en une fois ou faut-il faire une insertion ligne par ligne lorsque je suis dans le foreach?
Je n'arrive pas trop à voir où je dois me positionner afin de faire ma requête!
Pourriez-vous jsute me dire où je dois me positionner afin de la faire et si je dois faire ligne par ligne ou s'il y a un moyen d'envoyer ce qu'il y a dans $sql et que cela me crée tout de même toutes les lignes séparément.
JE vous remercie.
Modifié en dernier par biddal le 22 déc. 2017, 14:30, modifié 1 fois.

Eléphant du PHP | 65 Messages

22 déc. 2017, 11:26

Je pense que je dois me positionner à cet endroit:

Code : Tout sélectionner

foreach($tableau as $insert) { $sql[] = "\n(" . implode(', ', $insert) . ')'; }
Afin d'insérer ligne par ligne mais je n en suis pas sûr.

Eléphant du PHP | 65 Messages

22 déc. 2017, 11:41

J'ai mis cela. Cela vous semble t il bon?

Code : Tout sélectionner

foreach($tableau as $insert) { $sql[] = "\n(" . implode(', ', $insert) . ')'; include __DIR__.'/../connectBDD.php'; $requete = 'INSERT INTO '.$type.'(temps, valeur) VALUES (:temps,:valeur)'; $stmt = $this->pdo->prepare($requete); $stmt->bindValue(':temps',$insert[temps]); $stmt->bindValue(':valeur',$insert[valeur]); $stmt->execute(); return $this->pdo->lastInsertId('stocker'); } $sql = 'INSERT INTO releve (id, type, temps, valeur) VALUES ' . implode(',', $sql); echo "<pre>$sql\n\n</pre></div>";

Eléphant du PHP | 65 Messages

22 déc. 2017, 14:31

Voilà où j'en suis actuellement. Tout fonctionne parfaitement.
Il me reste juste à convertir le string de ma date en format date timestamp pour l'insérer en bdd et après à vérifier mon insert.

Code : Tout sélectionner

<h1>Gestion des compteurs d'eau</h1> <main> <?php $dossier = glob('csv/*'); // ou bien 'csv/*.[cC][sS][vV]' pour aussi limiter à l'extension csv if(!$nb_fichier = count($dossier)) echo "Il n'y a aucun fichier dans le dossier"; else echo "Il y a <strong>&nbsp;$nb_fichier&nbsp;</strong> fichier(s) dans le dossier"; ?> </main> <div id="rslt"> <ul> <?php foreach($dossier as $fichier) { printf('<li><a href="?fichier=%s">%s</a></li>', urlencode($fichier), pathinfo($fichier, PATHINFO_FILENAME)); } ?> </ul> </div> <?php if(!empty($_GET['fichier']) && in_array($fichier=$_GET['fichier'], $dossier)) { ?> <div id="rslt"> <?php printf('<pre>Sélectionné: <a href="%s" target="_blank">%s</a><br>', $fichier, pathinfo($fichier, PATHINFO_FILENAME)); ?> </div> <?php $lignes = file($fichier); ?> <div id="boucle"> <?php $k=1; for($j=3;$j<=393;$j=($j+30)) { $tableau = []; $dates = array_filter(str_getcsv($lignes[$j], ';')); $type = array_shift($dates); // on met ici les noms des types en minuscules $type = strtolower($type); // on teste si le type est libre si oui, on lui ajoute un chiffre derrière afin de différencier les 4 différents // tableaux avec le même type "libre" if($type=="libre") { $type=$type.$k; $k++; } // on enlève ici les espaces et on met le même nom que dans la BDD switch ($type) { case "mater 1 droite": $type="mater1_1"; break; case "mater 1 milieu": $type="mater1_2"; break; case "mater 1 gauche": $type="mater1_3"; break; case "mater 2 droite": $type="mater2_1"; break; case "mater 2 milieu": $type="mater2_2"; break; case "mater 2 gauche": $type="mater2_3"; break; } foreach($dates as $i => $date) { // changer jj/mm/aaaa en aaaa-mm-jj pour MySQL $dates[$i] = implode('-', array_reverse(explode('/',$date))); } $heures = array_slice($lignes, $j+1, 24); // les 24 lignes contenant les valeures de chacune des heures foreach($heures as $ligne_valeures) { $ligne_valeures = str_getcsv($ligne_valeures, ';'); $heure = intval(array_shift($ligne_valeures)); //enlever l'heure des valeures foreach($ligne_valeures as $i => $nb_procs) { if(!isset($dates[$i])) continue; $tableau[] = [ 'id' => 'NULL', 'type' => "'$type'", 'temps' => sprintf("'%s %02d:00:00'", $dates[$i], $heure), 'valeur' => intval($nb_procs), ]; } } ?> <div id="rslt1"> <?php $sql = []; foreach($tableau as $insert) { $sql[] = "\n(" . implode(', ', $insert) . ')'; /* include __DIR__.'/../connectBDD.php'; $requete = 'INSERT INTO iot_elevage_corbel.'.$type.'(temps, valeur) VALUES (:temps,:valeur)'; $stmt = $this->pdo->prepare($requete); $stmt->bindValue(':temps',$insert[temps]); $stmt->bindValue(':valeur',$insert[valeur]); $stmt->execute(); return $this->pdo->lastInsertId('stocker'); */ } $sql = 'INSERT INTO releve (id, type, temps, valeur) VALUES ' . implode(',', $sql); echo "<pre>$sql\n\n</pre></div>"; } ?> </div> <?php echo '</pre>'; }