Linken naar een pdf-bestand

Overzicht

Sponsored by: Vacatures door Monsterboard

Luc Sleeckx

Luc Sleeckx

10/11/2021 21:19:45
Anchor link
In een mysql databank houdt onze genealogische vereniging de data van een grote hoeveelheid (>2300) overlijdensberichten bij.
De overlijdensberichten zelf zijn in pdf formaat, en worden stelselmatig met identieke naamgeving opgeslagen: "Familienaam_Voornaam_geboortedatum_overlijdensdatum.pdf". Beide datumvelden in het formaat YYYYMMDD en alle data zonder spaties.

Met php heb ik een pagina gemaakt waarin ik alle gegevens uit de databank haal, en ze allemaal, record voor record in een tabel laad. Dat lukt perfect.

Maar nu probeer ik er ook voor te zorgen dat de vermelde naam in de kolom Familienaam voorzien is van een link naar het juiste overlijdensbericht. Zodoende dat gebruikers de pdf kunnen laden door op de naam te klikken.

Aan de hand van een variabele voor de locatie van het bestand en van de gegevens uit de databank kan ik de url voor het te laden pdf bestand eenvoudig samenstellen. Wanneer ik de variabele $bestandsnaam opvraag, dan krijg ik exact de juiste URL.

Het is echter met het toevoegen van de link zelf ("<a href=\"" en "</a>") dat het fout loopt. Hier doe ik blijkbaar iets verkeerd. Wanneer ik de code uitvoer zoals in de code hieronder, dan krijg ik weliswaar een lijst met gegevens, waarbij de familienaam inderdaad voorzien is van een link (onderlijnd en blauw), maar de link is compleet verkeerd. Bovendien wordt op die manier enkel de pare records weergegeven, niet de onpare.

Er is dus duidelijk iets niet correct met die samenstelling van de variabele $link. Iemand die me kan helpen?

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
<!DOCTYPE html>
<html>
<head>
  <title>Toon alle records uit de databank</title>
</head>
<body>

<h2>Overlijdensberichten</h2>

<table border="1">
  <tr>
    <th>Familienaam</th>
    <th>Voornaam</th>
    <th>Geboortedatum</th>
    <th>Overlijdensdatum</th>
  </tr>

<?php

include "dbConn.php"; // Gebruik het bestandje voor databank connectie

$str_pdflocatie="C:\Users\Luc\Downloads\Overlijdensberichten 20211104";
$str_link_begin="<a href=\"";
$str_link_midden=">";
$str_link_einde="</a>";

$records = mysqli_query($db,"select * from overlijdensberichten"); // haal de data uit de databank

while($data = mysqli_fetch_array($records))
{


    $familienaam = $data['ob_familienaam'];
    $voornaam = $data['ob_voornaam'];
    $geboortedatum = $data['ob_geboortedatum'];
    $geboortedatum = substr($geboortedatum,0,4).substr($geboortedatum,5,2).substr($geboortedatum,8,2);
    $overlijdensdatum = $data['ob_overlijdensdatum'];
    $overlijdensdatum = substr($overlijdensdatum,0,4).substr($overlijdensdatum,5,2).substr($overlijdensdatum,8,2);
    $bestandsnaam = $familienaam . "_". $voornaam . "_". $geboortedatum . "_". $overlijdensdatum;
    $bestandsnaam=$str_pdflocatie ."\\".$bestandsnaam.".pdf";
    $link=$str_link_begin.$bestandsnaam.$str_link_midden.$familienaam.$str_link_einde;

?>

  
  <tr>
    <td><?php echo $familienaam; ?></td>
    <td><?php echo $voornaam; ?></td>
    <td><?php echo $data['ob_geboortedatum']; ?></td>
    <td><?php echo $data['ob_overlijdensdatum'] ?></td>
  </tr>    
<?php
}
?>

</table>

<?php mysqli_close($db); // Sluit de connectie met de databank ?>

</body>
</html>
 
PHP hulp

PHP hulp

26/09/2022 01:03:01
 
- Ariën  -
Beheerder

- Ariën -

10/11/2021 21:37:05
Anchor link
Vanwaar het opdelen van je 'a href' in losse variabelen? Je kan gewoon ook de anchor-tag zelf gebruiken, en de href waarde en de inhoud invullen.
 
Rob Doemaarwat

Rob Doemaarwat

10/11/2021 22:34:31
Anchor link
Als je naar een lokale file (op je eigen schijf) wilt linken moet je de URL beginnen met "file:///". het handigst is dus om:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$str_link_begin="<a href=\"file:///";


Let op: Het openen van lokale files is in Chrome tegenwoordig standaard uitgeschakeld (niet toegestaan). Dat kun je blijkbaar weer inschakelen bij opstarten (vanaf de command line), of via een plugin.

Als je resulterende $bestandsnaam double quotes (") bevat gaat het mis. Gebruik daarom:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$link=$str_link_begin.htmlspecialchars($bestandsnaam).$str_link_midden.$familienaam.$str_link_einde;


Overigens gebruik je $link nu nergens ... (?). Geen idee overigens waarom je alleen de "pare" ("even" voor NL) records te zien krijgt. Ik zou vermoeden dat je dan ergens een keer extra mysqli_fetch_array() aanroept (maar er niks mee doet), maar dat zie ik niet in bovenstaande code staan.
 
Ad Fundum

Ad Fundum

11/11/2021 11:56:17
Anchor link
Ik heb dat in het begin van mijn site ook gedaan, losse bestanden naast een database. Het probleem is dat de database (MySQL in dit geval) dan niet kan bijhouden of alles nog klopt, omdat gegevens buiten de database om opgeslagen wordt, terwijl je daar juist een database voor hebt.

> 2300 PDF-bestanden is voor MySQL geen probleem, ook niet als ze per stuk een paar megabytes groot zijn. Het is dan handig om 1 tabel te hebben met de metadata, en indices waar nodig:

Voorbeeldtabellen:
- bericht(id int, familie text, voornaam text, geboren date, overleden date)
incides op familie, voornaam, geboortedatum en overlijdensdatum kunnen handig zijn
- berichtpdf(bericht_fk int, pdf mediumblob)

Dan zorg je dat je die tabellen maakt met de engine InnoDB, en dan leg je een Foreign Key relatie aan tussen `berichtpdf`.`bericht_fk` en `bericht`.`id` . Je kunt dan een apart downloadscript maken in PHP waar je naar linkt alsof je naar het originele bestand linkt.
 
- Ariën  -
Beheerder

- Ariën -

11/11/2021 12:28:21
Anchor link
Quote:
In een mysql databank houdt onze genealogische vereniging de data van een grote hoeveelheid (>2300) overlijdensberichten bij.


En dan verwijs je naar:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$str_pdflocatie="C:\Users\Luc\Downloads\Overlijdensberichten 20211104";

Ik snap niet waarom je naar:
- Een persoonlijke map verwijst.
- Een downloadsfolder verwijst (die is eigenlijk bedoeld voor tijdelijke opslag, Windows kán die inhoud na bevestiging verwijderen)

Je draait PHP, je hebt een website, dus waarom parkeer die die overlijdensberichten niet op je webserver?
 
Luc Sleeckx

Luc Sleeckx

11/11/2021 21:05:28
Anchor link
Hartelijk dank aan allen voor de tips.
Twee bemerkingen:
-Ik probeer momenteel om het script draaiend te krijgen, en doe dit voorlopig inderdaad op mijn PC thuis. XAMP geïnstalleerd, en daarom verwijs ik natuurlijk ook naar een locatie op mijn harde schijf. Als ik dit goed kan krijgen, is het uiteraard de bedoeling om scripts en bestanden online te plaatsen.
Ik veronderstel dat er op de webserver zelf niet met "file:///" naar de pdf bestanden moet verwezen worden. Of wel?

-In het script hierboven wordt $link inderdaad niet gebruikt. Toen het fout liep heb ik
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $link; ?>
vervangen door
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $familienaam; ?>
Op die manier krijg ik mijn html tabel met ALLA records zonder probleem.
Als ik
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $link; ?>
gebruik, krijg ik ook de HTML tabel, maar enkel de pare records worden getoond.Dus enkel en alleen door de andere variabele te gebruiken. Voor de rest geen veranderingen in het script.
In het laatste geval krijgen alle familienamen in de eerste kolom een link (onderstreept en blauw) maar deze is totaal foutief.

Hieronder plak ik de koppeling die onderaan in de statusbalk van de browser verschijnt wanneer ik over de link van één der familienamen hover. In dit geval wordt de familienaam van het tweede record in de reeks getoond in de tabel (ADAM). In de koppeling zal je zien dat de familienaam uit het eerste record (ACKE)wordt vermeld. (Begrijpe wie kan)

c:\Users\Luc\Downloads\Overlijdensberichten 20211104\Acke_Jacqueline_19340313_20200813.pdf>Acke</a></td> <td>Jacqueline</td> <td>1934-03-13</td><td>2020-08-13</td> </tr> <tr><td><a href=

Er moet dus duidelijk iets fout lopen met de samenstelling van die variabele link$

Misschien gaat er nu bij iemand een lichtje branden? In elk geval reeds hartelijk dank voor jullie tips.
 
Rob Doemaarwat

Rob Doemaarwat

11/11/2021 21:16:38
Anchor link
Aha! Het "foute link" probleem los je op door:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$str_link_midden="\">";

Er stond geen sluitende dubbel-qoute na je href. Dit had je ook kunnen ontdekken door de "bron" van je resulterende HTML te controleren (Ctrl+U in de meeste browsers).

En ik vermoed dat dit dan ook meteen alle records worden getoond. Nu "verdwijnen" de onpare records in de "link" van de pare records. Daarna was je twee keer een dubbel quote vergeten, en "klopte" het weer (= volgende record werd weer wel correct getoond).
 
Luc Sleeckx

Luc Sleeckx

11/11/2021 21:19:26
Anchor link
Nog even ter verduidelijking 2 screenshots van de eerste records die het script oplevert, het eerste met gebruik van de variabele $familienaam het tweede met gebruik van $link. In het tweede met de links bij de Familienaam, maar enkel de pare records worden getoond.

Ik probeerde om de 2 screenshots (opgeslagen als jpg-bestandjes) hier in te voegen, maar dit lukt me niet. Hoe krijg ik dit voor elkaar?

Edit:
Onnodige niet-werkende afbeeldingen verwijderd
Gewijzigd op 14/11/2021 15:02:24 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

11/11/2021 22:13:26
Anchor link
De URL moet je tussen de img-tags plaatsen.
 
Luc Sleeckx

Luc Sleeckx

12/11/2021 09:31:16
Anchor link
Hartelijk dank Rob, probleem opgelost ! Nu worden inderdaad alle records getoond, en wordt de link naar het pdf bestand correct gemaakt.
 
Frank Turpen

Frank Turpen

22/11/2021 13:24:20
Anchor link
Thanks rob, This works really well for me, thank you! Facing same issue here. Help is appreciated.

Edit:
Do you believe this, Frank? We know that you are a forum-spammer. So, stop this annoying sh*t and get a life.
Gewijzigd op 22/11/2021 14:21:25 door - Ariën -
 
 

Dit topic is gesloten.



Overzicht

 
 

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.