exporteren naar csv met PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Ignace Verschaeve

Ignace Verschaeve

31/10/2021 12:02:27
Quote Anchor link
Omdat ik hier al een paar keren goed ben geholpen. een nieuwe vraag.
Dit is de foutmelding:
rouwbrief010000
Fatal error: Uncaught Error: Call to undefined function mysql_fetch_assoc() in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php:25
Stack trace:
#0 {main}
thrown in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php on line 25
En zoals altijd zie ik het niet. Geprobeerdmet qoutes, bacticks enz.
Dit is mijn 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
<?php
// output headers so that the file is downloaded rather than displayed
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');
 // mysql database connection details
    include '../instellingen.php';
    // gegevens uit een keuzeformulier waar ze bestand en begin en eindrecord kunnen kiezen.
    $bestand = $_POST['bestand']; echo $bestand;
    $beginrec = $_POST['beginrec']; echo $beginrec;
    $eindrec = $_POST['eindrec']; echo $eindrec;
    
    // open connection to mysql database
    $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);
}

    
    // fetch mysql table rows
    $sql = "select * from $bestand WHERE IDR BETWEEN $beginrec AND $eindrec";
   $result = $conn->query($sql);

    $fp = fopen('books.csv', 'w');

    while ($row = mysql_fetch_assoc($result)) fputcsv($fp, $row);
    
    fclose($fp);

    //close the db connection
    mysqli_close($connection);
?>


En hier heb ik mijn mosterd gehaald:
https://code.iamkate.com/php/creating-downloadable-csv-files/
iemand enig idee waar ik in de fout ga?
 
PHP hulp

PHP hulp

06/10/2022 13:16:45
 
- Ariën  -
Beheerder

- Ariën -

31/10/2021 12:04:17
Quote Anchor link
Stap over de de MySQLi functies. Daar was je eerder al mee bezig.

De mysql_xxxx() functies zijn sinds PHP 7 verleden tijd.
Gewijzigd op 31/10/2021 12:06:02 door - Ariën -
 
Ozzie PHP

Ozzie PHP

31/10/2021 13:10:39
Quote Anchor link
Ignace Verschaeve op 31/10/2021 12:02:27:
En zoals altijd zie ik het niet.

Het handige is dat PHP niet zomaar een foutmelding geeft, maar een foutmelding die zowaar aangeeft WAT er misgaat.

Ignace Verschaeve op 31/10/2021 12:02:27:
Dit is de foutmelding:
rouwbrief010000
Fatal error: Uncaught Error: Call to undefined function mysql_fetch_assoc()

Als je dat vertaalt, dan blijkt dat er een niet-bestaande functie wordt aangeroepen, namelijk mysql_fetch_assoc(). Dat heeft dus niks met quotes en backticks te maken. Dus als je voortaan even goed de foutmelding bestudeert, kom je al een heel eind ;-)
 
Ignace Verschaeve

Ignace Verschaeve

31/10/2021 13:53:09
Quote Anchor link
Dit is nu de error:
Quote:
Fatal error: Uncaught TypeError: mysqli_fetch_array(): Argument #1 ($result) must be of type mysqli_result, bool given in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php:26
Stack trace:
#0 /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php(26): mysqli_fetch_array(false)
#1 {main}
thrown in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php on line 26

Nadat ik de code als volgt heb veranderd:
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
<?php
// output headers so that the file is downloaded rather than displayed
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');
 // mysql database connection details
    include '../instellingen.php';
    // gegevens uit een keuzeformulier waar ze bestand en begin en eindrecord kunnen kiezen.
    $bestand = $_POST['bestand']; echo $bestand;
    $beginrec = $_POST['beginrec']; echo $beginrec;
    $eindrec = $_POST['eindrec']; echo $eindrec;
    
    // open connection to mysql database
    $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);
}

    
    // fetch mysql table rows
    $sql = "select * from '$bestand' WHERE 'IDR' BETWEEN $beginrec AND $eindrec";
   $result = $conn->query($sql);

    $fp = fopen('books.csv', 'w');
$i=0;
 while($row = mysqli_fetch_array($result)){
    fputcsv($fp, $row);
    $i++;
 }

    fclose($fp);

    //close the db connection
    mysqli_close($conn);
?>

Ik zit nog ergens fout.
Gewijzigd op 31/10/2021 13:54:29 door Ignace Verschaeve
 
- Ariën  -
Beheerder

- Ariën -

31/10/2021 14:13:11
Quote Anchor link
Voeg eens foutafhandeling toe aan je query die je uitvoert, met $conn->error.


Nog een tipje:
Gebruik de twee verschillende soorten notaties met de pijlen (OO) en de functies (procedureel) niet door elkaar. Het kan wel, maar er zijn soms randgevallen waardoor er vreemde situaties ontstaan, plus dat de notatie wel eens verschilt wat verwarring veroorzaakt.

En let hier ook op SQL-injection.
Gewijzigd op 31/10/2021 14:13:38 door - Ariën -
 
Ignace Verschaeve

Ignace Verschaeve

31/10/2021 15:18:19
Quote Anchor link
Quote:
Voeg eens foutafhandeling toe aan je query die je uitvoert, met $conn->error.


Is dat hetgeen op lijn 15 tot 17 staat? Of verwacht je zoiets nog ergens anders?

Quote:
Nog een tipje:
Gebruik de twee verschillende soorten notaties met de pijlen (OO) en de functies (procedureel) niet door elkaar. Het kan wel, maar er zijn soms randgevallen waardoor er vreemde situaties ontstaan, plus dat de notatie wel eens verschilt wat verwarring veroorzaakt.

Graag een voorbeeld waar dit hier gebeurt.

Quote:
En let hier ook op SQL-injection.

Momenteel nog niet aan de orde. Zal enkel toe gelaten zijn voor een beperkt aantal beheerders, niet voor het grote publiek.
 
Adoptive Solution

Adoptive Solution

31/10/2021 15:21:13
Quote Anchor link
Quote:
Graag een voorbeeld waar dit hier gebeurt.

Regel 26 en 33.

https://www.php.net/manual/en/mysqli-result.fetch-array.php
Gewijzigd op 31/10/2021 15:22:16 door Adoptive Solution
 
- Ariën  -
Beheerder

- Ariën -

31/10/2021 15:22:29
Quote Anchor link
Je wilt naast een fout in je connectie ook graag alle fouten in je query zien. Dus zorg voor een controle of $result FALSE is, en toon dan een error.

Op lijn 22 gebruik je de OO-techniek, maar op lijn 26 gebruik je de procedure techniek.

SQL-injection is altijd aan de orde. Een slot zet je ook nooit achteraf op een huis, maar vanaf dat je de deur erin zet. Bovendien is het niet enkel een beveiliging tegen hackers, maar voornamelijk een preventie die ervoor zorgt dat alle foute tekens ge-escaped worden. Hackers maken daar gebruik van, maar je kan ze er ook zelf onwetend in sluipen, met bijv. 's Hertogenbosch.
 
Ivo P

Ivo P

01/11/2021 14:40:31
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
 $sql
= "select * from '$bestand' WHERE 'IDR' BETWEEN $beginrec AND $eindrec";
?>


Daar maak je dezelfde fout met quotes als vorige week met je insert (of update) query: je zet single quotes waar eventueel (en erg overbodig) backtics zouden mogen staan.

En op de plek waar je wél quotes zou kunnen zetten en ze ivm sql injectie nuttig zijn, laat jij ze juist achterwege.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
 $sql
= "select * from $bestand WHERE IDR BETWEEN '$beginrec' AND '$eindrec'";
?>
 
Ignace Verschaeve

Ignace Verschaeve

02/11/2021 08:36:34
Quote Anchor link
Dit is ondertussen de stand van zaken:
foutmelding
Quote:
rouwbrief05000
Fatal error: Uncaught Error: Call to a member function fetch_array() on bool in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php:27
Stack trace:
#0 {main}
thrown in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php on line 27

Huidige 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
<?php
// output headers so that the file is downloaded rather than displayed
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');
 // mysql database connection details
    include '../instellingen.php';
    
    
    // open connection to mysql database
    $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);
}

    // gegevens uit een keuzeformulier waar ze bestand en begin en eindrecord kunnen kiezen.
    $bestand = mysqli_real_escape_string($conn,$_POST['bestand']); echo $bestand;
    $beginrec = mysqli_real_escape_string($conn,$_POST['beginrec']); echo $beginrec;
    $eindrec = mysqli_real_escape_string($conn,$_POST['eindrec']); echo $eindrec;
    // fetch mysql table rows
    $sql = "select * from '$bestand' WHERE 'IDR' BETWEEN `$beginrec` AND `$eindrec`";
   $result = $conn->query($sql);


    $fp = fopen('books.csv', 'w');

    $row = $result -> fetch_array(MYSQLI_ASSOC);
    foreach ($row as $waarde){
    fputcsv($fp, $waarde);
    
 }



    fclose($fp);

    //close the db connection
    mysqli_close($conn);
?>


En een voorbeeldje hoe het zou kunnen (moeten) zijn is meer dan welkom. Als er iemand zegt ik kan dat telefoonnummer niet bereiken is die ook niet gebaat met de uitleg dat het nummer misschien niet meer actief is maar wel met" probeer eens dit nummer". ;-)
 
- Ariën  -
Beheerder

- Ariën -

02/11/2021 09:21:44
Quote Anchor link
- Ariën - op 31/10/2021 15:22:29:
Je wilt naast een fout in je connectie ook graag alle fouten in je query zien. Dus zorg voor een controle of $result FALSE is, en toon dan een error.

 
Ozzie PHP

Ozzie PHP

02/11/2021 10:05:42
Quote Anchor link
Ignace Verschaeve op 02/11/2021 08:36:34:
Dit is ondertussen de stand van zaken:

En wat heb je zelf inmiddels al geprobeerd om het probleem op te lossen? Heb je al gekeken naar de specifieke foutmelding? En zo ja, wat heb je daarmee gedaan?
 
Ivo P

Ivo P

02/11/2021 10:18:08
Quote Anchor link
Ignace Verschaeve op 02/11/2021 08:36:34:
Dit is ondertussen de stand van zaken:
foutmelding
Quote:
rouwbrief05000
Fatal error: Uncaught Error: Call to a member function fetch_array() on bool in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php:27
Stack trace:
#0 {main}
thrown in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php on line 27

Huidige code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
   $sql
= "select * from '$bestand' WHERE 'IDR' BETWEEN `$beginrec` AND `$eindrec`";
?>


Ik heb in je eerdere topic betoogd dat "men" geen backtics zou moeten gebruiken.
Niet iedereen is het er mee eens.

Maar hier zie je dus een query waaruit de verwarring blijkt: je verwisselt hier de single quotes en backtics:

Het zou werken *) met zowel
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
   $sql
= "select * from `$bestand` WHERE `IDR` BETWEEN '$beginrec' AND '$eindrec'";
?>

als met
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
   $sql
= "select * from $bestand WHERE IDR BETWEEN '$beginrec' AND '$eindrec'";
?>


waarbij de laatste mijn voorkeur heeft.

*): aangenomen dat er naast deze query-syntax-fout niet nog meer dingen fout zijn
Gewijzigd op 02/11/2021 10:18:48 door Ivo P
 
Ignace Verschaeve

Ignace Verschaeve

02/11/2021 12:33:15
Quote Anchor link
Ozzie PHP op 02/11/2021 10:05:42:
Ignace Verschaeve op 02/11/2021 08:36:34:
Dit is ondertussen de stand van zaken:

En wat heb je zelf inmiddels al geprobeerd om het probleem op te lossen? Heb je al gekeken naar de specifieke foutmelding? En zo ja, wat heb je daarmee gedaan?


Ik ben er al uren mee bezig geweest. En ik zie en lees de foutmelding maar ik heb nog geen tips gekregen over hoe ik het oplos. Ik ben al jaren medewerker op een forum en heb jaren gewerkt om klanten te helpen. Als een klant een foutmelding kreeg op zijn TV of PC dan was mijn vraag niet of ze dat gezien hadden maar wel of ze dit of dat al geprobeerd hadden. Ik stuurde geen klanten naar huis met de vraag wat heb je er al aan gedaan? Dat is als naar de dokter gaan en zeggen dat je hartkloppingen hebt en die zou dan de vraag stellen wat heb je er al aan gedaan? Als jij mij nu uitlegt wat die specifieke foutmelding nu betekent en uitlegt wat ik eraan kan doen dan zijn we een stap verder. ;-)
Gewijzigd op 02/11/2021 12:37:46 door Ignace Verschaeve
 
Ivo P

Ivo P

02/11/2021 12:42:03
Quote Anchor link
de vertaling van de foutmelding
Quote:
Fatal error: Uncaught Error: Call to a member function fetch_array() on bool in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php:27


"fout:

Je doet een aanroep naar de functie (method van een object / member function) genaamd fetch_array() op een Boolean. (een boolean is true / false en een boolean is geen object).
Dit alles vindt plaats op regel 27 van .../export_naar_csv.php"

aldaar zien wij:
$row = $result -> fetch_array(MYSQLI_ASSOC);

Daar zien we inderdaad fetch_array().
En $result is volgens de foutmelding een Boolean, en geen object.

Waar komt $result vandaan?
Zie regel 22: $result = $conn->query($sql);

query() geeft normaal een resultset terug (bij een select-query), maar in dit geval een boolean.
Je kunt het opzoeken in de manual op php.net, maar de snelle versie "als het uitvoeren van de query mislukt, dan geeft deze functie FALSE terug).

"Dus" de query is mislukt.
Redenen?
* de query bevat een syntax fout
* de query doet iets wat niet past bij de database (een tabel of kolom bestaat helemaal niet)
* je hebt geen verbinding met de database.

Dat kún je opvragen met de mysql error functies.

Maar aangezien je nogal hardnekkig de opmerkingen over quotes in de query die op verkeerde plekken staan negeert, zou ik daar eens mee beginnen.
 
- Ariën  -
Beheerder

- Ariën -

02/11/2021 13:56:33
Quote Anchor link
Zie https://www.php.net/mysqli_error, en dan example #1

Als je wat meer bedreven bent met OO, dan kan je altijd nog een centrale foutafhandeling maken door de MySQLi klasse uit te breiden, zoals in voorbeeld 19 van de tutorialtutorial.
Gewijzigd op 02/11/2021 14:09:25 door - Ariën -
 
Ozzie PHP

Ozzie PHP

02/11/2021 14:20:33
Quote Anchor link
Ignace Verschaeve op 02/11/2021 12:33:15:
En ik zie en lees de foutmelding maar ik heb nog geen tips gekregen over hoe ik het oplos.

Dat komt omdat we ook een stukje eigen inzet verwachten. Jij plempt hier nu al een paar keer een stuk code neer met de opmerking 'werkt niet'. Wij willen dan graag zien wat je zelf geprobeerd hebt om het op te lossen. Daarbij willen we ook een concrete vraag van jou zien. Als je de foutmelding niet snapt, stel daar dan een vraag over. Dat komt wat prettiger over dan dat je hier iets plaatst zonder een concrete vraag te stellen.

Ignace Verschaeve op 02/11/2021 12:33:15:
Ik ben al jaren medewerker op een forum en heb jaren gewerkt om klanten te helpen. Als een klant een foutmelding kreeg op zijn TV of PC dan was mijn vraag niet of ze dat gezien hadden maar wel of ze dit of dat al geprobeerd hadden. Ik stuurde geen klanten naar huis met de vraag wat heb je er al aan gedaan?

Hartstikke leuk, maar jij bent geen klant en ik geen verkoper ;-) We zijn gewoon forumleden die elkaar proberen te helpen. En dat komt van 2 richtingen. Toon dus zelf ook wat inzet ... laat weten wat je niet snapt en waar je op vastloopt. Snap je de foutmelding niet? Geef dan aan wat je niet snapt. Dat is iets anders dan een lapje code en een foutmelding plaatsen en verwachten dat iemand anders al het werk doet. Daarnaast zijn er al wat tips gegeven, waar je maar weinig mee lijkt te doen.

Ignace Verschaeve op 02/11/2021 12:33:15:
Dat is als naar de dokter gaan en zeggen dat je hartkloppingen hebt en die zou dan de vraag stellen wat heb je er al aan gedaan? Als jij mij nu uitlegt wat die specifieke foutmelding nu betekent en uitlegt wat ik eraan kan doen dan zijn we een stap verder. ;-)

Hartkloppingen worden onderhuids opgewekt door iets wat jij niet kunt zien. Deze vastlopende code heb jij echter zelf gerpoduceerd en is gewoon inzichtelijk, dus die vergelijking gaat niet op. Het is meer alsof je naar de dokter gaat en zegt "Dokter m'n arm bloedt!", waarop de dokter aan jou vraagt "Heb je al geprobeerd om die satéprikker eruit te halen?"
 
Ignace Verschaeve

Ignace Verschaeve

02/11/2021 17:49:31
Quote Anchor link
Ivo P op 02/11/2021 12:42:03:
de vertaling van de foutmelding
Quote:
Fatal error: Uncaught Error: Call to a member function fetch_array() on bool in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php:27


"fout:

Je doet een aanroep naar de functie (method van een object / member function) genaamd fetch_array() op een Boolean. (een boolean is true / false en een boolean is geen object).
Dit alles vindt plaats op regel 27 van .../export_naar_csv.php"

aldaar zien wij:
$row = $result -> fetch_array(MYSQLI_ASSOC);

Daar zien we inderdaad fetch_array().
En $result is volgens de foutmelding een Boolean, en geen object.

Waar komt $result vandaan?
Zie regel 22: $result = $conn->query($sql);

query() geeft normaal een resultset terug (bij een select-query), maar in dit geval een boolean.
Je kunt het opzoeken in de manual op php.net, maar de snelle versie "als het uitvoeren van de query mislukt, dan geeft deze functie FALSE terug).

"Dus" de query is mislukt.
Redenen?
* de query bevat een syntax fout
* de query doet iets wat niet past bij de database (een tabel of kolom bestaat helemaal niet)
* je hebt geen verbinding met de database.

Dat kún je opvragen met de mysql error functies.

Maar aangezien je nogal hardnekkig de opmerkingen over quotes in de query die op verkeerde plekken staan negeert, zou ik daar eens mee beginnen.


Dit noem ik nu eens een deftig antwoord. De queri is mislukt en je zegt mij de mogelijke oorzaken. Bedankt, nu weet ik waar ik moet zoeken. Mocht ik een expert zijn heb ik geen hulp nodig.

Toevoeging op 02/11/2021 17:52:29:

Ozzie PHP op 02/11/2021 14:20:33:
Ignace Verschaeve op 02/11/2021 12:33:15:
En ik zie en lees de foutmelding maar ik heb nog geen tips gekregen over hoe ik het oplos.

Dat komt omdat we ook een stukje eigen inzet verwachten. Jij plempt hier nu al een paar keer een stuk code neer met de opmerking 'werkt niet'. Wij willen dan graag zien wat je zelf geprobeerd hebt om het op te lossen. Daarbij willen we ook een concrete vraag van jou zien. Als je de foutmelding niet snapt, stel daar dan een vraag over. Dat komt wat prettiger over dan dat je hier iets plaatst zonder een concrete vraag te stellen.

 
- Ariën  -
Beheerder

- Ariën -

02/11/2021 17:56:37
Quote Anchor link
Hopelijk lukt het nu :-)
 
Ignace Verschaeve

Ignace Verschaeve

02/11/2021 18:05:44
Quote Anchor link
Quote:

Dat komt omdat we ook een stukje eigen inzet verwachten. Jij plempt hier nu al een paar keer een stuk code neer met de opmerking 'werkt niet'. Wij willen dan graag zien wat je zelf geprobeerd hebt om het op te lossen. Daarbij willen we ook een concrete vraag van jou zien. Als je de foutmelding niet snapt, stel daar dan een vraag over. Dat komt wat prettiger over dan dat je hier iets plaatst zonder een concrete vraag te stellen.
[/quote]
Mijn concrete vraag staat al in het begin van de topic. "Waar ga ik in de fout"
Ondertussen heb ik de raadgevingen die er stonden uitgevoerd. En heb ik verschillende dingen geprobeerd. Maar niemand heeft er mij op gewezen dat ik mogelijks geen connectie hebt met mijn database. Sorry maar zo heb ik nog nooit mensen geholpen. Ik verwacht niet dat je mij een complete code geeft, verre van, maar je ziet zo dat ik de foutmelding niet snapte, want dan zou ik wel geweten hebben waar te zoeken. Ik dacht altijd dat fora er waren om mensen te helpen, hoe dom ze ook zijn.
 
- Ariën  -
Beheerder

- Ariën -

02/11/2021 18:12:43
Quote Anchor link
Je quote gaat mis
 

Pagina: 1 2 volgende »



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.