Döngü ve PHP file_get_contents

3 Cevap php

Ben bir site tarayabilir ve sonra kaynağından belirli kod ayıklamak olacak bir sayfa yazdım. O kısmı ancak ben birden fazla sayfa üzerinde bu çalıştırmak ve bir veritabanına ayrıntıları dökümü istiyorum başarıyla çalışmaktadır. Ben döngü çalışma almak için stuggling ediyorum, bu benim şu anda ne var:

date_default_timezone_set("australia/sydney");

$host = 'http://www.tabonline.com.au/';
$day = date(d);
$month = date(m);
$year = date(Y);
$slash = '/';
$mtgraces = '/mtgraces.html';

//Gallops Meetings on Todays racing page
$content = file_get_contents($host . $year . "/". $month . "/" . $day . $mtgraces);
preg_match_all('#<a[^<>]+href\s*=\s*[\'"](.R[0-9]+.html*)[\'"]#i', $content, $matches);
foreach ($matches[1] as $url) $links[] =  "$host$year$slash$month$slash$day$slash$url";

//get the runners from each page

for($c=0; $c<count($links); $c++)

$racepage = file_get_contents($links[$i]);
preg_match_all('#<td align="right" height="18"><font color="\#ffffff">[0-9]{1,2}</font></td>#', $racepage, $number);
preg_match_all('#<font color="\#00ffff">[0-9]{1,3}</font>#', $racepage, $rating);
preg_match_all('#<B>[\w]+([\s][A-Z]+)?</B>#', $racepage, $location);
preg_match_all('#<B>[\w]+\s[0-9]+</B>#', $racepage, $locationcode);

//strip tags for storage in DB

$number_data = implode(",", $number[0]);
$dbnumber = strip_tags($number_data);
$final_number = explode(",", $dbnumber);

$rating_data = implode(",", $rating[0]);
$dbrating = strip_tags($rating_data);
$final_rating = explode(",", $dbrating);

$location_data = implode(",", $location[0]);
$dblocation = strip_tags($location_data);
$final_location = explode(",", $dblocation);

$locationcode_data = implode(",", $locationcode[0]);
$dblocationcode = strip_tags($locationcode_data);
$final_locationcode = explode(",", $dblocationcode);

//Insert into database

 $data = array(); 
for($i=0; $i<count($final_number); $i++)
{
    $data[] = "('" . $final_location[0] . "', '" . $final_locationcode[0] . "', '" . $final_number[$i] . "', '" . $final_rating[$i] . "')";
}

if(count($queries) == 0)
{
    # Nothing passed
    # exit
}


$query = "insert into ratings(location, location_code, tab_no, rating) values " . implode(", ", $data); 


$hostname = "%hostname%";   // eg. mysql.yourdomain.com (unique)
$username = "%username%";   // the username specified when setting-up the database
$password = "%password";   // the password specified when setting-up the database
$database = "%database";   // the database name chosen when setting-up the database (unique)
mysql_connect($hostname,$username,$password);
mysql_select_db($database) or die("Unable to select database");

mysql_query($query) OR die(mysql_error())

Bunun için çıkış siteler listesinde bana ($links değişkeni) son sayfanın içeriğini doğru veriyor anda. Sonuçta ben bütün $links değişken döngü istiyorum ve daha sonra verileri bir veritabanına $query değişkeni kullanarak, bu nedenle üzerinde daha fazla analiz yapabileceğiniz içe.

Bu mantıklı ve umut benim şekillerde hatayı görebilirsiniz.

3 Cevap

Hmm ... burada bir kaç konu vardır ...

for($c=0; $c<count($links); $c++)

Bu döngü sadece bir sonraki satırı yürütülüyor:

$racepage = file_get_contents($links[$i]);

Ancak, $ i sana $ c istediklerini sanıyorum, tanımlı değil. Ayrıca, Şimdi, bu denenmemiş ... çeşitli yerlerinde etrafında bazı parantez yerleştirmek gerekir, ama sizin gibi bir şey istiyorum düşünüyorum:

date_default_timezone_set("australia/sydney");


$host = 'http://www.tabonline.com.au/';
$day = date(d);
$month = date(m);
$year = date(Y);
$slash = '/';
$mtgraces = '/mtgraces.html';


//Gallops Meetings on Todays racing page
$content = file_get_contents($host . $year . "/". $month . "/" . $day . $mtgraces);
preg_match_all('#<a[^<>]+href\s*=\s*[\'"](.R[0-9]+.html*)[\'"]#i', $content, $matches);
foreach ($matches[1] as $url) $links[] =  "$host$year$slash$month$slash$day$slash$url";


//get the runners from each page
$final_number = array();
$final_rating = array();
$final_location = array();
$final_locationcode = array();

for($c=0; $c<count($links); $c++)
{
  $racepage = file_get_contents($links[$c]);
  preg_match_all('#<td align="right" height="18"><font color="\#ffffff">[0-9]{1,2}</font></td>#', $racepage, $number);
  preg_match_all('#<font color="\#00ffff">[0-9]{1,3}</font>#', $racepage, $rating);
  preg_match_all('#<B>[\w]+([\s][A-Z]+)?</B>#', $racepage, $location);
  preg_match_all('#<B>[\w]+\s[0-9]+</B>#', $racepage, $locationcode);

  //strip tags for storage in DB
  $number_data = implode(",", $number[0]);
  $dbnumber = strip_tags($number_data);
  $final_number[] = explode(",", $dbnumber);

  $rating_data = implode(",", $rating[0]);
  $dbrating = strip_tags($rating_data);
  $final_rating[] = explode(",", $dbrating);

  $location_data = implode(",", $location[0]);
  $dblocation = strip_tags($location_data);
  $final_location[] = explode(",", $dblocation);

  $locationcode_data = implode(",", $locationcode[0]);
  $dblocationcode = strip_tags($locationcode_data);
  $final_locationcode[] = explode(",", $dblocationcode);
}

//Insert into database
$data = array();
for($i=0; $i<count($final_number); $i++)
    $data[] = "('" . $final_location[0] . "', '" . $final_locationcode[0] . "', '" . $final_number[$i] . "', '" . $final_rating[$i] . "')";


if(count($queries) != 0)
{
  $query = "insert into ratings(location, location_code, tab_no, rating) values " . implode(", ", $data);
  $hostname = "%hostname%";   // eg. mysql.yourdomain.com (unique)
  $username = "%username%";   // the username specified when setting-up the database
  $password = "%password";   // the password specified when setting-up the database
  $database = "%database";   // the database name chosen when setting-up the database (unique)
  mysql_connect($hostname,$username,$password);
  mysql_select_db($database) or die("Unable to select database");
  mysql_query($query) OR die(mysql_error())
}

$ Final_number bir racepage bağlantı sağ olsun bir şey mi? Sen $i<count($final_number) olarak için kullanıyor. Bunun yerine ben size ne eklemek istediğiniz her bağlantı için bir satır olarak orada $i<count($links) kullanmak gerektiğini düşünüyorum. Ne yapabilirim hareket olduğunu:

$data[] = "('" . $final_location[0] . "', '" . $final_locationcode[0] . "', '" . $final_number[$i] . "', '" . $final_rating[$i] . "')";

... Bu gibi size kod bakmak o noktadan itibaren yapacak for($c=0; $c<count($links); $c++) hattının alt çizgi, (haber $ data = array () döngü önce tanımlanmıştır):

$data = array();
for($c=0; $c<count($links); $c++)
{
  $racepage = file_get_contents($links[$c]);
  preg_match_all('#<td align="right" height="18"><font color="\#ffffff">[0-9]{1,2}</font></td>#', $racepage, $number);
  preg_match_all('#<font color="\#00ffff">[0-9]{1,3}</font>#', $racepage, $rating);
  preg_match_all('#<B>[\w]+([\s][A-Z]+)?</B>#', $racepage, $location);
  preg_match_all('#<B>[\w]+\s[0-9]+</B>#', $racepage, $locationcode);

  //strip tags for storage in DB
  $number_data = implode(",", $number[0]);
  $dbnumber = strip_tags($number_data);
  $final_number[] = explode(",", $dbnumber);

  $rating_data = implode(",", $rating[0]);
  $dbrating = strip_tags($rating_data);
  $final_rating[] = explode(",", $dbrating);

  $location_data = implode(",", $location[0]);
  $dblocation = strip_tags($location_data);
  $final_location[] = explode(",", $dblocation);

  $locationcode_data = implode(",", $locationcode[0]);
  $dblocationcode = strip_tags($locationcode_data);
  $final_locationcode[] = explode(",", $dblocationcode);

  $data[] = "('" . $final_location[0] . "', '" . $final_locationcode[0] . "', '" . $final_number[0] . "', '" . $final_rating[0] . "')";
}

if(count($queries) != 0)
{
  $query = "insert into ratings(location, location_code, tab_no, rating) values " . implode(", ", $data);
  $hostname = "%hostname%";   // eg. mysql.yourdomain.com (unique)
  $username = "%username%";   // the username specified when setting-up the database
  $password = "%password";   // the password specified when setting-up the database
  $database = "%database";   // the database name chosen when setting-up the database (unique)
  mysql_connect($hostname,$username,$password);
  mysql_select_db($database) or die("Unable to select database");
  mysql_query($query) OR die(mysql_error())
}

I think there are some problems with this code still.
Edit:I also noticed that on this line

$number_data = implode(",", $number[0]);

$number eşleşen dizelerden oluşan bir dizi yani $number[0] bütün olurdu eşleşti dize olduğundan $number[0], bir dize, bir dizi olamazdı olmaz. Bu 'number_data' için, 'rating_data', 'location_data' ve 'locationcode_data' geçerli olacak böylece can

$number_data = strip_tags($number[0]);

ve daha sonra ekleme verisini oluştururken:

$data[] = "('" . $final_location . "', '" . $final_locationcode . "', '" . $final_number . "', '" . $final_rating . "')";

Ben bunu anlamaya başardı!

Ben döngü için de sürü koymak gerekiyordu, bu yüzden bu gibi görünüyor:

for($c=0; $c<count($links); $c++)
    {
$racepage = file_get_contents($links[$c]);
preg_match_all('#<td align="right" height="18"><font color="\#ffffff">[0-9]{1,2}</font></td>#', $racepage, $number);
preg_match_all('#<font color="\#00ffff">[0-9]{1,3}</font>#', $racepage, $rating);
preg_match_all('#<B>[\w]+([\s][A-Z]+)?</B>#', $racepage, $location);
preg_match_all('#<B>[\w]+\s[0-9]+</B>#', $racepage, $locationcode);

//strip tags for storage in DB

$number_data = implode(",", $number[0]);
$dbnumber = strip_tags($number_data);
$final_number = explode(",", $dbnumber);

$rating_data = implode(",", $rating[0]);
$dbrating = strip_tags($rating_data);
$final_rating = explode(",", $dbrating);

$location_data = implode(",", $location[0]);
$dblocation = strip_tags($location_data);
$final_location = explode(",", $dblocation);

$locationcode_data = implode(",", $locationcode[0]);
$dblocationcode = strip_tags($locationcode_data);
$final_locationcode = explode(",", $dblocationcode);

//Insert into database

 $data = array(); 
for($i=0; $i<count($final_number); $i++)
{
    $data[] = "('" . $final_location[0] . "', '" . $final_locationcode[0] . "', '" . $final_number[$i] . "', '" . $final_rating[$i] . "')";
}

if(count($queries) == 0)
{
    # Nothing passed
    # exit
}


$query = "insert into ratings(location, location_code, tab_no, rating) values " . implode(", ", $data);


$hostname = "%HOSTNAME";   // eg. mysql.yourdomain.com (unique)
$username = "%username%";   // the username specified when setting-up the database
$password = "%password%";   // the password specified when setting-up the database
$database = "%database%";   // the database name chosen when setting-up the database (unique)
mysql_connect($hostname,$username,$password);
mysql_select_db($database) or die("Unable to select database");

mysql_query($query) OR die(mysql_error());


}

Yardımlarınız için hepinize teşekkür ederim, burası büyük bir topluluk gibi görünüyor. Ben daha fazla düzeltmeleri için üzerinde bir göz tutmak için eminim.