Bonjour,
Je suis débutant en PHP et j'ai une table d'articles avec une colonne contenant une image (type OID).
J'aimerais afficher qlq données de l'article et l'image mais après plusieures tentatives en suivant la doc PHP PDO (presque inexistante) et après des heures de recherches et de tests... je n'y arrive pas. Au mieux j'ai une image vide. Pourtant je recepère bien l'OID. C'est la lecture du LargeObject qui pose problème.
Par ailleurs, je travaille sur une application Java qui se connecte à la même bdd. Les données correctes et les images parfaitement lisibles.
Voici mon index.php
et affiche_image, 1ère version
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 <?php $PARAM_hote ='localhost'; // le chemin vers le serveur $PARAM_port ='5432'; // le port de connexion $PARAM_nom_bd ='test_db'; // le nom de votre base de données $PARAM_utilisateur ='root'; // nom d'utilisateur pour se connecter $PARAM_mot_passe =''; // mot de passe de l'utilisateur pour se connecter ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Test</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php include("entete.php"); ?> <?php include("menus.php"); ?> <!-- Le corps --> <div id="corps"> <h1>Liste des articles qui ont une photo</h1> <pre> <?php try { $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $connexion = new PDO('pgsql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe); echo 'Utilisateur ' . $PARAM_utilisateur . ' connecté'; // On récupère les articles qui ont une photo $resultats = $connexion->prepare( 'SELECT articles.art_id, nom_article, quant_stock, prix_vente, photo_data_mini FROM articles LEFT OUTER JOIN noms_article ON articles.art_id = noms_article.art_id WHERE articles.photo_taille > 0'); $resultats->execute(array()); $resultats->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet echo '<ul>'; while ($donnees = $resultats->fetch()) { echo '<li>' . $donnees->art_id . ' - ' . $donnees->nom_article . ' ' . $donnees->photo_data_mini . '<img src=affiche_image.php?art_id=' . $donnees->art_id . '> ' . '</li>'; } echo '</ul>'; $resultats->closeCursor(); // Termine le traitement de la requête } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } ?> </pre> </div> <?php include("pied_de_page.php"); ?> </body> </html>
et affiche_image, 2ème version
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 <?php // configuration $PARAM_hote ='localhost'; // le chemin vers le serveur $PARAM_port ='5432'; // le port de connexion $PARAM_nom_bd ='test_db'; // le nom de votre base de données $PARAM_utilisateur ='root'; // nom d'utilisateur pour se connecter $PARAM_mot_passe =''; // mot de passe de l'utilisateur pour se connecter // database connection $conn = new PDO('pgsql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe); // query $sql = "SELECT photo_data_mini FROM articles WHERE art_id=".$_GET['id']; $q = $conn->prepare($sql); $q->execute(); $q->bindColumn(1, $lob, PDO::PARAM_LOB); $q->fetch(PDO::FETCH_BOUND); header("Content-Type: image/jpeg"); echo $lob; ?>
Il y a des milliers d'artiles organisé en familles (et plus dans un avenir proche) dans la bdd et dans le but d'améliorer les performances, j'aimerais me passer de affiche_image.php et tout faire dans la boucle principale de index.php. Possible ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 <?php // configuration $PARAM_hote ='localhost'; // le chemin vers le serveur $PARAM_port ='5432'; // le port de connexion $PARAM_nom_bd ='test_db'; // le nom de votre base de données $PARAM_utilisateur ='root'; // nom d'utilisateur pour se connecter $PARAM_mot_passe =''; // mot de passe de l'utilisateur pour se connecter // connection à la base $db = new PDO('pgsql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // requete $stmt = $db->prepare("SELECT photo_data_mini FROM articles WHERE art_id = ?"); $stmt->execute(array($_GET['art_id'])); $stmt->bindColumn('photo_data_mini', $lob, PDO::PARAM_LOB); $stmt->fetch(PDO::FETCH_BOUND); //echo $lob; $stream = $db->pgsqlLOBOpen($lob, 'r'); $data = stream_get_contents($stream); header("Content-type: image/jpeg"); echo $data; // ou //fpassthru($stream); // ou //echo stream_get_contents($stream); ?>
Merci d'avance.
Partager