PageRank Bug

  • Creatore Discussione Creatore Discussione xeryan
  • Data di inizio Data di inizio

xeryan

Nuovo Utente
3 Set 2010
22
0
0
Napoli, Italy
salve, oggi sono incappato in nuovo rompicapo che non riesco a risolvere, forse più semplice del previsto, inizio postando il codice:
PHP:
include("connect.php"); $tot_pages=mysql_query("SELECT * FROM ise");
echo "<strong>Analisi PageRank:</strong><br><br>";
for ($i=1;$i<=mysql_num_rows($tot_pages);$i++) {
  $page_query=mysql_query("SELECT link FROM ise WHERE id='$i'"); $page=mysql_fetch_array($page_query); $page['link']=substr($page['link'],7,strlen($page['link']));
  while ($row=mysql_fetch_row($tot_pages)) {
    if ($page['link']!=substr($row['4'],7,strlen($row['4']))) {
      $file=getContent($row['4']);
      $sub=substr_count($file,$page['link']);
      echo "$sub (" . $page['link'] . ") => [" . $row['4'] .  "]<br>";
    }
  }
}
in pratica utilizzando la funzione getContent apre la pagina esterna e ne legge i risultati, quindi faccio un esempio di cosa deve fare lo script:

legge la prima riga della tabella prendendone il record "link" (questa sarà la stringa che le altre pagine dovranno contenere), poi nello stesso ciclo effettuo un controllo con le altre pagine...poi in teoria dovrebbe ricominciare il processo partendo dalla 2 riga e successiva, ma invece mi analizza soltanto la prima riga con le altre righe. Mi rendo conto che a parole è difficile da spiegare, quindi spero che il codice sia comprensibile ma in pratica dovrei simulare una specie del pagerank di google che controlla nelle pagina quanti link puntano alla pagina scelta, io invece questo controllo lo faccio nel mio database, link per link.

ecco cosa mi esce di output:
HTML:
Analisi PageRank:

0 (xeryan.altervista.org) => [http://xeryan.altervista.org/blonox]
0 (xeryan.altervista.org) => [http://socialdrink.altervista.org]

quando invece l'analisi dovrebbe essere fatta cosi:
HTML:
Analisi PageRank:

0 (xeryan.altervista.org) => [http://xeryan.altervista.org/blonox]
0 (xeryan.altervista.org) => [http://socialdrink.altervista.org]
0 (xeryan.altervista.org/blonox) => [http://xeryan.altervista.org]
0 (xeryan.altervista.org/blonox) => [http://socialdrink.altervista.org]
0 (socialdrink.altervista.org) => [xeryan.altervista.org]
0 (socialdrink.altervista.org) => [http://xeryan.altervista.org/blonox]
Help, Please 0:)
 
L'unica ragione per cui si debba fermare all'improvviso è che questa condizione:
PHP:
if ($page['link']!=substr($row['4'],7,strlen($row['4'])))
Non venga soddisfatta. Prova a fare:
PHP:
var_dump($page['link'], substr($row[4], 7, strlen($row[4]));
E vedi se le due stringhe stampate per ogni record sono uguali.
 
ecco cosa mi esce:

HTML:
string(21) "xeryan.altervista.org" string(21) "xeryan.altervista.org" string(21) "xeryan.altervista.org" string(28) "xeryan.altervista.org/blonox" string(21) "xeryan.altervista.org" string(26) "socialdrink.altervista.org"

quindi il problema non è nella condizione, ma penso da qualche altra parte...
 
ciao
la funzione getContent è una funzione che ti sei fatto tu? non mi sembra che sia una funzione nativa di php.
non ti stai confondendo forse con file_get_contents o get_content ?
 
La funzione getContent, come ha già detto borgo, non esiste, quindi deve essere per forza definita nel file connect.php oppure in un file incluso da esso (o in un file che include la pagina che visualizza gli URL). Comunque prova modificando così, anche se dubito che cambi qualcosa:
PHP:
<?php
require 'connect.php';
$tot_pages = mysql_query('SELECT * FROM ise');
echo '<strong>Analisi PageRank:</strong><br /><br />';

while($assoc = mysql_fetch_assoc($tot_pages))
{
	$page_query = mysql_query("SELECT link FROM ise WHERE id='{$assoc['id']}'");
	$page = mysql_fetch_array($page_query);
	$page['link'] = substr($page['link'], 7, strlen($page['link']));

	while($row = mysql_fetch_assoc($tot_pages))
	{
		$without_prot = substr($row[4], 7, strlen($row[4]));

		if($page['link'] != $without_prot)
		{
			$file = getContent($row['4']);
			$sub = substr_count($file, $page['link']);
			echo "{$sub} ({$page['link']}) => [{$row[4]}]<br />";
		}
	}
}
?>
 
borgo la funzione getContent lo presa da google :p

PHP:
function getContent ($url) {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.6 Safari/532.1");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
  $output = curl_exec($ch);
  $info=curl_getinfo($ch, CURLINFO_HTTP_CODE);
  curl_close($ch);
  if ($output==false || $info!=200) {$output=null;} 

  return $output;
}

@alessandro: grz davvero però il codice da te postato non funziona :skull:
 
ciao
la funzione getContent lo presa da google
prova ad andare sul manuale ufficiale
http://www.php.net/manual/en/
ed in altro a dx inserisci getContent nella ricerca, vedrai che non una funzione nativa di php.

se hai trovato getConten su google guarda che non ti manchi tutta la definizione delle funzione, ciè una parte di scrip simile al seguente:

PHP:
function getConten($pincopallo){
//codice della function
}
 
si scusa mi sono espresso male, lo so che non è una funzione built-in di php... :hammer:

P.S. comunque ritornando al mio problema, con il codice di alessandro ho provato cambiando da _assoc a _row la funzione mysql_fetch_ecc... e mi esce lo stesso output, quindi ritorno al punto di partenza, non capisco come mai il ciclo non legga le altre combinazioni
 
ciao
non avevo letto bene, hai tutta la definizione.
allora subito sotto il tag di apertura php devi scrivera la funzione
PHP:
<?php
function getContent ($url) { 
  $ch = curl_init(); 
  //ecc....
}
oppure scriverla in un file (chiamto ad es funzione.inc.php) e come ha detto alex

PHP:
<?php 
require 'connect.php'; 
require_once "funzione.inc.php";
//ecc.....
 
mi sà che ti sei perso la prima parte XD, ho già la funzione "personale" getContent e "funziona" alla perfezione, il problema non è questo ma il fatto che non riesco a far leggere combinazioni di record, con un esempio numerico spiego meglio cosa non funziona:

ho X numeri (1,2,3,...[x]) e voglio analizzare ogni combinazione dei numeri quindi avendo tre numeri le combinazioni saranno le seguenti:
1 con 2; 1 con 3; 2 con 1; 2 con 3; 3 con 1; 3 con 2.

nel mio caso il problema è che il ciclo mi si ferma a 1 con 3 senza continuare...

P.S. per chi ancora non lo avesse capito sto facendo un esercizio di programmazione in php sui motori di ricerca :p
 
ciao
PHP:
mi sà che ti sei perso la prima parte XD, ho già la funzione "personale" getContent e

è che non vedo nel tuo script ne l'include ne la definizione, probabilmente non l'hai postata.
mi è venuto comunque un dubbio, gli id della tabella ise sono autoincrement? non hai per caso cancellato qualche record? in questo caso se prima avevi
id link
1 link1
2 link2
3 linh3

nel caso che tu cancelli un link e ne rimetti un altro la tabella diventa:
id link
1 link1
3 linh3
4 link4
per cui ciclando con for $i++ che si incrementa 1,2,3,4....
se sei nel secondo caso può provocarti un po' di inca....tura
il quanto l'id 2 non esite più
 
Mi accorgo ora che il risultato del var_dump mostra una situazione in cui i link successivi a quelli visualizzati non possono essere mostrati. Guarda qua:
xeryan.altervista.org
xeryan.altervista.org
Fin qui tutto ok, e infatti il primo link viene visualizzato correttamente. Il problema sorge dal secondo in poi:
xeryan.altervista.org
xeryan.altervista.org/blonox
Qui i due link non sono uguali, quindi la condizione dell'if non viene soddisfatta. E non lo è neanche qui:
xeryan.altervista.org
socialdrink.altervista.org
Quindi evidentemente c'è qualcosa di sbagliato nella struttura del database. I due campi da cui prendi i link dovrebbero contenere entrambi lo stesso link, mentre non è così...
 
uhm...non ho ben capito ma i campi da cui prendo i link non devono contenere gli stessi link altrimenti non avrebbe senso effettuare un pagerank di una pagina con la stessa ma sicuramente avrò capito male io :book:
 
ciao
guarda che forse il problema e nei cicli che usi
se vuoi verificare il primo record con il secondo col terzo col quarto.....
il secondo col terzo con il quarto .... ecc..
secondo me dovresti provare a fare questi cicli

PHP:
<?php
include("connect.php");
$tot_pages=mysql_query("SELECT * FROM ise"); 
echo "<strong>Analisi PageRank:</strong><br><br>"; 
while($riga_uno=mysql_fetch_array($tot_pages)){
	$id=$riga_uno['id'];
	$link_uno=$riga_uno['link'];
	//estraggo gli altri link escluso il precedente
	$page_query=mysql_query("SELECT link FROM ise WHERE id >$id");
	$link_uno=substr($link,7,strlen($link_uno));
	while($riga_due=mysql_fetch_array($page_query)){
		$link_due=$riga_due['link'];
		$link_due=substr($link_due,7,strlen($link_due));
		if ($link_uno!=$link_due) {
			$file=getContent($link_due);
			$sub=substr_count($file,$link_uno);
			echo"$sub ($link_uno) => $link_due<br>";
		}//fine if
	}//fine while riga_due
}//fine while riga_uno
?>

p.s.
un piccolo consiglio:
usa l'indentazione e in fase di sviluppo tieni separate le istruzioni poi è più facile fare il debag
 
Ultima modifica:
Oh, chiedo perdono. Non so per quale motivo ma credevo che l'if fosse di uguaglianza, quindi il mio ragionamento crolla. Allora non saprei, l'unico problema potrebbe essere nei cicli. Vedi se modificando come ha detto borgo funziona.
 
con il codice verrebbe questo:

() => xeryan.altervista.org/blonox
() => socialdrink.altervista.org
() => socialdrink.altervista.org

comunque andrebbe bene solo per 3 link, ma il numero dei siti è sicuramente maggiore
 

Discussioni simili