Partage
  • Partager sur Facebook
  • Partager sur Twitter

remplir champs vide mysql

18 octobre 2020 à 15:23:52

Bonjour à tous,

j'ai un problème que je n'arrive pas à résoudre.

j'ai un fichier .CSV que j'importe dans une table MYSQL via un script PHP. Jusqu'ici tous va bien.

Ce fichier .CSV comporte 2 colonnes de ce type : (date, prenom) :

A                                B     

Date                          Prenom

2020-01-01              titi

vide                           titi

vide                           titi

vide                           titi

2020-01-02              titi

vide                           titi

vide                           titi

vide                           titi

2020-01-03              titi

vide                           titi

vide                           titi

vide                           titi

Vous l'aurez compris des champs sont vide dans mon .CSV, ce qui enregistre bien évidement des champs vide en BDD.

Comment pourrais je faire pour que ces champs vide récupère la date juste au dessus de manière à obtenir ceci :

A                                B     

Date                          Prenom

2020-01-01              titi

2020-01-01              titi

2020-01-01              titi

2020-01-01              titi

2020-01-02              titi

2020-01-02              titi

2020-01-02              titi

2020-01-02              titi

2020-01-03              titi

2020-01-03              titi

2020-01-03              titi

2020-01-03              titi

Merci par avance

  • Partager sur Facebook
  • Partager sur Twitter
Un bon site Web est toujours "en construction" !
18 octobre 2020 à 15:38:31

Garde la dernière date dans une variable et réutilise la si c'est vide

  • Partager sur Facebook
  • Partager sur Twitter
18 octobre 2020 à 19:16:18

merci pour ta réponse quenti77,

voici le code qui me permet d'importer mon fichier .CSV

//=========================
// Traitement des donnees
//=========================
//recupere le nom du fichier indiqué par l'user
$fichier = $_FILES["userfile"]["name"];
//echo $fichier;
// ouverture du fichier en lecture
if ($fichier) {	
	//ouverture du fichier temporaire
	 $fp = fopen($_FILES["userfile"]["tmp_name"], "r");	
}else{		
// fichier inconnu
?>
	<p align="center" >- Importation échoué -</p>
	   <?php
	   exit();
	}
	// declaration de la variable "cpt" qui permettra de compter le nombre d'enregistrement
	?>
	<p align="center">- Importation Réussie - </p>
	<?php
	$cpt = 0;
	// importation
	while (!feof($fp)) {
		$ligne = fgets($fp, 4096);
		// on crée un tableau des élements séparé par des points virgule
		$liste = explode(";", $ligne);
		// premier élément
		$liste[0] = ( isset($liste[0]) ) ? $liste[0] : Null;
		$liste[1] = ( isset($liste[1]) ) ? $liste[1] : Null;

		$champs1 = implode('-', array_reverse( explode('/',$liste[0]) ) );
		$champs2 = $liste[1];

      	$cpt++;				                
		?>
		<div id="elements">
			<table width="1280" border="0" align="center" cellpadding="0" cellspacing="0" >
				<tr>
					<td style="width:71px;"><?php echo $champs1; ?></td>
					<td style="width:71px;"><?php echo $liste[1]; ?></td>
	        
				</tr>
			</table>
		</div>
	<?php	
	}
	?>
	<div id="importfooter">Nombre de valeurs nouvellement enregistrées: <?php echo $cpt; ?></div>
	
	<?php

	// fermeture du fichier
	        fclose($fp);
	//on supprime la derniere car elle est vide
	//==================
	// FIN
	//==================
	?>
	
	<p align="right"><a href="#bas">Bas de page</a></p>


voila voila, comment faire?

  • Partager sur Facebook
  • Partager sur Twitter
Un bon site Web est toujours "en construction" !
18 octobre 2020 à 20:23:50

J'en ai profité pour essayer d'améliorer un peu le script mais j'ai pas pu tester :

<?php

function errorImportation()
{
    ?>
    <!-- evite align et utilise du css plutôt -->
    <p class="text-center"> - Importation échoué - </p>
    <?php
    exit();
}

function showElements($date, $firstname)
{
    ?>
    <!-- Tu ne peux pas mettre d'id si tu en a plusieurs -->
    <div class="elements">
        <!-- Pareil que pour le p au dessus -->
        <table class="element-table">
            <tr>
                <td class="element-date"><?= $date ?></td>
                <td class="element-firstname"><?= $firstname ?></td>
            </tr>
        </table>
    </div>
    <?php
}

$file = $_FILES['userfile']['name'] ?? null;

if (empty($file)) {
    errorImportation();
}

$handler = fopen($_FILES['userfile']['tmp_name'], 'r');
if ($handler === false) {
    errorImportation();
}

$counter = 0;
$keepDate = null;
while (!feof($fp)) {
    $line = fgets($handler, 4096);
    $fields = explode(';', $line);

    $date = $fields[0] ?? null;
    $firstname = $fields[1] ?? null;

    if ($keepDate === null && $date !== $keepDate) {
        $keepDate = $date;
    }

    $counter += 1;

    showElements($keepDate, $firstname);
}

?>
<div id="import-footer">Nombre de valeurs nouvellement enregistrées : <?= $counter ?></div>
<?php

fclose($handler);



  • Partager sur Facebook
  • Partager sur Twitter
19 octobre 2020 à 6:54:10

Merci pour ce coup de jeune du code.

Une expression me retourne une erreur:

$file = $_FILES['userfile']['name'] ?? null;


L'erreur viendrais de de :

?? null;

Je ne la connais pas

  • Partager sur Facebook
  • Partager sur Twitter
Un bon site Web est toujours "en construction" !
19 octobre 2020 à 7:27:41

Ah mince tu dois être en php 5.6 même si normalement on ne devrait plus l'utiliser et plutôt avoir un php en version 7.3. Vérifie ta version de php et pour l'explication : https://www.tutorialspoint.com/php7/php7_coalescing_operator.htm

  • Partager sur Facebook
  • Partager sur Twitter
19 octobre 2020 à 11:17:19

Ok, je comprend mieux, j'ai donc fais les modifs, et promis, je passes sous PHP 7.3 :)

Le problème est que la colonne date reste sur 2020-01-01 pour toutes les lignes du tableau et ne passes jamais à 2020-01-02

-
Edité par metallicrider 19 octobre 2020 à 11:17:33

  • Partager sur Facebook
  • Partager sur Twitter
Un bon site Web est toujours "en construction" !
19 octobre 2020 à 11:32:35

Pardons my bad, dans la condition $keepDate === null && $date !== $keepDate c'est pas && mais ||

Sinon en effet ça ne modifie la date que si cette dernière est null et différente.

  • Partager sur Facebook
  • Partager sur Twitter
19 octobre 2020 à 12:39:52

j'ai fais la modif, mais ca marche po ..

<?php
 
function errorImportation()
{
    ?>
    <!-- evite align et utilise du css plutôt -->
    <p class="text-center"> - Importation échoué - </p>
    <?php
    exit();
}
 
function showElements($date, $firstname)
{
    ?>
    <!-- Tu ne peux pas mettre d'id si tu en a plusieurs -->
    <div class="elements">
        <!-- Pareil que pour le p au dessus -->
        <table class="element-table">
            <tr>
                <td class="element-date"><?= $date ?></td>
                <td class="element-firstname"><?= $firstname ?></td>
            </tr>
        </table>
    </div>
    <?php
}

$file = isset($_FILES['userfile']['name']) ? $_FILES['userfile']['name'] : null;

if (empty($file)) {
    errorImportation();
}
 
$handler = fopen($_FILES['userfile']['tmp_name'], 'r');
if ($handler === false) {
    errorImportation();
}
 
$counter = 0;
$keepDate = null;
while (!feof($fp)) {
    $line = fgets($handler, 4096);
    $fields = explode(';', $line);
	$date = ( isset($fields[0]) ) ? $fields[0] : Null;
	$firstname = ( isset($fields[1]) ) ? $fields[1] : Null;
 
    if ($keepDate === null || $date !== $keepDate) {
        $keepDate = $date;
    }
 
    $counter += 1;
 
    showElements($keepDate, $firstname);
}
 
?>
<div id="import-footer">Nombre de valeurs nouvellement enregistrées : <?= $counter ?></div>
<?php
 
fclose($handler);



-
Edité par metallicrider 19 octobre 2020 à 13:13:07

  • Partager sur Facebook
  • Partager sur Twitter
Un bon site Web est toujours "en construction" !
19 octobre 2020 à 13:43:40

Mais une colonne vide vaut '' pas NULL, non ? (surtout en passant avec explode)

Tout isset($fields[X]) avec X > 0 ne serait vraie que si la ligne lue ne comporte pas au moins X caractères ;. Et isset($fields[0]) doit toujours être vraie.

> if ($keepDate === null || $date !== $keepDate) {

En fait, if ($date) { suffi(rai)t ? (ou !empty($data)) Au pire, affecter la même valeur ne changera rien, non ?

D'ailleurs, tu ne peux pas utiliser fgetcsv à feof + fgets + explode ? Surtout que fgets + explode ne respectent pas le format csv (quid des échappements ?).

-
Edité par julp 19 octobre 2020 à 14:13:25

  • Partager sur Facebook
  • Partager sur Twitter
19 octobre 2020 à 13:45:34

voila j'ai fais la modif

<?php
 
function errorImportation()
{
    ?>
    <!-- evite align et utilise du css plutôt -->
    <p class="text-center"> - Importation échoué - </p>
    <?php
    exit();
}
 
function showElements($date, $firstname)
{
    ?>
    <!-- Tu ne peux pas mettre d'id si tu en a plusieurs -->
    <div class="elements">
        <!-- Pareil que pour le p au dessus -->
        <table class="element-table">
            <tr>
                <td class="element-date"><?= $date ?></td>
                <td class="element-firstname"><?= $firstname ?></td>
            </tr>
        </table>
    </div>
    <?php
}

$file = isset($_FILES['userfile']['name']) ? $_FILES['userfile']['name'] : null;

if (empty($file)) {
    errorImportation();
}
 
$handler = fopen($_FILES['userfile']['tmp_name'], 'r');
if ($handler === false) {
    errorImportation();
}
 
$counter = 0;
$keepDate = null;
while (!feof($fp)) {
    $line = fgets($handler, 4096);
    $fields = explode(';', $line);
	$date = ( isset($fields[0]) ) ? $fields[0] : Null;
	$firstname = ( isset($fields[1]) ) ? $fields[1] : Null;
 
    if ($keepDate === null || $date !== $keepDate) {
        $keepDate = $date;
    }
 
    $counter += 1;
 
    showElements($keepDate, $firstname);
}
 
?>
<div id="import-footer">Nombre de valeurs nouvellement enregistrées : <?= $counter ?></div>
<?php
 
fclose($handler);

mais ca marche po ...

  • Partager sur Facebook
  • Partager sur Twitter
Un bon site Web est toujours "en construction" !
19 octobre 2020 à 14:24:34

J'avais complètement oublié la fonction fgetcsv mais voici un exemple qui fonctionne :

https://repl.it/repls/DarkredMagnificentGzip#index.php

Voici le CSV d'exemple :

date,firstname
2020-01-01,tita
,tite
,titi
,tito
,titu
2020-01-02,tita2
,tite2
,titi2
,tito2
,titu2
2020-01-03,tita3
,tite3
,titi3
,tito3
,titu3
  • Partager sur Facebook
  • Partager sur Twitter
26 octobre 2020 à 7:14:53

Bonjour,

Bonjour à tous,

merci pour vos réponses,

effectivement, désolé pour les doublons de codes ...

Je vais regarder cela aujourd'hui, et merci pour votre aide.

Je vous fais un retour dès que :)

  • Partager sur Facebook
  • Partager sur Twitter
Un bon site Web est toujours "en construction" !