boucle sur des large object depuis postgreSQL

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : boucle sur des large object depuis postgreSQL

par seiya » 06 mars 2009, 17:47

Merci pour la réponse,
toutes les images sont valides, j'ai précisé qu'en la chargeant à part depuis le lien généré par la page elle s'affichait.
J'imagine qu'il s'agit plus d'un problème de fournisseur que de code,
c'est pour ça que j'ai essayé de bypasser cette possibilité en mettant une fonction sleep, afin d'éviter de faire trop de requêtes simultanées. Mais le résultat est le même.
Je ne peux pas réduire le nombre d'image, au contraire j'en affiche 5, mais il m'en faut des dizaines par requête :)
Si quelqu'un a une idée ingénieuse pour faire croire au serveur qu'il ne se passe rien alors qu'on télécharge gras d'images à la sauce black box pour les téléphones ça me plairait bien 8-)
et si c'est la seule solution, qui connait un hébergeur gratuit et qui fait tout ce qu'on veut :fete:
je suis preneur

par Calimero » 06 mars 2009, 15:13

Lorsque j'affiche la page qui contient la boucle, les images ne s'affichent pas toutes.
Quand cela arrive, je te propose de récupérer dans la source HTML de ta page l'url d'une des images qui ne se sont pas chargées. Puis teste-la dans ton browser directement pour voir si elle est valide ou non.

Si elle ne l'est pas : c'est ta boucle génère des liens incorrects
Si elle l'est : le serveur a du mal à servir trop de requêtes simultanées et ce serait à son niveau qu'il faut agir (probable si tu es hébergé chez free, dans mes souvenirs certains de leurs serveurs web sont très chargés). Peut-être que ta seule solution sera de changer d'hébergeur, ou de réduire le nombre d'images affichables simultanément.

par seiya » 06 mars 2009, 12:54

Étant donné le manque de réponse je m'interroge,
mon problème est-il trop simple ? trop compliqué ? trop mal expliqué ?
Je suis ouvert à toute les questions pour pourront aider les experts en PHP de ce forum à résoudre ce problème qui me parait intéressant, car charger des images depuis une base de donnée me parait être une opération assez utile
Merci

boucle sur des large object depuis postgreSQL

par seiya » 01 mars 2009, 22:22

Bonsoir,
j'ai programmé une interface pour un catalogue d'objets.
Un objet est définit par des propriétés et une image.
Les objets sont stockées dans une base de données relationnelle PostgreSQL
Il est possible d'ajouter un objet depuis l'interface Web.

Voici le code simplifié qui permet de récupérer l'image après l'avoir posté dans un formulaire à l'aide de l'élément "input" de type "file":

Code : Tout sélectionner

<input id="photo" type="file" name="photo"/>
// récupération du chemin de l'image sur le serveur
$photo_tmpName  = $_FILES['photo']['tmp_name'];
$photo_size = $_FILES['photo']['size'];

// serialisation de l'image dans une string
$fp = fopen($photo_tmpName, "r");
$buffer = fread($fp, $photo_size);
fclose($fp);

// creation d'un objet de grande taille et récupération de son oid
pg_query($conn, "begin");
	$oid = pg_lo_create($conn);
	$handle = pg_lo_open($conn, $oid, "w");
	pg_lo_write($handle, $buffer);
	pg_lo_close($handle);
pg_query($conn, "commit");

// insert dans la base
$query = "INSERT INTO img (data) VALUES ('$oid')";
pg_query($query) or die("Cannot insert data. ".pg_last_error());
Pour afficher une image, il suffit d'avoir l'OID de celle-ci et de le transmettre à la page image.php telle que :
header("Content-type: image/jpeg");
include ('connectdb.php'); // don't forget to close connection : pg_close($conn);
pg_query($conn, "begin");
	$handle = pg_lo_open($conn, $_GET["oid"], "r");
	pg_lo_read_all($handle);
pg_query($conn, "commit");
pg_close($conn);
Il est possible d'afficher une liste d'objets résultant d'une une requête sur la base de données.
Je récupère donc un tableau de résultats que je parcours à l'aide d'une boucle dont voici le code :
include ('connectdb.php'); // don't forget to close connection : pg_close($conn);
$query = ("SELECT data FROM img");
$result = pg_query($query) or die(pg_last_error());
pg_close($conn);
while ( $row = pg_fetch_array($result) ) {
	$oid = $row["data"];
	echo "<img src=\"image.php?oid=".$oid."\" alt=\"\" />\n";
}
Mon problème :
  • Lorsque j'accède directement à la page image.php avec l'oid de l'image que je veux voir, celà fonctionne.
    Lorsque j'affiche la page qui contient la boucle, les images ne s'affichent pas toutes.
Les pages sont hébergées chez Free, j'ai essayé de rajouter un sleep(1) dans la boucle histoire de voir s'il s'agissait d'un problème de surcharge du serveur SQL ou Web mais cela donne le même résultat.

Curiosité :
Si j'affiche la page qui ne charge pas toutes les images et que dans une autre fenêtre j'accède directement à une image (qui ne s'affiche pas) via image.php, elle apparait. Puis lorsque j'actualise la fenêtre ou elle n'est pas apparue, elle s'affiche et disparait immédiatement.

J'ai cherché sur Internet et sur ce forum sans succès, donc je m'en remet à vos avis, connaissances et expériences en la matière en vous remerciant d'avance du temps passé à la résolution de mon problème

Cordialement