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:
<?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?
Stap over de de MySQLi functies. Daar was je eerder al mee bezig.

De mysql_xxxx() functies zijn sinds PHP 7 verleden tijd.
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 ;-)

Dit is nu de error:
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:
<?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.
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.
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?

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.

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.
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.

<?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.


<?php
 $sql = "select * from $bestand WHERE IDR BETWEEN '$beginrec' AND '$eindrec'";
?>
Dit is ondertussen de stand van zaken:
foutmelding
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:
<?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 - 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.




Reageren