Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Dodawanie wyniku do bazy
Forum PHP.pl > Forum > Przedszkole
BuncolPL
Teraz mam taki problem. Mam funkcję która sprawdza pozycje w google i wynik chciałbym zapisać do bazy. Całość kodu wygląda tak:

Kod
<?php
include('config.php');
$_POST['data'] = date('Y-m-d');


$sSite       = "$adresid";  
$sQ          = "$frazaid";

$sPackCnt    = 10;   // ilość podstron
$sPackSize   = 10;   // ilość wyników na stronie
$sStartPos   = 0;    // pozycja startowa
$sFinishPos  = '-';  // pozycja końcowa

$sLinkRegExp = '/<h3 class=r><a href="([^"]+)" class=l>/';  
$sURLTpl     = 'http://www.google.pl/search?hl=pl&q=%s';  

for($sPack = 0; $sPack < $sPackCnt; $sPack++)
{
     $sStartPos = $sPackSize * $sPack;
     $rC = curl_init();
     curl_setopt($rC, CURLOPT_HEADER, 0);
     curl_setopt($rC, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($rC, CURLOPT_VERBOSE, 1);
     curl_setopt($rC, CURLOPT_REFERER, 'www.google.pl');
     curl_setopt($rC, CURLOPT_URL, sprintf($sURLTpl, urlencode($sQ)) . '&start=' . $sStartPos );
     $sData = curl_exec($rC);
     curl_close($rC);

     preg_match_all($sLinkRegExp, $sData, $aResults);
     $aResults = array_pop($aResults);

     foreach($aResults as $iKey => $sRow) {
         if(strpos(strip_tags($sRow), 'http://' . $sSite) !== false) {
             $sFinishPos = $sStartPos + $iKey + 1;
             $sPack = $sPackCnt;
         }
     }
}

printf("%s", $sFinishPos ) /// ta linijka pokazuje pozycję

    try
    {
        if($_SERVER['REQUEST_METHOD'] == 'POST')
        {    
            $pdo = new PDO('mysql:host='.$host.';dbname='.$dbname.'', "$user", "$pass", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    
            $ilosc = $pdo -> exec('INSERT INTO `pozycja` (`adresid`, `frazaid`, `miejsce`, `data`)VALUES(
                \''.$_POST['adresid'].'\',
                \''.$_POST['frazaid'].'\',
                \''.$_POST['miejsce'].'\', /// a tutaj mam problem z wpisaniem
                \''.$_POST['data'].'\')');
                
        

            if($ilosc > 0)
            {
                echo 'Dodano: '.$ilosc.' rekordow';
            }
  }
}

    catch(PDOException $e)
    {
        echo 'Wystapil blad biblioteki PDO: ' . $e->getMessage();
    }
?>


Do bazy wpisuje się adresid, frazaid, miejsce, data. Problem pojawia się z kolumną miejsce, ponieważ nie wiem jak zrobić żeby wynik, który pokazywany jest tutaj printf("%s", $sFinishPos ) został dodany do bazy. Odpowiada za to \''.$_POST['miejsce'].'\', różne rzeczy tam wpisywałem ale zawsze dodawał mi 0.

Kolumny adresid, frazaid, data wpisywane są poprawnie do bazy.
erix
A co masz w ogóle w $_POST['miejsce']? Nie pokazałeś formularza, szklana kula mi zginęła.
BuncolPL
Formularz wygląda tak:

Kod
<form action="dodaj2.php" method="post">
<table width="300" border="0" cellspacing="4" cellpadding="0" align="center">
<tr>
  <td>Adres ID:</td>
  <td algin="center"><input type="text" name="adresid" size="10" maxlenght="10"></td>
</tr>
<tr>
  <td>Fraza ID:</td>
  <td algin="center"><input type="text" name="frazaid" size="10" maxlenght="10>"></td>
</tr>
<tr>
<tr>
  <td colspan="2" align="center"><input type="submit" value="SprawdĽ pozycję"></td>
</tr>
</table>
</form>


Ale chyba sprawdzanie przez formularz nie jest dobrym pomysłem. Będę to chciał za rozwiązać za pomocą pliku, który wszystkie frazy z tabeli będzie pobierał automatycznie.
Napisałem taki kawałek, ale nie wiem jak zrobić dalej. A chcę aby zapisywało wynik do bazy danych.

Problem jest jeszcze to, że przy większej ilości pozycji sprawdza tylko jedną i ją podaje. Reszty nie rusza :/


Kod
<?php
include('config.php');

   try
   {
      $dbh = $pdo = new PDO('mysql:host='.$host.';dbname='.$dbname.'', "$user", "$pass"); // polaczenie z baza danych
      $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);                    // polaczenie z baza danych
      $dbh -> query('SET NAMES utf8');                                                    // zmiana kodowania
          
      $stmt = $pdo -> query('SELECT * FROM fraza LEFT JOIN strona USING (adresid) ');     // wybieranie danych z tabeli

// początek tablicy, która rozbija frazy wg ID    
$results = array();
foreach($stmt as $row){
if(!isset($results[$row['frazaid']])){
   $results[$row['frazaid']] = array();
}

$results[$row['frazaid']][] = $row;
}

foreach($results as $frazaid => $r){
echo sprintf('<dt>%s</dt>', $frazaid);
foreach($r as $row){
   echo sprintf('%s - %s ', $row['adres'], $row['slowo']);
}
}
// koniec tablicy


   }
   catch(PDOException $e)
   {
      echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
   }
  
$adres = $row['adres']; // zamienianie
$slowo = $row['slowo']; // zamienianie

// Monitoring pozycji
$sSite       = "$adres";  
$sQ          = "$slowo";

$sPackCnt    = 10;   // ilość podstron
$sPackSize   = 10;   // ilość wyników na stronie
$sStartPos   = 0;    // pozycja startowa
$sFinishPos  = '-';  // pozycja końcowa

$sLinkRegExp = '/<h3 class=r><a href="([^"]+)" class=l>/';  
$sURLTpl     = 'http://www.google.pl/search?hl=pl&q=%s';  

for($sPack = 0; $sPack < $sPackCnt; $sPack++)
{
     $sStartPos = $sPackSize * $sPack;
     $rC = curl_init();
     curl_setopt($rC, CURLOPT_HEADER, 0);
     curl_setopt($rC, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($rC, CURLOPT_VERBOSE, 1);
     curl_setopt($rC, CURLOPT_REFERER, 'www.google.pl');
     curl_setopt($rC, CURLOPT_URL, sprintf($sURLTpl, urlencode($sQ)) . '&start=' . $sStartPos );
     $sData = curl_exec($rC);
     curl_close($rC);

     preg_match_all($sLinkRegExp, $sData, $aResults);
     $aResults = array_pop($aResults);

     foreach($aResults as $iKey => $sRow) {
         if(strpos(strip_tags($sRow), 'http://' . $sSite) !== false) {
             $sFinishPos = $sStartPos + $iKey + 1;
             $sPack = $sPackCnt;
         }
     }
}
{
return printf("%s", $sFinishPos );
}
//koniec monitoringu pozycji

?>
erix
Cytat
Ale chyba sprawdzanie przez formularz nie jest dobrym pomysłem. Będę to chciał za rozwiązać za pomocą pliku, który wszystkie frazy z tabeli będzie pobierał automatycznie.

Szczerze mówiąc, to nie rozumiem, co miałoby oznaczać w Twoim kodzie $_POST['miejsce']. Miejsce w wynikach, czy jak? Jeśli tak, to nie tędy droga. winksmiley.jpg

Cytat
Problem jest jeszcze to, że przy większej ilości pozycji sprawdza tylko jedną i ją podaje. Reszty nie rusza :/

Używaj poprawnego bbCode (php) i popraw wcięcia, bo ciężko rozczytać.

Strasznie chaotycznie to wszystko zrobiłeś; nie wiem już, do którego listingu się odnosisz - nie ponazywałeś, a w drugim nie masz dodawania niczego do bazy.
BuncolPL
nie wiem już, do którego listingu się odnosisz

Do tego, który jest poniżej smile.gif

a w drugim nie masz dodawania niczego do bazy.


Zgadza się bo nie za bardzo wiem jak to zrobić, żeby wyniki zostały dopisywane do bazy danych. Mam nadzieję, że mi z tym pomożecie.
Problemem też jest, że jeśli ma sprawdzić kilka fraz to wynik (czyli pozycję, którą zajmuje) pokazuje tylko dla jednej frazy a nie dla wszystkich. Też nie mam pomysłu jak to rozwiązać :/

Kod jest taki:

  1. <?php
  2. include('config.php');
  3.  
  4.   try
  5.   {
  6.      $dbh = $pdo = new PDO('mysql:host='.$host.';dbname='.$dbname.'', "$user", "$pass");
  7.      $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);                    
  8.      $dbh -> query('SET NAMES utf8');                                                  
  9.          
  10.      $stmt = $pdo -> query('SELECT * FROM fraza LEFT JOIN strona USING (adresid) ');    
  11.  
  12. //początek tablicy, która rozbija frazy wg ID    
  13.  $results = array();
  14.    foreach($stmt as $row){
  15.      if(!isset($results[$row['frazaid']])){
  16.  $results[$row['frazaid']] = array();
  17. }
  18.  
  19. $results[$row['frazaid']][] = $row;
  20. }
  21.  
  22.    foreach($results as $frazaid => $r){
  23.      echo sprintf('<dt>%s</dt>', $frazaid);
  24.    foreach($r as $row){
  25.      echo sprintf('%s - %s ', $row['adres'], $row['slowo']);
  26. }
  27. }
  28. //koniec tablicy
  29.  
  30.  
  31.   }
  32.   catch(PDOException $e)
  33.   {
  34.      echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  35.   }
  36.  
  37. $adres = $row['adres']; // zamienianie
  38. $slowo = $row['slowo']; // zamienianie
  39.  
  40. //Monitoring pozycji
  41. $sSite       = "$adres";  
  42. $sQ          = "$slowo";
  43.  
  44. $sPackCnt    = 10;   // ilość podstron
  45. $sPackSize   = 10;   // ilość wyników na stronie
  46. $sStartPos   = 0;    // pozycja startowa
  47. $sFinishPos  = '-';  // pozycja końcowa
  48.  
  49. $sLinkRegExp = '/<h3 class=r><a href="([^"]+)" class=l>/';  
  50. $sURLTpl     = 'http://www.google.pl/search?hl=pl&q=%s';  
  51.  
  52. for($sPack = 0; $sPack < $sPackCnt; $sPack++)
  53. {
  54.     $sStartPos = $sPackSize * $sPack;
  55.     $rC = curl_init();
  56.     curl_setopt($rC, CURLOPT_HEADER, 0);
  57.     curl_setopt($rC, CURLOPT_RETURNTRANSFER, 1);
  58.     curl_setopt($rC, CURLOPT_VERBOSE, 1);
  59.     curl_setopt($rC, CURLOPT_REFERER, 'www.google.pl');
  60.     curl_setopt($rC, CURLOPT_URL, sprintf($sURLTpl, urlencode($sQ)) . '&start=' . $sStartPos );
  61.     $sData = curl_exec($rC);
  62.     curl_close($rC);
  63.  
  64.     preg_match_all($sLinkRegExp, $sData, $aResults);
  65.     $aResults = array_pop($aResults);
  66.  
  67.     foreach($aResults as $iKey => $sRow) {
  68.         if(strpos(strip_tags($sRow), 'http://' . $sSite) !== false) {
  69.             $sFinishPos = $sStartPos + $iKey + 1;
  70.             $sPack = $sPackCnt;
  71.         }
  72.     }
  73. }
  74. {
  75. return printf("%s", $sFinishPos );
  76. }
  77. //koniec monitoringu pozycji
  78. ?>
erix
Cytat
Problemem też jest, że jeśli ma sprawdzić kilka fraz to wynik (czyli pozycję, którą zajmuje) pokazuje tylko dla jednej frazy a nie dla wszystkich. Też nie mam pomysłu jak to rozwiązać :/

A jak miałoby pokazywać pozycje, gdyby były dwie różne? Sory, ale nie kumam, o co Ci chodzi, jak miałoby pozycję pokazywać. ;p

  1. <?php
  2. {
  3. return printf("%s", $sFinishPos );
  4. }
  5. ?>

A to co? snitch.gif Gdzie Ty tu masz funkcję?

A jeśli chodzi o dodawanie do bazy - zapytanie INSERT wstaw w tym miejscu, w którym masz już pobraną pozycję w wynikach.
BuncolPL
A jak miałoby pokazywać pozycje, gdyby były dwie różne? Sory, ale nie kumam, o co Ci chodzi, jak miałoby pozycję pokazywać. ;p

Chodzi o to, że w tabeli mogę mieć zapisanych kilka fraz do sprawdzenia np.
php.pl - php
forum.php.pl - Forum o php
www.otomoto.pl - ogłoszenia
itd.

(tutaj http://www.drechna.pl/pozycje/ sama funkcja bez bazy, w której sobie można sprawdzać pozycje, teraz próbuje zrobić wersje automatyczną, że samo pobiera i samo zapisuje po otworzeniu pliku.)

Chcę aby wszystkie te frazy były sprawdzane.. Po sprawdzeniu, żeby zapisywało wynik do bazy danych dla tych wszystkich fraz.

  1. <?php
  2. {
  3. return printf("%s", $sFinishPos );
  4. }
  5. ?>


A to co? Gdzie Ty tu masz funkcję?

return printf("%s", $sFinishPos ); jest właśnie moim problem. Pokazuje mi to wynik ale nie potrafię tego wyniku wpisać do bazy.


A jeśli chodzi o dodawanie do bazy - zapytanie INSERT wstaw w tym miejscu, w którym masz już pobraną pozycję w wynikach.

Właśnie problem w tym, że nie mam pojęcia gdzie i jak ten INSERT wstawić :/
erix
Cytat
return printf("%s", $sFinishPos ); jest właśnie moim problem. Pokazuje mi to wynik ale nie potrafię tego wyniku wpisać do bazy.

return" title="Zobacz w manualu PHP" target="_manual - poczytaj. winksmiley.jpg

Cytat
Właśnie problem w tym, że nie mam pojęcia gdzie i jak ten INSERT wstawić :/

Noż człowieku, nie wiesz, jak się wykonuje zapytanie INSERT? Kurs PHP+MySQL się kłania.

Poza tym, napisałem:
Cytat
A jeśli chodzi o dodawanie do bazy - zapytanie INSERT wstaw w tym miejscu, w którym masz już pobraną pozycję w wynikach.
BuncolPL
return - poczytaj.

No i mówi mi to tylko tyle, że return() kończy działanie funkcji ... więc trzeba było to wywalić.

Cytat
Noż człowieku, nie wiesz, jak się wykonuje zapytanie INSERT? Kurs PHP+MySQL się kłania.


Cały czas się uczę smile.gif A ten dział chyba jest od tego, że jak ktoś ma małą wiedzę i czegoś jeszcze nie umie to może pytać smile.gif Nie każdy urodził się z tym żeby po tygodniu nauki super skrypty pisać smile.gif

Wstawiam tam INSERT
  1. <?php
  2. {
  3.  
  4. $_POST['adresid'] = $row['adresid'];
  5. $_POST['frazaid'] = $row['frazaid'];
  6. $_POST['miejsce'] = $sFinishPos;
  7.  
  8. $pdo -> exec('INSERT INTO `pozycja` (`adresid`, `frazaid`, `miejsce`, `data`)VALUES(
  9.                ''.$_POST['adresid'].'',
  10.                ''.$_POST['frazaid'].'',
  11.                ''.$_POST['miejsce'].'',
  12.                ''.$_POST['data'].'')');
  13. }
  14. //koniec monitoringu pozycji
  15. ?>


Teoretycznie wszystko dodaje, ale ...
sprawdza tylko jedną frazę, a nie wszystkie które są zapisane w bazie :/ Macie na to jakąś radę ?
erix
Cytat
Cały czas się uczę A ten dział chyba jest od tego, że jak ktoś ma małą wiedzę i czegoś jeszcze nie umie to może pytać Nie każdy urodził się z tym żeby po tygodniu nauki super skrypty pisać

Ale każdy, kto się uczy, powinien wykazywać się samodzielnością, a otrzymane podpowiedzi traktować jako rady, a nie gotowce. Poza tym, umiejętność czytania ze zrozumieniem, to nie jest chyba niewiadomo, co. tongue.gif

Cytat
sprawdza tylko jedną frazę, a nie wszystkie które są zapisane w bazie :/ Macie na to jakąś radę ?

:
Kod
$adres = $row['adres']; // zamienianie
$slowo = $row['slowo']; // zamienianie

//Monitoring pozycji
$sSite       = "$adres";  
$sQ          = "$slowo";

Sprawdzanie nie jest w pętli, a przyporządkowujesz do zmiennej tylko jedną wartość. winksmiley.jpg To nie jest tablica, więc kod wykonuje się poprawnie, musisz poprawić logikę. winksmiley.jpg
BuncolPL
A możesz coś więcej podpowiedzieć jak to zrobić ? Poza tym rozumie, że błąd jest tylko w tych linijkach kodu, a reszta jest dobrze ?
erix
To znaczy, nie w linijkach, tylko w logice.

Masz wcześniej pętlę wyciągającą frazy z bazy. Ok, to jest dobry kod. Ale sprawdzanie fraz masz na podstawie zmiennej $sQ, która przechowuje ostatnią wyciągniętą z bazy wartość.

Sprawdzanie frazy wrzuć w tę pętlę wyciągającą z bazy, aby co krok pętli był inny keyword. winksmiley.jpg
BuncolPL
Czyli np. musiałbym z tego

  1. <?php
  2. $adres = $row['adres']; // zamienianie
  3. $slowo = $row['slowo']; // zamienianie
  4.  
  5. //Monitoring pozycji
  6. $sSite       = "$adres";  
  7. $sQ          = "$slowo";
  8.  
  9. // reszta aż do końca
  10.  
  11. return printf("%s", $sFinishPos );
  12. }
  13. //koniec monitoringu pozycji
  14. ?>


zrobić funkcję i podstawić ją do tego ?

  1. <?php
  2. $results = array();
  3.   foreach($stmt as $row){
  4.     if(!isset($results[$row['frazaid']])){
  5. $results[$row['frazaid']] = array();
  6. }
  7.  
  8. $results[$row['frazaid']][] = $row;
  9. }
  10.  
  11.   foreach($results as $frazaid => $r){
  12.     echo sprintf('<dt>%s</dt>', $frazaid);
  13.   foreach($r as $row){
  14.     echo sprintf('%s - %s ', $row['adres'], $row['slowo']);
  15. }
  16. ?>
erix
No, coś takiego. winksmiley.jpg

Wg pseudokodu:
Kod
dla każdej frazy wyciąganej z bazy{
   sprawdzFraze();
}
BuncolPL
No i zrobiłem coś takiego:

  1. <?php
  2. function sprawdzfraze()
  3. {
  4. $adres = $row['adres']; // zamienianie
  5. $slowo = $row['slowo']; // zamienianie
  6.  
  7. // Monitoring pozycji
  8. $sSite       = "$adres";  
  9. $sQ          = "$slowo";
  10.  
  11. //reszta skrytu
  12.  
  13. } //zamkniecie funkcji
  14. ?>


Czy to dobrze ? Jeśli tak to czy mógłbyś napisać gdzie ją teraz dodać do tej pętli i w jaki sposób ?
erix
Człowieku, przecież napisałem. winksmiley.jpg

Nie do końca dobrze, bo w dalszym ciągu fraza nie jest zmieniana. Poczytaj dokładnie o funkcjach, potrzebowałbyś argumentu zawierającego adres i frazę, ale nadrób najpierw braki.
BuncolPL
Nie rozumie dlaczego nie możesz mi powiedzieć jak to ma być ? Tym bardziej, że trzeba zmienić kawałek kodu, a kombinowałem już z tym parę godzin i nic mi nie wychodzi.

Ma ktoś jakieś sugestię bo męczę się już z tym 2 dzień i nadal nic :/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.