boucle sous simple_html_dom

Eléphant du PHP | 115 Messages

30 mars 2016, 12:21

Bonjour,

Je cherche de l'aide, je récupérer des données sur un site et je les stock dans une BDD Mysql.

L'affichage des données fonctionne très bien, mais quant je veux écrire dans ma BDD il m’écris d'une seul donnée la dernière de ma liste.

Et quant il fait la boucle il garder la dernière donnée, si la suivante et null, il ne modifie pas celle là et stock ce qui la récupérer avant, ne là remplace pas par un null ou autre.

Code : Tout sélectionner

<?php include_once("simple_html_dom.php"); $url = 'www.sitetest.com'; //foreach($html->find('div[class="paginate"]') as $e) //$rest = substr("$e->outertext", 51, 2); $nombrepages = 1; $nombre_de_lignes = 1; for($i=0; $i<=$nombrepages; $i++) while ($nombre_de_lignes <= $nombrepages) { $html = file_get_html("http://$url/fr/$nombre_de_lignes/"); foreach($html->find('p[itemprop="description"]') as $e) $description_extraction_jrs = trim($e->plaintext); foreach($html->find('img[class="lazyOwl"]') as $e) $titre_extraction_jrs = trim($e->alt); foreach($html->find('[class="price"]') as $e) $prix_extraction_jrs = trim($e->plaintext); foreach($html->find('div[class="banner"]') as $e) $typeproduit_extraction_jrs = trim($e->plaintext); foreach($html->find('div[class="paginate"]') as $e) $e->outertext = ''; foreach($html->find('span[class="data-original-title"]') as $e) $e->innerText = ''; foreach($html->find('img[innertext=""]') as $e) $e->outertext = ''; foreach($html->find('div[class="main listings featured-items row"]') as $e) $e->innerText = ''; foreach($html->find('head innertext=""') as $e) $e->innerText = ''; foreach($html->find('a[class="figure-hover"]') as $e) $e->outertext = ''; foreach($html->find('img[src="/static/images/area.png"]') as $e) $e->outertext = ''; foreach($html->find('img[src="/static/images/bed.png"]') as $e) $e->outertext = ''; foreach($html->find('img[src="/static/images/parking.png"]') as $e) $e->outertext = ''; foreach($html->find('div[class="owl-carousel owl-theme"]') as $e) $e->outertext = ''; foreach($html->find('div[id="homeslider"]') as $e) $e->outertext = ''; foreach($html->find('footer') as $e) $e->outertext = ''; foreach($html->find('header') as $e) $e->outertext = ''; foreach($html->find('form') as $e) $e->outertext = ''; foreach($html->find('h1') as $e) $e->outertext = ''; foreach($html->find('h2') as $e) $e->outertext = ''; foreach($html->find('nav[id="nav-top-main"]') as $e) $e->outertext = ''; foreach($html->find('div[class="content white padding"]') as $e) $e->outertext = ''; foreach($html->find('div[class="content full white text-center"]') as $e) $e->outertext = ''; foreach($html->find('div[class="content full grey text-center"]') as $e) $e->outertext = ''; foreach($html->find('iframe') as $e) $e->outertext = ''; foreach($html->find('div[class="container"]') as $e) $e->outertext = ''; foreach($html->find('div[id="nav-top-main"]') as $e) $e->outertext = ''; foreach($html->find('div[class="content bottom grey padding"]') as $e) $e->outertext = ''; $sql = "INSERT INTO extraction_jrs (`id_extraction_jrs`, `description_extraction_jrs`, `prix_extraction_jrs`, `date_extraction_jrs`, `heure_extraction_jrs`, `typeproduit_extraction_jrs`, `titre_annonce_extraction_jrs`, `extraction_jrs`) VALUES (NULL, '$description_extraction_jrs', '$prix_extraction_jr', NOW(), NOW(), '$titre_extraction_jrs', '$extraction_jr')"; $bdd->exec($sql); echo utf8_decode($html); $nombre_de_lignes++; } ?>
Merci de votre aide,

Mammouth du PHP | 1967 Messages

30 mars 2016, 13:00

tu as 2 boucle, une for et une while mais une seule paire de crochet. vérifie cela

Je connais pas ta structure de BDD mais à mon avis le id_extraction_jrs devrait s'autoincrémenter et non pas valoir null à chaque ajout.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 115 Messages

30 mars 2016, 16:01

Merci pour ton aide,

j'ai fait quelques modifications dans mon code.

Code : Tout sélectionner

<?php include_once("simple_html_dom.php"); $url = 'www.sitetest.com'; //foreach($html->find('div[class="paginate"]') as $e) //$rest = substr("$e->outertext", 51, 2); // retourne "ef" $nombrepages = 1; $nombre_de_lignes = 0; for($i=0; $i<=$nombrepages; $i++) { $html = file_get_html("http://$url/fr/$nombre_de_lignes/"); foreach($html->find('p[itemprop="description"]') as $e){ if(!empty($e->plaintext)){ $description_extraction_jrs[$i] = $e->plaintext; echo $description_extraction_jrs[$i]; echo '<br />'; } } foreach($html->find('img[class="lazyOwl"]') as $e) { if(!empty($e->alt)){ $titre_annonce_extraction_jrs[$i] = $e->alt; echo $titre_extraction_jrs[$i]; echo '<br />'; } } foreach($html->find('[class="price"]') as $e) { if(!empty($e->plaintext)){ $prix_extraction_jrs[$i] = $e->plaintext; echo $prix_extraction_jrs[$i]; echo '<br />'; } } foreach($html->find('div[class="banner"]') as $e)// if(!empty($e->plaintext)){ $typeproduit_extraction_jrs[$i] = $e->plaintext; echo $typeproduit_extraction_jrs[$i]; echo '<br />'; } } $nombre_de_lignes++; $sql = "INSERT INTO extraction_jrs (`id_extraction_jrs`, `description_extraction_jrs`, `prix_extraction_jrs`, `date_extraction_jrs`, `heure_extraction_jrs`, `typeproduit_extraction_jrs`, `titre_annonce_extraction_jrs`, `extraction_jrs`) VALUES (NULL, '$description_extraction_jrs', '$prix_extraction_jr', NOW(), NOW(), '$titre_extraction_jrs', '$extraction_jr')"; $bdd->exec($sql); ?>
Tous s'affiche bien, ça écris bien en BDD les 12 ligne mais que des Array
Merci de ton aide,

Mammouth du PHP | 1967 Messages

30 mars 2016, 16:35

Tu stockes tes données dans des tableaux, tu dois donc en extraire les données pour ta requète
$sql = "INSERT INTO extraction_jrs (`id_extraction_jrs`, `description_extraction_jrs`, `prix_extraction_jrs`, `date_extraction_jrs`, `heure_extraction_jrs`, `typeproduit_extraction_jrs`, `titre_annonce_extraction_jrs`, `extraction_jrs`) VALUES (NULL, '$description_extraction_jrs[$i]', '$prix_extraction_jr[$i]', NOW(), NOW(), '$titre_extraction_jrs[$i]', '$extraction_jr')";
De plus tu extrait un type produit que tu utilise pas et tu met en base un $extraction_jr que tu n'a pas extrait. il manque des données dans ta requètes
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 115 Messages

30 mars 2016, 18:04

Merci de ton aide,
Voila les modifications que j'ai apporter, mais j'ai toujours que le dernière ligne que est pris en compte et écris dans ma basse de donnée.
Je ne voie pas d’où vient mon erreur,

<?php

include_once("simple_html_dom.php");
$url = 'www.sitetest.com';

//foreach($html->find('div[class="paginate"]') as $e)
//$rest = substr("$e->outertext", 51, 2); // retourne "ef"

$nombrepages = 1;
$nombre_de_lignes = 1;

for($i=0; $i<=$nombrepages; $i++) {

$html = file_get_html("http://$url/fr/$nombre_de_lignes/");

foreach($html->find('p[itemprop="description"]') as $e)
if(!empty($e->plaintext)){
$description_extraction_jrs[$i] = $e->plaintext;
}

foreach($html->find('img[class="lazyOwl"]') as $e)
if(!empty($e->alt)){
$titre_extraction_jrs[$i] = $e->alt;
}

foreach($html->find('[class="price"]') as $e)
if(!empty($e->plaintext)){
$prix_extraction_jrs[$i] = $e->plaintext;
}

foreach($html->find('div[class="banner"]') as $e)//
if(!empty($e->plaintext)){
$typeproduit_extraction_jrs[$i] = $e->plaintext;
}

$nombre_de_lignes++;

$prix_extraction_j = str_replace(' ','',$prix_extraction_jrs[$i]);
$prix_extraction_jr = substr($prix_extraction_j,0,-12);

$sql = "INSERT INTO extraction_jrs (`id_extraction_jrs`, `description_extraction_jrs`, `prix_extraction_jrs`, `date_extraction_jrs`, `heure_extraction_jrs`, `typeproduit_extraction_jrs`, `titre_extraction_jrs`) VALUES (NULL, '$description_extraction_jrs[$i]', '$prix_extraction_jr', NOW(), NOW(), '$typeproduit_extraction_jrs[$i]', '$titre_extraction_jrs[$i]')";

$bdd->exec($sql);

}
?>

Merci de ton aide,

Mammouth du PHP | 1967 Messages

30 mars 2016, 18:25

vérifie tous tes crochets, il apparaissent / disparaissent entre tes posts et ca peut bien venir de là.

il faut que ta requète soit dans ta boucle et non pas en dehors.
Affiche tes requètes pour les débugger.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 115 Messages

01 avr. 2016, 09:33

Bonjour a tous le monde,

J’ai fait encore des modifications comme on me la conseiller, et cela me donne maintenant des chose bizarre,
ça la boucle bien, mais j’ai x fois ma table qui ce remplie de ce que je récupérer les info description_extraction_jrs, titre_extraction_jrs, typeproduit_extraction_jrs ne change pas, mais imgurl_extraction_jrs change lui sans problème et cela ce répéter X fois les information.

On n’ le texte, mais images change lui X fois, je pense le montre d’image récupérer, ce qui peux me donnée prêt de 10000 info récupérer en quelque seconde.

Chaque page a 12 info a récupérer et il y a 100 pages ce qui donne 1200 info au total.

Le $rest correspond au nombre de pages.

voilà mon code :

Code : Tout sélectionner

<?php include_once("simple_html_dom.php"); $url = 'www.site_test.com’; $html = file_get_html("http://$url/fr/site_test .com»); foreach($html->find('div[class="paginate"]') as $e) $rest = substr("$e->outertext", 51, 2); //echo $rest; $nombrepages = 1; //$nombre_de_lignes = 1 ; $i = 1 ; for($i=0; $i<=$nombrepages; $i++) { // while ($i <= $nombrepages) // //{ $html = file_get_html("http://$url/fr/site_test.com"); foreach($html->find('p[itemprop="description"]') as $e) if(!empty($e->plaintext)){ $description_extraction_jrs[$i] = $e->plaintext; } foreach($html->find('img[class="lazyOwl"]') as $e) if(!empty($e->alt)){ $titre_extraction_jrs[$i] = $e->alt; } foreach($html->find('img[class="lazyOwl"]') as $e) if(!empty($e->src)){ $imgurl_extraction_jrs[$i] = $e->src; foreach($html->find('div[class="banner"]') as $e)// if(!empty($e->plaintext)){ $typeproduit_extraction_jrs[$i] = $e->plaintext; $sql = "INSERT INTO extraction_jrs (`id_extraction_jrs`, `description_extraction_jrs`, `date_extraction_jrs`, `heure_extraction_jrs`, `imgurl_extraction_jrs`, `siteurl_extraction_jrs`, `typeproduit_extraction_jrs`, `titre_extraction_jrs`) VALUES (NULL, '$description_extraction_jrs[$i]', NOW(), NOW(), ‘$imgurl_extraction_jrs[$i] ‘, '$url', '$typeproduit_extraction_jrs[$i]', '$titre_extraction_jrs[$i]')"; $bdd->exec($sql); } } $nombrepages++; } ?>
Je peux avoir de l’aide sur cette boucle, je bloque vraiment et comprend pas par ou je dois chercher.

Merci à vous,

Mammouth du PHP | 1967 Messages

01 avr. 2016, 09:58

J'ai rien compris de ton message, aucune phrase ne semble cohérente.

Relis toi step
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 115 Messages

01 avr. 2016, 11:55

Re-Bonjour,

Désoler j'ai écris avec précipitation, et ne me suis pas relue.

Mon problème est que ma boucle fonctionne mal, j'ai bien les informations récupérer qui apparaisse dans ma BDD.
Elle ne donne pas un bon résultat,

je me retrouve avec des informations qui ce répète sans fin, mais les images récupérer elle change.

LIGNE bdd:

id_extraction_jrs - description_extraction_jrs - date_extraction_jrs - heure_extraction_jrs - imgurl_extraction_jrs - siteurl_extraction_jrs - typeproduit_extraction_jrs - titre_extraction_jrs

1 - description OK - 01042016 - 11:20:00 - Lien image OK - site-test - Type produit OK - titre OK
2 - description répète ligne 1 - 01042016 - 11:20:00 - Lien image nouveaux lien image - site-test répète ligne 1 - Type produit répète ligne 1 - titre répète ligne 1
3 - description répète ligne 1 - 01042016 - 11:20:00 - Lien image nouveaux lien image - site-test répète ligne 1 - Type produit répète ligne 1 - titre répète ligne 1
....
24 - description OK - 01042016 - 11:20:00 - Lien image OK - site-test - Type produit OK - titre OK
3 - description répète ligne 24 - 01042016 - 11:20:00 - Lien image nouveaux lien image - site-test répète ligne 24 - Type produit répète ligne 24 - titre répète ligne 24

Code : Tout sélectionner

<?php include_once("simple_html_dom.php"); $url = 'www.site_test.com’; $html = file_get_html("http://$url/fr/site_test .com»); foreach($html->find('div[class="paginate"]') as $e) $rest = substr("$e->outertext", 51, 2); //echo $rest; $nombrepages = 1; //$nombre_de_lignes = 1 ; $i = 1 ; for($i=0; $i<=$nombrepages; $i++) { // while ($i <= $nombrepages) // //{ $html = file_get_html("http://$url/fr/site_test.com"); foreach($html->find('p[itemprop="description"]') as $e) if(!empty($e->plaintext)){ $description_extraction_jrs[$i] = $e->plaintext; } foreach($html->find('img[class="lazyOwl"]') as $e) if(!empty($e->alt)){ $titre_extraction_jrs[$i] = $e->alt; } foreach($html->find('img[class="lazyOwl"]') as $e) if(!empty($e->src)){ $imgurl_extraction_jrs[$i] = $e->src; foreach($html->find('div[class="banner"]') as $e)// if(!empty($e->plaintext)){ $typeproduit_extraction_jrs[$i] = $e->plaintext; $sql = "INSERT INTO extraction_jrs (`id_extraction_jrs`, `description_extraction_jrs`, `date_extraction_jrs`, `heure_extraction_jrs`, `imgurl_extraction_jrs`, `siteurl_extraction_jrs`, `typeproduit_extraction_jrs`, `titre_extraction_jrs`) VALUES (NULL, '$description_extraction_jrs[$i]', NOW(), NOW(), ‘$imgurl_extraction_jrs[$i] ‘, '$url', '$typeproduit_extraction_jrs[$i]', '$titre_extraction_jrs[$i]')"; $bdd->exec($sql); } } $nombrepages++; } ?>
Je comprend pas !
Pouvez-vous m'aider.
Merci a vous;

Mammouth du PHP | 1967 Messages

01 avr. 2016, 13:05

ta requète SQL est dans la mauvaise boucle
Elle est dans un foreach plutot que de n'être que dans le for

de plus, il y a une incohérence dans tes index $i.
Il ne s'incrémente que avec la boucle for .
Y a t il sur les page récupèré plusieurs extraction de chaque type ou une seule ?
Si oui il faut complètement revoir tes index sinon ca peut marcher tel quel.

En fin de boucle FOR, tu incrémente nombrespages, tu devrais donc avoir une boucle infinie. Que veux tu faire avec cette instruction ?

Autre remarque, ton titre et ton image peuvent être récupèrè dans le même foreach pour une meilleure performance
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube