par
tesmet » 20 déc. 2017, 19:32
Hello. C'est un concept déjà plus simple que le précédent, on peut donc faire direct un nouveau $tableau sans devoir retravailler l'ancien $tableau.
Il n'y a que le numéro de la ligne des dates qui change entre les 10 ou 11 blocs de données ? Le "type" est bien renseigné dans chacun des blocs ? Le nombre de blocs est toujours le même ou si une petite équation sur count($lignes) est nécessaire ? Il y a aussi quelques questions dans le code ci-dessous... il est peut-être possible d'être autonome à partir d'ici, sinon il y a le forum pour plus de précision.
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> $nb_fichier </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('Sélectionné: <a href="%s" target="_blank">%s</a><br>', $fichier, pathinfo($fichier, PATHINFO_FILENAME));
?>
</div>
<?php
$lignes = file($fichier);
// ICI la boucle pour éviter de répéter le même code 10 ou 11 fois
// oui il faut déplacer l'initialisation de $tableau pour cette boucle globale
$tableau = []; // comme tu as une version PHP acceptant [] comme alias de array()
$dates = array_filter(str_getcsv($lignes[3], ';')); // les dates à la ligne 4 donc indice 3
$type = array_shift($dates); // pour enlever la colonne "type" des 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, 4, 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; // au cas où
$tableau[] = [ // nouvelles colonnes ??? id, type, temps, valeur ???
'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="rslt"><pre>
<?php
$sql = []; // j'avais oublié d'initialiser ce tableau, indispensable dans une boucle globale
foreach($tableau as $insert) { // ordre id, type, temps, valeur
$sql[] = "\n(" . implode(', ', $insert) . ')';
}
// ne jamais mettre de <br> dans une requête SQL
$sql = 'INSERT INTO releve (id, type, temps, valeur) VALUES ' . implode(',', $sql);
// https://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html
// par défaut c'est 4 MB pour MySQL 5.7 mais peut-être aussi petit que 1 KB
// SELECT @@max_allowed_packet
// devrait retourner cette limite. sinon il y a aussi $strm->bindParam() d'un $strm = $pdo->prepare()
echo strlen($sql), "<pre>$sql\n\n</pre>"; // $pdo->query($sql);
// ICI sera la fin de la boucle globale pour éviter de répéter le même code 10 ou 11 fois
?>
<div id="rslt">
<?php
}
Bonne chance.
Hello. C'est un concept déjà plus simple que le précédent, on peut donc faire direct un nouveau $tableau sans devoir retravailler l'ancien $tableau.
Il n'y a que le numéro de la ligne des dates qui change entre les 10 ou 11 blocs de données ? Le "type" est bien renseigné dans chacun des blocs ? Le nombre de blocs est toujours le même ou si une petite équation sur count($lignes) est nécessaire ? Il y a aussi quelques questions dans le code ci-dessous... il est peut-être possible d'être autonome à partir d'ici, sinon il y a le forum pour plus de précision.
[code]<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> $nb_fichier </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('Sélectionné: <a href="%s" target="_blank">%s</a><br>', $fichier, pathinfo($fichier, PATHINFO_FILENAME));
?>
</div>
<?php
$lignes = file($fichier);
// ICI la boucle pour éviter de répéter le même code 10 ou 11 fois
// oui il faut déplacer l'initialisation de $tableau pour cette boucle globale
$tableau = []; // comme tu as une version PHP acceptant [] comme alias de array()
$dates = array_filter(str_getcsv($lignes[3], ';')); // les dates à la ligne 4 donc indice 3
$type = array_shift($dates); // pour enlever la colonne "type" des 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, 4, 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; // au cas où
$tableau[] = [ // nouvelles colonnes ??? id, type, temps, valeur ???
'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="rslt"><pre>
<?php
$sql = []; // j'avais oublié d'initialiser ce tableau, indispensable dans une boucle globale
foreach($tableau as $insert) { // ordre id, type, temps, valeur
$sql[] = "\n(" . implode(', ', $insert) . ')';
}
// ne jamais mettre de <br> dans une requête SQL
$sql = 'INSERT INTO releve (id, type, temps, valeur) VALUES ' . implode(',', $sql);
// https://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html
// par défaut c'est 4 MB pour MySQL 5.7 mais peut-être aussi petit que 1 KB
// SELECT @@max_allowed_packet
// devrait retourner cette limite. sinon il y a aussi $strm->bindParam() d'un $strm = $pdo->prepare()
echo strlen($sql), "<pre>$sql\n\n</pre>"; // $pdo->query($sql);
// ICI sera la fin de la boucle globale pour éviter de répéter le même code 10 ou 11 fois
?>
<div id="rslt">
<?php
}[/code]
Bonne chance.