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?
Ignace Verschaeve op 02/11/2021 18:05:44

Ik dacht altijd dat fora er waren om mensen te helpen, hoe dom ze ook zijn.

Ik heb niet gezegd dat je dom bent hoor. Dat zijn jouw eigen woorden haha ;-)

Alle gekheid op een stokje, ik heb nergens gezegd of gesuggereerd dat je dom zou zijn. Ik probeer je alleen wat handvatten te geven om meer resultaat te krijgen door middel van een heldere vraagstelling.

Het gaat erom dat je niet zomaar een code plaatst met de mededeling "er gaat iets mis". Als je een probleem hebt met je auto ga je ook niet naar de garage met de mededeling "er gaat iets mis", maar geef je op z'n minst aan WAT er misgaat. In jouw geval, wat lukt er niet? Waar loop je op vast?

Als iets niet werkt, kun je zelf eens proberen te debuggen. Dan kijk je of de code die je uitvoert het verwachte resultaat oplevert. Op die manier kun je vaststellen op welk punt er iets misgaat.

Ignace Verschaeve op 02/11/2021 18:05:44

Maar niemand heeft er mij op gewezen dat ik mogelijks geen connectie hebt met mijn database.

We hebben dan ook geen glazen bol. Maar als ik je goed begrijp werkte de databaseconnectie niet? Is het probleem nu dan opgelost?
het lijkt me sterk dat het (alleen) aan de databaseconnectie ligt.

TS is sterk in het selectief oppikken van opmerkingen, maar nooit het geheel.
Ik gaf een aantal redenen waarom een aanroep van ->query() kan mislukken.

* missende database connectie
* syntaxfout in de query
* aanroep van niet bestaande tabellen in de database

dit zijn enkele mogelijkheden.
Maar een geheel mislukte verbinding zou eigenlijk al een foutmelding moeten geven over de aanroep van ->query() on a boolean, aangezien $conn dan ook geen object was.

Wel kan intussen de verbinding verloren gegaan zijn, of er is verbinding maar niet tot de tabel in de query (ja, het hebben van een verbinding betekent niet dat je toegang hebt tot alle tabellen / rechten hebt om een bepaalde actie uit te voeren op die tabel).

Ik zou, zoals ik al eerder aangaf de quotes in de query aanpassen.
Net zoals dat met de insertquery fout ging op 22 oktober:
https://www.phphulp.nl/php/forum/topic/foutmelding-bij-insert/104143/
Ondertussen heb ik wat zitten prutsen om stap voor stap te kijken waar het misgaat.
Dit is mijn huidige foutmelding:
rouwbriefnieuw03000There are 508 rows in my table. Fatal error: Uncaught TypeError: fputcsv(): Argument #2 ($fields) must be of type array, int given in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php:38 Stack trace: #0 /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php(38): fputcsv(Resource id #5, 508) #1 {main} thrown in /customers/1/5/0/fv-vl-ardennen.be/httpd.www/beheerder/export_naar_csv.php on line 38


Dus ik zie dat er wel geconnecteerd wordt naar de database naar de gevraagde IDR en dat er 508 rijen zijn. Tot daar klopt het.
Wat ik nu begrijp is dat het 2e argument in fputcsv($fp,$rows)dus $rows een array moet zijn.
Dus nu ga ik op zoek naar hoe ik die code schrijf om de rijen in een array te steken.
Ondertussen ben ik al een stap verder. Het lukt met onderstaande code, alleen nu nog de juiste manier vinden om de rijen een na een in de .csv te steken. Want nu komt er alleen het eerste record erin.
<?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');
?>
<!DOCTYPE html>
<html lang="nl">
<head>
<title>Geen</title>
</head>
<body>

<?php
 // 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);
	$rows = mysqli_num_rows($result);
	$row = $result -> fetch_array(MYSQLI_NUM);
	echo "There are " . $rows . " rows in my table.";
    $fp = fopen('books.csv', 'w');
	fputcsv($fp,$row);
    fclose($fp);

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


We zijn op de goede weg.
>> Wat ik nu begrijp is dat het 2e argument in fputcsv($fp,$rows)dus $rows een array moet zijn.

Kijk, en zo kom je door het lezen van de foutmelding dus inderdaad een stukje verder.

Als je nog iets verder in de foutmelding kijkt, dan zie je ook dit: fputcsv(Resource id #5, 508)

Let op het getal(!) 508. Je hebt in dit geval niet de rijen met data doorgegeven, maar in plaats daarvan het aantal (een getal) rijen. En dus krijg je een foutmelding dat je een getal hebt doorgegeven in plaats van een (verwachte) array.

>> We zijn op de goede weg.

Inderdaad. Als je leert om foutmeldingen te lezen en interpreteren, kom je vaak een stapje verder.
Let op het getal(!) 508. Je hebt in dit geval niet de rijen met data doorgegeven, maar in plaats daarvan het aantal (een getal) rijen. En dus krijg je een foutmelding dat je een getal hebt doorgegeven in plaats van een (verwachte) array.

Dat getal is niet belangrijk. Dat was mijn manier om te controleren of er wel degelijk rijen aanwezig zijn. = variabele $rows.
De andere variabele is $row zonder s achteraan. Maar blijkbaar had er ook niemand de foutmelding die er in allereerste instantie al was begrepen. Het correct in een array zetten. Nu probeer ik met een while lus alle records in het bestand te krijgen.
daarom is het dus nuttig om de namen van de variabelen met enige zorg te kiezen.

$rows bevat nu het aantal rijen, als een getal (508)

$row bevat nu een array dat met fetch() is getrokken uit de resultset.


Kies je $aantal_records, of desnoods $number_of_rows voor $rows, dan is duidelijk wat je kunt verwachten.

Daarna zou $row inderdaad het opgehaalde record /de regel met data kunnen bevatten.

while() is inderdaad een nuttige constructie om alle records te verzamelen.

---
" Maar blijkbaar had er ook niemand de foutmelding die er in allereerste instantie al was begrepen"

Even terug gekeken: jouw foutmelding had betrekking op het niet ondersteunen van de oude mysql-functies door jouw PHP versie.

En dat was direct in de eerste reactie al aangegeven. Wat probeer je nu eigenlijk te zeggen?

Je hobbelt van foutmelding naar foutmelding.
Mede veroorzaakt door het niet verder bouwen op code die je al hebt (je topic over INSERT query's maakt bijvoorbeeld al gebruik van mysqli, maar nu stap je terug op mysql.)

en ook door lukraak functies te gebruiken zonder uit te zoeken wat erin gaat of eruit kan komen.
>> Dat getal is niet belangrijk.

Pfff, dat is het dus wel. De functie verwacht namelijk een array en jij geeft een getal door. Snap je dat het dan fout gaat?

>> Maar blijkbaar had er ook niemand de foutmelding die er in allereerste instantie al was begrepen. Het correct in een array zetten.

Wat??? Je gaat nu anderen de 'schuld' geven dat ze iets niet hebben begrepen, terwijl jij zelf continu fouten maakt?

Je zou je misschien eens wat anders, vriendelijker/dankbaarder, kunnen opstellen en de hulp die je krijgt proberen te waarderen. Daar lijkt het nu namelijk geenszins op. Ik wens je in ieder geval veel succes met het oplossen van je problemen.
Misschien begrijpt Ignace Verschaeve gewoon nog niet hoe de vork in de steel zit.

Eerder werd PHPHulp.nl vergeleken met een soort commerciële klantensupport. Het zou toch kunnen dat hij totaal niet snapt dat PHP open source is, of wat open source überhaupt is, en dat hij een verkeerde aanname heeft gedaan dat dit forum gelieerd is aan PHP. Hij weet kennelijk niet dat er hier alleen mensen berichten plaatsen die enthousiast zijn over PHP en geheel vanuit vrij wil zonder enige vergoeding moeite doen om anderen belangeloos te helpen.
Hij heeft nog geen weet van de mores dat je ook zelf moeite moet doen om iets voor elkaar te krijgen, en dat je al helemaal geen tijd mag claimen van anderen.

En hoe zou hij het ook moeten (niet 'kunnen') weten? Onwetend zondigt men niet. Maar nu bovenstaande kennis hem heeft bereikt, heeft hij ook de verantwoordelijkheid er iets mee te doen.
Ondanks alles en na telkens aanpassingen met bruikbare tips over qoutes, mysqli enz. en de uiteindelijke foutmelding over de array is het opgelost. Of toch bijna. Er wordt een .csv file aangeboden om te downloaden maar die blijkt uiteindelijk leeg. Wel wordt het gevraagde weggeschreven op de server. onder de naam books.csv,
Dit is de gebruikte 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="rijen.csv"');
	ob_start();
// 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']); 
	$beginrec = mysqli_real_escape_string($conn,$_POST['beginrec']); 
	$eindrec = mysqli_real_escape_string($conn,$_POST['eindrec']); 
    // fetch mysql table rows
    $sql = "select * from $bestand WHERE IDR BETWEEN '$beginrec' AND '$eindrec'";
    $result = $conn->query($sql);
	$rows = mysqli_num_rows($result);
	//echo "There are " . $rows . " rows in my table.";
	$fp = fopen('books.csv', 'w');
	$i=0;
	while($row = $result -> fetch_array(MYSQLI_NUM)){
	fputcsv($fp,$row);
	$i++;
	}
    fclose($fp);

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

Misschien moet ik via een omweg werken en die outputheaders weglaten en met een downloadebel link werken.
waar precies denk jij dat je iets naar de browser stuurt?

Afgezien van je headers op regel 3 en 4.


---
En bedenk ook, dat als je eerst je headers stuurt en je op regel 14 een foutmelding stuurt, die als csv opgevat wordt.

Reageren