Database updaten / aanvullen aan de hand van een csv file

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ignace Verschaeve

Ignace Verschaeve

06/08/2022 12:27:30
Quote Anchor link
Wat is de bedoeling? Een csv file met daarin Naam, Voornaam, geboortedatum, bestandsnaam. Er is een bestaande database waarin die Naam al dan niet voorkomt. Zit die Naam, geboortedatum al in de database dan moet die geupdated worden met de bestandsnaam (een pdf file). Indien niet dan moet er een nieuw record aangemaakt worden met de gegeven variabelen.
Code staat hieronder. Ik krijg geen foutmeldingen. Het script wordt blijkbaar uitgevoerd. Ik zie al de lijnen die in de csv zitten maar geen enkel wordt geupdated of bijgevoegd. Ziet er iemand waar ik in de fout ga? Alvast bedankt voor eventuele tips

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
// inladen instellingen
include '../instellingen.php';
$conn = new mysqli($database_adres, $database_login_naam, $database_login_wachtwoord, $database_naam);
//connectie testen
if ($conn->connect_error)
{

    die("verbinding mislukt: ".$conn->connect_error);
}


if(isset($_POST['importSubmit'])){
    
    // Toestane mime types
    $csvMimes = array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain');
    
    // Valideren als het een toegestane csv file is.
    if(!empty($_FILES['file']['name']) && in_array($_FILES['file']['type'], $csvMimes)){
        
        // If the file is uploaded
        if(is_uploaded_file($_FILES['file']['tmp_name'])){
            
            // Open uploaded CSV file in read-only mode
            $csvFile = fopen($_FILES['file']['tmp_name'], 'r');
            
            // Skip the first line
            fgetcsv($csvFile);
            
            // Haal data uit CSV file lijn per lijn
            while(($line = fgetcsv($csvFile)) !== FALSE){
                // Get rij data
                $naam   = $line[0];
                $voornaam  = $line[1];
                $gebdatum = $line[2];
                $bestand = $line[3];
                // Hier worden nog enkele vaste variabelen gemaakt.
                $gebgem = "/";
                $overldatum = "00-00-0000";
                $overlgem = "/";
                $site = "https://****.be/";
                $map = "weterring/hk-wr-data/";
                $verz = "hk-westerring";
                $type = "RB";
                // Uitlezen van de gegevens in de csv
                echo $naam." ".$voornaam." ".$gebdatum." ".$bestand."<br>";
            
                // Check of er reeds records zijn met dezelfde Naam, Voornaam, gebdatum
                $sqlprev = "SELECT IDR FROM rouwbrief WHERE Naam LIKE '$naam%' AND Voornaam LIKE '%$voornaam%' AND gebdatum LIKE '$gebdatum%'";
                $result = $conn->query($sqlprev);
                //$prevResult = $db->query($prevQuery);
                
                if ($result->num_rows >= 0)
                    {

                    // Update member data in the database
                    $sqlupd = "UPDATE rouwbrief SET bestandsnaam = '".$bestand."' WHERE Naam LIKE '".$naam."' AND gebdatum LIKE '".$gebdatum."'";
                }
else{
                    /*Insert member data in the database
                    Teller start op 13018685 omdat IDR telkens 1 moet verhoogt worden per nieuw record. Kan niet met autincrement.
                    Omdat de eerste 2 cijfers van IDR ook een verwijzing zijn naar een verzameling.
                    */


                    $mijnbestand = fopen("telleridr.txt", "w") or die("Kan bestand niet openen!");    
                    $idr=fgets($mijnbestand);
                    echo $idr;
                    $sqlins = "INSERT INTO rouwbrief (IDR, Naam, Voornaam, gebdatum, GebGemeente, overldatum, OverlGemeente, site, map, bestandsnaam, verzameling, Type)
                    VALUES ('"
.$idr."',
                            '"
.$naam."',
                            '"
.$voornaam."',
                            '"
.$gebdatum."',
                            '"
.$gebgem."',
                            '"
.$overldatum."',
                            '"
.$overlgem."',
                            '"
.$site."',
                            '"
.$map."',
                            '"
.$bestand."',
                            '"
.$verz."',
                            '"
.$type."')";
                    
                    
                    $idr=$idr+1;
                    fwrite($mijnbestand, $idr);
                    fclose($mijnbestand);
                }
                
            }

            
            // Close opened CSV file
            fclose($csvFile);
            
            $qstring = '?status=succ';
        }
else{
            $qstring = '?status=err';
        }
    }
else{
        $qstring = '?status=invalid_file';
    }
}


// Redirect to the listing page
// header("Location: csvupload.php".$qstring);[/code]
 
PHP hulp

PHP hulp

19/03/2024 07:39:30
 
- Ariën  -
Beheerder

- Ariën -

06/08/2022 12:44:29
Quote Anchor link
Je moet de query uitvoeren! Dat gebeurt niet!
 
Ignace Verschaeve

Ignace Verschaeve

06/08/2022 14:37:59
Quote Anchor link
Hoe bedoel je. Gebeurt dat dan niet vanaf regel 47. Kijken of er records aanwezig zijn, zo ja updaten, zo nee aanvullen? Ik zie niet hoe ik het anders kan doen. Voorbeeldje indien mogelijk.
 
- Ariën  -
Beheerder

- Ariën -

06/08/2022 14:47:46
Quote Anchor link
Je INSERT en UPDATE query doet niks. Je bouwt hem enkel op. Dat is niet voldoende.
Gewijzigd op 06/08/2022 14:48:54 door - Ariën -
 
Ivo P

Ivo P

06/08/2022 19:12:30
Quote Anchor link
Ik zou eerst zorgen dat je database weet dat de combinatie naam+geboortedatum unique moet zijn.
Dat kun je in je tabel namelijk aangeven.

Het opnieuw inserten van een record met dezelfde naam en geb.datum combinatie zal dan ook mislukken.

Je query wordt dan (in 1x)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
INSERT INTO rouwbrief
(naam, geboortedatum, etc, bestandsnaam )
VALUES ('X', 'Y', 1, 'file.pdf')
ON DUPLICATE UPDATE bestandsnaam = 'file.pdf'


https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

Dat zal sneller zijn dan stuk voor stuk de records op te halen om te zien of ze al bestaan: dat kan de database zelf ook regelen.

Toevoeging op 06/08/2022 19:13:23:

en het is wel handigom er vanuit te gaan dat bijvoorbeeld de naam best eens een ' zou kunnen bevatten....
 
Ignace Verschaeve

Ignace Verschaeve

06/08/2022 20:13:50
Quote Anchor link
Ondertussen ben ik al iets verder. Al had een voorbeeldje ook beter geholpen. Maar soit. Ondertussen doet hij wel de update maar hij vult de records niet aan. Ik krijg volgende foutmelding:
Error updating record: Incorrect integer value: '' for column `fv_vl_ardennen_berouwbrief`.`rouwbrief`.`IDR` at row 1Absolon Albert 30-06-1905 Absolon Albert 1905-06-30.pdf
IDR is in de database Autoincrement (integer van 8 posities). Dus het getal heb ik in een bestandje telleridr.txt gestoken.
De bedoeling is dat hij het getal leest, het gebruikt om het record in te vullen en dan dat het getal met 1 verhoogd wordt en dan terug wordt weggeschreven in mijn tellerbestand voor volgend gebruik. Daar moet ik nu een oplossing voor vinden.
@Ivo P. Ik wel wel uw oplossing proberen maar ik vind niet hoe in mijn PHP Admin hoe ik naam en geboortedatum uniek kan maken. Elk afzonderlijk wel maar de familienaam kan meerdere keren voorkomen en ook de geboortedatum. Hoe ik die combinatie moet doen snap ik niet.
 
Adoptive Solution

Adoptive Solution

06/08/2022 20:35:38
Quote Anchor link
Vergeet dat bestand en maak het IDR veld autoincrement.
Het wordt tenslotte al met 1 verhoogd.

Tenzij dat nummer ook elders wordt gebruikt als index, kan je het IDR op deze manier aanpassen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SET @var_name = 13018685;
UPDATE rouwbrief SET IDR = (@var_name := @var_name +1);
ALTER TABLE rouwbrief AUTO_INCREMENT = 1;


IDR verder niet gebruiken bij INSERT.

Dan:
Regel 51 is ALTIJD waar als een SELECT wordt gedaan.
Of er nu wel of geen record bestaat, >= 0 is altijd waar, waarna een UPDATE volgt op een mogelijk niet bestaand record.

En de IDR die je terugkrijgt, kun je gebruiken in de WHERE van de UPDATE. Wat natuurlijk niet lukt als het record niet bestaat.

En vergeet niet om de update en insert ook uit te voeren. Zie regel 48 waar je het wel doet.
Gewijzigd op 06/08/2022 20:36:35 door Adoptive Solution
 
Ignace Verschaeve

Ignace Verschaeve

06/08/2022 21:27:17
Quote Anchor link
Ondertussen deze code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
// inladen instellingen
include '../instellingen.php';
$conn = new mysqli($database_adres, $database_login_naam, $database_login_wachtwoord, $database_naam);
//connectie testen
if ($conn->connect_error)
{

    die("verbinding mislukt: ".$conn->connect_error);
}


if(isset($_POST['importSubmit'])){
    
    // Toestane mime types
    $csvMimes = array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain');
    
    // Valideren als het een toegestane csv file is.
    if(!empty($_FILES['file']['name']) && in_array($_FILES['file']['type'], $csvMimes)){
        
        // If the file is uploaded
        if(is_uploaded_file($_FILES['file']['tmp_name'])){
            
            // Open uploaded CSV file in read-only mode
            $csvFile = fopen($_FILES['file']['tmp_name'], 'r');
            
            // Skip the first line
            fgetcsv($csvFile);
            
            // Haal data uit CSV file lijn per lijn
            while(($line = fgetcsv($csvFile)) !== FALSE){
                // Get rij data
                $naam   = $line[0];
                $voornaam  = $line[1];
                $gebdatum = $line[2];
                $bestand = $line[3];
                // Hier worden nog enkele vaste variabelen gemaakt.
                $gebgem = "/";
                $overldatum = "00-00-0000";
                $overlgem = "/";
                $site = "https://xxxxx.be/";
                $map = "weterring/hk-wr-data/";
                $verz = "hk-westerring";
                $type = "RB";
                // Uitlezen van de gegevens in de csv
                echo $naam." ".$voornaam." ".$gebdatum." ".$bestand.": ";
            
                // Check of er reeds records zijn met dezelfde Naam, Voornaam, gebdatum
                $sqlprev = "SELECT IDR FROM rouwbrief WHERE Naam LIKE '$naam%' AND Voornaam LIKE '%$voornaam%' AND gebdatum LIKE '$gebdatum%'";
                $result = $conn->query($sqlprev);
                //$prevResult = $db->query($prevQuery);
                
                if ($result->num_rows > 0)
                    {

                    // Update member data in the database
                    $sqlupd = "UPDATE rouwbrief SET bestandsnaam = '".$bestand."' WHERE Naam LIKE '".$naam."' AND gebdatum LIKE '".$gebdatum."'";
                    if (mysqli_query($conn, $sqlupd)) {
                    echo "Record met succes geupdated: " . "<br>";
                    }
else {
                    echo "Error updating record: " . mysqli_error($conn). "<br>";
}
                }
else{
                    /*Insert member data in the database
                    Teller start op 13018685 omdat IDR telkens 1 moet verhoogt worden per nieuw record. Kan niet met autoincrement.
                    Omdat de eerste 2 cijfers van IDR ook een verwijzing zijn naar een verzameling.
                    */

                    $mijnbestand = fopen("telleridr.txt", "r") or die("Kan bestand niet openen!");    
                    $idr = (int)fread($mijnbestand,30);
                    fclose($mijnbestand);
                    echo $idr;
                    
                    $sqlins = "INSERT INTO rouwbrief (IDR, Naam, Voornaam, gebdatum, GebGemeente, overldatum, OverlGemeente, site, map, bestandsnaam, verzameling, Type)
                    VALUES ('"
.$idr."',
                            '"
.$naam."',
                            '"
.$voornaam."',
                            '"
.$gebdatum."',
                            '"
.$gebgem."',
                            '"
.$overldatum."',
                            '"
.$overlgem."',
                            '"
.$site."',
                            '"
.$map."',
                            '"
.$bestand."',
                            '"
.$verz."',
                            '"
.$type."')";
                    if (mysqli_query($conn, $sqlins)) {
                    echo "Record met succes bijgevoegd: " . "<br>";
                    }
else {
                    echo "Error invoegen record: " . mysqli_error($conn). "<br>";
}

                    
                    $idr=$idr+1;
                    $mijnbestand = fopen("telleridr.txt", "w") or die("Kan bestand niet openen!");    
                    fwrite($mijnbestand, $idr);
                    fclose($mijnbestand);
                }
                
            }

            
            // Close opened CSV file
            fclose($csvFile);
            
            $qstring = '?status=succ';
        }
else{
            $qstring = '?status=err';
        }
    }
else{
        $qstring = '?status=invalid_file';
    }
}


// Redirect to the listing page
// header("Location: csvupload.php".$qstring);



Maar ik krijg de volgende meldingen:
Abelleyt Lucia 27-02-1901 Abelleyt Lucia 1901-02-27.pdf: Record met succes geupdated:
Absolon Albert 30-06-1905 Absolon Albert 1905-06-30.pdf: 1Error invoegen record: Duplicate entry '1' for key 'PRIMARY'
Achtergael Alex 06-08-1928 Achtergael Alex 1928-08-06.pdf: 2Error invoegen record: Duplicate entry '2' for key 'PRIMARY'
Achtergaele Bertrand 05-02-1930 Achtergaele Bertrand 1930-02-05.pdf: 3Error invoegen record: Duplicate entry '3' for key 'PRIMARY'
Ackerman Godelieve 15-03-1930 Ackerman Godelieve 1930-03-15.pdf: 4Error invoegen record: Duplicate entry '4' for key 'PRIMARY'
Adam Achiel 16-09-1909 Adam Achiel 1909-09-16.pdf: Record met succes geupdated:
Adam Anna Maria 27-07-1914 Adam Anna Maria 1914-07-27.pdf: 5Error invoegen record: Duplicate entry '5' for key 'PRIMARY'
Adam Clementine 10-01-1876 Adam Clementine 1876-01-10.pdf: Record met succes geupdated:
Adam Denise 12-07-1925 Adam Denise 1925-07-12.pdf: Record met succes geupdated:
Adam Imma 01-08-1914 Adam Imma 1914-08-01.pdf: Record met succes geupdated:
Adam Irena 13-10-1911 Adam Irena 1911-10-13.pdf: 6Error invoegen record: Duplicate entry '6' for key 'PRIMARY'
Adam Jozef 15-09-1941 Adam Jozef 1941-09-15.pdf: Record met succes geupdated:
Adam Jules 05-12-1918 Adam Jules 1918-12-05.pdf: Record met succes geupdated:
Adam Margareta 12-05-1914 Adam Margareta 1914-05-12.pdf: Record met succes geupdated:
Adam Remi 05-05-1883 Adam Remi 1883-05-05.pdf: Record met succes geupdated:
Adam Virginie Gabrielle 09-03-1907 Adam Virginie Gabrielle 1907-03-09.pdf: 7Record met succes bijgevoegd:
Adams Armand Jerome Michel 27-09-1925 Adams Armand Jerome Michel 1925-09-27.pdf: Record met succes geupdated:
Adriaens Elsa 10-02-1913 Adriaens Elsa 1913-02-10.pdf: Record met succes geupdated:
Adriaens Gabrielle Maria 20-05-1886 Adriaens Gabrielle Maria 1886-05-20.pdf: 8Error invoegen record: Duplicate entry '8' for key 'PRIMARY'
De teller wordt blijkbaar niet gelezen. Dus ga ik de gesuggereerde oplossing eens uitproberen.
Maar het zal voor morgen zijn.
Gewijzigd op 07/08/2022 09:41:46 door Ignace Verschaeve
 
- Ariën  -
Beheerder

- Ariën -

06/08/2022 22:20:14
Quote Anchor link
Sluit je PHP-code ;-)
 
Ignace Verschaeve

Ignace Verschaeve

07/08/2022 09:34:03
Quote Anchor link
Volgens mij heb ik dat netjes gedaan, Ik heb gewoon gebruikt wat ik kon gebruiken.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1

// Redirect to the listing page
// header("Location: csvupload.php".$qstring);

Maar ik krijg de volgende meldingen:
Abelleyt Lucia 27-02-1901 Abelleyt Lucia 1901-02-27.pdf: Record met succes geupdated:
Absolon Albert 30-06-1905 Absolon Albert 1905-06-30.pdf: 1Error invoegen record: Duplicate entry '1' for key 'PRIMARY'
Achtergael Alex 06-08-1928 Achtergael Alex 1928-08-06.pdf: 2Error invoegen record: Duplicate entry '2' for key 'PRIMARY'

Toevoeging op 07/08/2022 09:40:37:

@Adoptive Solution
Ik zet dus deze code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SET @var_name = 13018685;
UPDATE rouwbrief SET IDR = (@var_name := @var_name +1);
ALTER TABLE rouwbrief AUTO_INCREMENT = 1;

net na lijn 61.
Ik probeer het uit.
 
Adoptive Solution

Adoptive Solution

07/08/2022 11:02:57
Quote Anchor link
Voor wie het wil proberen.
Let op : de kolomnamen zijn aangepast t.o.v. de originele code

De table code :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DROP TABLE IF EXISTS `rouwbrief`;
CREATE TABLE `rouwbrief` (
  `IDR` bigint(20) NOT NULL AUTO_INCREMENT,
  `Naam` varchar(255) NOT NULL,
  `Voornaam` varchar(255) NOT NULL,
  `Geboortedatum` date NOT NULL,
  `GeboorteGemeente` varchar(255) NOT NULL,
  `Overledendatum` date NOT NULL,
  `OverledenGemeente` varchar(255) NOT NULL,
  `Site` varchar(255) NOT NULL,
  `Map` varchar(255) NOT NULL,
  `Bestandsnaam` varchar(255) NOT NULL,
  `Verzameling` varchar(255) NOT NULL,
  `Type` varchar(255) NOT NULL,
  PRIMARY KEY (`IDR`)
) ENGINE=InnoDB AUTO_INCREMENT=13018685 DEFAULT CHARSET=utf8mb4;


Het csv tekstbestand :

Let op de datum velden.
Die zijn yyyy-mm-dd
Waren eerst dd-mm-yyyy

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
naam,voornaam,gebdatum,bestand
Abelleyt,Lucia,1901-02-27,Abelleyt Lucia 1901-02-27.pdf
Absolon,Albert,1905-06-30,Absolon Albert 1905-06-30.pdf
Achtergael,Alex,1928-08-06,Achtergael Alex 1928-08-06.pdf
Achtergaele,Bertrand,1930-02-05,Achtergaele Bertrand 1930-02-05.pdf
Ackerman,Godelieve,1930-03-16,Ackerman Godelieve 1930-03-15.pdf
Adam,Achiel,1909-09-16,Adam Achiel 1909-09-16.pdf
Adam,Anna Maria,1914-07-27,Adam Anna Maria 1914-07-27.pdf
Adam,Clementine 1876-01-10,Adam Clementine 1876-01-10.pdf
Adam,Denise,1925-07-12,Adam Denise 1925-07-12.pdf
Adam,Imma,1914-08-01,Adam Imma 1914-08-01.pdf
Adam,Irena,1911-10-13,Adam Irena 1911-10-13.pdf
Adam,Jozef,1941-09-15,Adam Jozef 1941-09-15.pdf
Adam,Jules,1918-12-05,Adam Jules 1918-12-05.pdf
Adam,Margareta,1914-12-05,Adam Margareta 1914-05-12.pdf
Adam,Remi,1883-05-05,Adam Remi 1883-05-05.pdf
Adam,Virginie Gabrielle,1907-03-09,Adam Virginie Gabrielle 1907-03-09.pdf
Adams,Armand Jerome Michel,1925-09-27,Adams Armand Jerome Michel 1925-09-27.pdf
Adriaens,Elsa,1913-02-10,Adriaens Elsa 1913-02-10.pdf
Adriaens,Gabrielle Maria,1886-05-20,Adriaens Gabrielle Maria 1886-05-20.pdf


Het PHP bestand :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
<?php
if( isset( $_POST['importSubmit'] ) )
{

    echo '<pre>' . print_r( $_POST, TRUE ) . '</pre>';
    echo '<pre>' . print_r( $_FILES, TRUE ) . '</pre>';
    include('connect.php');
    // Toestane mime types
    $csvMimes = [
        'text/x-comma-separated-values',
        'text/comma-separated-values',
        'application/octet-stream',
        'application/vnd.ms-excel',
        'application/x-csv',
        'text/x-csv',
        'text/csv',
        'application/csv',
        'application/excel',
        'application/vnd.msexcel',
        'text/plain'
    ];
    echo '<pre>' . print_r( $csvMimes, TRUE ) . '</pre>';

        // If the file is uploaded && Valideren als het een toegestane csv file is.
        if( is_uploaded_file( $_FILES['userfile']['tmp_name'] ) && in_array($_FILES['userfile']['type'], $csvMimes) )
        {

            echo "<p>File ". $_FILES['userfile']['name'] ." uploaded successfully.</p>\n";
            echo "<p>Displaying contents</p>\n";
            readfile($_FILES['userfile']['tmp_name']);
            // Open uploaded CSV file in read-only mode
            $csvFile = fopen( $_FILES['userfile']['tmp_name'], 'r');
            // Skip the first line
            fgetcsv($csvFile);
            // Haal data uit CSV file lijn per lijn
            while( ( $line = fgetcsv($csvFile ) ) !== FALSE )
            {

                echo '<pre>' . print_r( $line, TRUE ) . '</pre>';
                // Get rij data
                $Naam          = $line[0];
                $Voornaam      = $line[1];
                $Geboortedatum = $line[2];
                $Bestandsnaam  = $line[3];

                // Hier worden nog enkele vaste variabelen gemaakt.
                $GeboorteGemeente  = "/";
                $OverledenDatum    = "0000-00-00";
                $OverledenGemeente = "/";
                $Site              = "https://****.be/";
                $Map               = "weterring/hk-wr-data/";
                $Verzameling       = "hk-westerring";
                $Type              = "RB";

                // Uitlezen van de gegevens in de csv
                echo '<p>' . $Naam." ".$Voornaam." ".$Geboortedatum." ".$Bestandsnaam."</p>";

                // Check of er reeds records zijn met dezelfde Naam, Voornaam, gebdatum
                $sqlselect = "SELECT IDR FROM rouwbrief WHERE Naam = '$Naam' AND Voornaam = '$Voornaam' AND Geboortedatum = '$Geboortedatum';";
                echo '<p>' . $sqlselect . '</p>';
                $result = $db->query( $sqlselect );

                if ( $result->num_rows > 0 )
                {

                    $row = $result->fetch_object();
                    // Update member data in the database
                    $sqlupdate = "UPDATE rouwbrief SET Bestandsnaam = '" . $Bestandsnaam . "' WHERE IDR = " . $row->IDR;
                    echo '<p>' . $sqlupdate . '</p>';
                    $result = $db->query( $sqlupdate );
                }
else {

                    $sqlinsert = "INSERT INTO rouwbrief SET
                        Naam          = '$Naam',
                        Voornaam      = '$Voornaam',
                        Geboortedatum = '$Geboortedatum',
                        GeboorteGemeente  = '$GeboorteGemeente',
                        OverledenDatum    = '$OverledenDatum',
                        OverledenGemeente = '$OverledenGemeente',
                        Site          = '$Site',
                        Map           = '$Map',
                        Bestandsnaam  = '$Bestandsnaam',
                        Verzameling   = '$Verzameling',
                        Type          = '$Type';"
;

                    echo '<p>' . $sqlinsert . '</p>';
                    $result = $db->query( $sqlinsert );
                }
// end if else
            } // end while

            // Close opened CSV file

            fclose( $csvFile );
            $qstring = '?status=succ';
        }
else {
            $qstring = '?status=err';
        }

    ?>


<style>
table {
    border-collapse: collapse;
    border: 1px solid #999;
    }

th,td {
    border: 1px solid #999;
    padding: 0.500em;
    }
</style>

<table>
    <thead>
        <tr>
            <th>IDR</th>
            <th>Naam</th>
            <th>Voornaam</th>
            <th>Geboortedatum</th>
            <th>Bestandsnaam</th>
        </tr>
    </thead>
    <tbody>

    <?php
    $sqlSelect
= 'SELECT IDR, Naam, Voornaam, Geboortedatum, Bestandsnaam FROM rouwbrief;';
    $result = $db->query( $sqlSelect );
    if ( $result->num_rows > 0 )
    {

        while ( $row = $result->fetch_object() )
        {

        ?>


        <tr>
            <td><?php echo $row->IDR;           ?></td>
            <td><?php echo $row->Naam;          ?></td>
            <td><?php echo $row->Voornaam;      ?></td>
            <td><?php echo $row->Geboortedatum; ?></td>
            <td><?php echo $row->Bestandsnaam;  ?></td>
        </tr>

        <?php
        }
    }
else {
        ?>

        <tr>
            <td colspan="5">Geen data</td>
        </tr>
        <?php
    }
    ?>

    </body>
    <tfoot></tfoot>
</table>

<hr />

<?php
}
?>


<form method="post" enctype="multipart/form-data">
bestand <input type="file" name="userfile" /><br /><br />
<input type="submit" name="importSubmit" value="submit" />
</form>


Toevoeging op 07/08/2022 13:57:40:

Erratum
Op regel 9 van het tekstbestand ontbrak achter Clementine een komma.
Gewijzigd op 07/08/2022 16:04:18 door Adoptive Solution
 
Ivo P

Ivo P

07/08/2022 22:48:01
Quote Anchor link
voortbouwend op de CREATE query van Adoptive op 11:02:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
ALTER TABLE `rouwbrief`
    CHANGE COLUMN `Naam` `Naam` VARCHAR(100) NOT NULL COLLATE 'utf8mb4_general_ci' AFTER `IDR`,
    ADD UNIQUE INDEX `Index 2` (`Naam`, `Geboortedatum`);


Ik hb de lengte van de kolom Naam ingekort tot 100 letters (leek me genoeg en 255 gaf problemen met het maken van een unique-index.

NB: ik ben zelf voorstander van de INSERT INTO tabel (kolommen) VALUES (waarden) syntax. Die werkt in meer databases dan alleen mysql. Maar vereist wel meer tellen van de kolommen en opletten met de volgorde.

Daarna wordt het PHP script vanaf de while regel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
           while( ( $line = fgetcsv($csvFile ) ) !== FALSE )
            {

                echo '<pre>' . print_r( $line, TRUE ) . '</pre>';
                // Get rij data
                $Naam          = $line[0];
                $Voornaam      = $line[1];
                $Geboortedatum = $line[2];
                $Bestandsnaam  = $line[3];

                // Hier worden nog enkele vaste variabelen gemaakt.
                $GeboorteGemeente  = "/";
                $OverledenDatum    = "0000-00-00";
                $OverledenGemeente = "/";
                $Site              = "https://****.be/";
                $Map               = "weterring/hk-wr-data/";
                $Verzameling       = "hk-westerring";
                $Type              = "RB";

                $sqlinsert = "INSERT INTO rouwbrief SET
                        Naam          = '$Naam',
                        Voornaam      = '$Voornaam',
                        Geboortedatum = '$Geboortedatum',
                        GeboorteGemeente  = '$GeboorteGemeente',
                        OverledenDatum    = '$OverledenDatum',
                        OverledenGemeente = '$OverledenGemeente',
                        Site          = '$Site',
                        Map           = '$Map',
                        Bestandsnaam  = '$Bestandsnaam',
                        Verzameling   = '$Verzameling',
                        Type          = '$Type'
                      ON DUPLICATE UPDATE Bestandsnaam  = '$Bestandsnaam';"
;

                    echo '<p>' . $sqlinsert . '</p>';
                    $result = $db->query( $sqlinsert );

            }
// end while
?>


Enne:
Dit blijft misgaan als er in je invoer ergens een ' staat.
 
Ignace Verschaeve

Ignace Verschaeve

08/08/2022 10:38:10
Quote Anchor link
Ondertussen heb ik mijn eigen script draaiend gekregen en werkt het naar behoren. Na wat bijkomende moeilijkheden die opdoken. Zoals een bestandsnaam met spaties bijvoorbeeld "naam voornaam cijfers.pdf" wordt wel in de database gestoken maar als je dit wil uitlezen krijg je de foutmelding bestand niet gevonden. Dus alle bestandsnamen moeten aanpassen naar "naam_voornaam_cijfers.pdf". Dus geen spaties in bestandsnamen. En ook alle letters zoals é, è, ç, à en dergelijke vervangen door de pure letter. Blijkbaar worstelt MariaDB met dergelijke letters of is het de browser. Ik heb in elk geval nog niet gevonden wat de juiste UTF zou moeten zijn. Dit terzijde.
In elk geval aan iedereen bedankt voor de voorbeelden. Ik neem in ieder geval die ON DUPLICATE UPDATE mee naar de toekomst.
Ik heb in elk geval nu een oplossing om een index van ruim 20000 records te updaten met de bestandsnaam. Het spaart enorm vel werk ten opzichte van het manueel aanpassen en toevoegen.
 
- Ariën  -
Beheerder

- Ariën -

08/08/2022 10:46:13
Quote Anchor link
Ikzelf gebruik utf8mb4, die ook ondersteuning voor emoji's heeft. Als je die gebruikt moet je afhankelijk van je serversetting deze collation ook gebruiken in de charset functie van MySQLi. En uiteraard moet het hele script ook UTF-8 headers hebben.
 
Adoptive Solution

Adoptive Solution

08/08/2022 11:00:01
Quote Anchor link
KEY ontbreekt in ON DUPLICATE KEY UPDATE
 
Ivo P

Ivo P

08/08/2022 11:03:22
Quote Anchor link
Spaties in filenames is zelden een goed idee.
Maar als je dat hebt: zorg dat je html in elkgeval een link tussen "" heeft staan.

Dus niet <a href=bestand.pdf> maar <a href="bestand.php"> want anders snapt je browser niet waar je linkje eindigt.
<a href=bestand met spaties.pdf> zal zoeken naar een bestand genaamd "bestand" en "met" is kennelijk een property die de browser niet kent en dus negeert.

Maar met een _ is een stabielere oplossing.

daarbij is het ook zo, dat het liefst jouw script en niet de uploader kiest voor de bestandsnaam.

Een é in een bestandsnaam gaat ook niet per se goed :-).
Converteren naar een "e" is een goede oplossing, maar met rawurlencode() zou ook kunnen. Dan wordt een spatie %20 en op vergelijkbare manier wordt een é omgevormd. (zoek ik even niet op). De browser weet dat vervolgens weer terug te zetten naar een spatie of een é. MAar het leest voor de mens moeizaam.

Sowieso is dat wel een goed idee op naast jouw conversie naar "e" die rawurlencode() in te zetten, voor het geval jouw lijstje omzettingen niet uitputtend is.
 
Ignace Verschaeve

Ignace Verschaeve

08/08/2022 11:20:34
Quote Anchor link
@Ivo P. Ondertussen hebben we geleerd om de indexen die we maken zo simpel mogelijk te houden. Een naam aan Bourdheau'dhui of D'Huyvetter kan met of zonder afkappingsteken zijn. Dus laten we deze er allemaal uit. Ook spaties. Namen zoals Van den Bossche, vanden Bossche, Vandenbossche schrijven we op eenzelfde manier. Voor degene die opzoekt is de regel dan duidelijk zoek met de naam zonder spaties of speciale tekens. De juiste schrijfwijze kan hij dan terug vinden in de scan van het document. Maar wat is juist? Iedereen die zich met familiekunde bezig houdt weet dat familienamen door de eeuwen heen soms veranderen. Ondertussen ben ik anderhalf jaar bezig met onze site. Ik heb al veel geleerd. Leer nog elke dag bij om een index van ondertussen 100 000 namen bij te houden waar ruim 60 000 reeds voorzien zijn van een scan. Dat komt uit 7 verschillende verzamelingen van kringen of particulieren, alleen al het combineren vraagt veel werk. Van het scannen nog niet gesproken.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.