[php] Новичкам: задаем вопросы

Discussion in 'PHP' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. spamoney

    spamoney Elder - Старейшина

    Joined:
    26 Dec 2006
    Messages:
    120
    Likes Received:
    7
    Reputations:
    1
    Эм..а можно более понятным русским языком? A то что-то я ничего не понял..
     
  2. Zircool

    Zircool Elder - Старейшина

    Joined:
    1 Mar 2006
    Messages:
    162
    Likes Received:
    37
    Reputations:
    5
    Такой вопрос..скрипт граббера, этот скрипт загоняется в крон и ставится обновление к примеру на 12 часов и сайт автоматически наполняется новостями. Но основная проблема скрипта это запрет граббинга новостей которые уже были сграбблены. Функционально это оформлено так. Скрипт открывает страницу сайта с новостями (откуда будут граббится новости) копирует ссылки новостей, а затем отдельным циклом начинает грабить с каждой ссылки, при удачном граббинге записывает имя ссылки в файл grabbered.txt. Затем если мы заново запускаем скрипт, но с помощью функции array_search проверяем была ли сграблена эта новость или нет, если не была то грабим иначе ничего не делаем, но вот почему то именно эта проверка работает некорректно, вообще не работает. Посмотрите пожалуйста, может у кого нибудь есть идеи как по другому оформить цикл проверки..

    PHP:
    include("./cron/newsland.php");
    // собираем линки новостей
    $ch curl_init();

        
    curl_setopt($chCURLOPT_URL,$url_grub);
        
    curl_setopt($chCURLOPT_HEADERFALSE);
        
    curl_setopt($chCURLOPT_NOBODYFALSE);
        
    curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
        
    curl_setopt($chCURLOPT_USERAGENT"MSIE 7.0");
        
    curl_setopt($chCURLOPT_TIMEOUT20);
        
    $text curl_exec($ch);
        
    curl_close($ch);
        
    preg_match_all("#<a href=\"\/News\/Detail\/id\/(.+)\">#",$text,$results);

    for(
    $i=0;$i<count($results[0]);$i++)
    {
    $urlsis="http://newsland.ru".str_replace(array('<a href="','">'),null,$results[0][$i]);
    if (
    $urlsis!="http://newsland.ru/News/Detail/id/284971/cat/78")
              {
              
    $urlsos[]=$urlsis;

              }
              else
              {}
    }


    $list_garb=file("./grabbered.txt");
    $check_file=array_map("trim",$list_garb);

    foreach (
    $urlsos as $urls_get )
      {
       
    $urls_get=trim($urls_get);
       if (
    array_search($urls_get,$check_file)==FALSE)
      {
         
    // берем текст новости
        
    $text_news file_get_contents($urls_get);
         
    /// вырезаем текст статьи
        
    preg_match('#<h1 class="mt10 grey">(.*?)</h1>(.*?)<div class="bodytext mt5">(.*?)</div></div>#s',$text_news,$result_news);
        
    // меняем кодировку
        
    $result_news[0]=iconv("UTF-8""WINDOWS-1251",$result_news[0]);
        
    //работаем с рисунком новости
        
    preg_match('#<img src="(.+)" title="(.+)" alt="(.+)" class="floatr mt10">#',$result_news[0],$result_image);
        
    // скачиваем картинку
        
    $result_load_image=file_get_contents("http://newsland.ru".$result_image[1]);
        
    $name_image=substr($result_image[1],strrpos($result_image[1],"/")+1);
        
    $good_image fopen("./rssnews_image/".$name_image"w");
        
    fputs($good_image$result_load_image);
        
    /// создаем текст статьи для записи в файл
        
    $src="<div style=\"float: left;\"><img src=\"./rssnews_image/".$name_image."\" title=\"".$result_image[2]."\" alt=\"".$result_image[2]."\" class=\"imagestyle\"></div>";
        
    $time=date(d."-".m."-".y)."\r\n";
        
    $title=$result_image[2]."\r\n";
        
    $name=date("y-m-d-H-i-s");
        
    $body=str_replace(array('<div class="bodytext mt5">',$result_image[0],'</div>','<div class="newsctrl f12 mt10"><div>','</div></div>'),null,$result_news[0]);
        
    $body=preg_replace('#<h1 class="mt10 grey">(.+)</h1>#',null,$body);
        
    $body=str_replace('<a','<br><br><a',$body);

        
    preg_match_all('#(.*?)\.#is',$body,$out_anonce);
        for(
    $r=0;$r<5;$r++)
        {
        
    $body=str_replace($out_anonce[0][$r],$out_anonce[0][$r]."\r\n",$body);

        }

             
    $good fopen("./rssnews_/".$name.".txt""w");
              
    fwrite($good,$time.$title.$src."\r\n".$body);
              
    fclose($good);

             
    $good_urls fopen("./grabbered.txt""a");
              
    fwrite($good_urls,$urls_get."\r\n");
              
    fclose($good_urls);
              
    sleep(1);
       }
       else
       {

       }


     }



     
  3. Solker

    Solker Elder - Старейшина

    Joined:
    4 May 2006
    Messages:
    175
    Likes Received:
    53
    Reputations:
    18
    Структура тупая, но по моему верная.
    Выведи все переменные, которые сравниваются, посмотри что в них.
    $urls_get, $check_file
     
  4. Solker

    Solker Elder - Старейшина

    Joined:
    4 May 2006
    Messages:
    175
    Likes Received:
    53
    Reputations:
    18
    Самый прикол, что если в коде будет иметься еще хоть одна кавычка после этой фразы, то он обрежет по последнию кавычку.

    '#image=([^"].+)#'
     
  5. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Zircool Используйте оператор === для проверки значения, возвращаемого этой функцией. (с) ман про array_search

    А вообще - покажи print_r обоих массивов

    Solker Учите, что делает ? в регулярных выражениях, а вот это - мега тру
    PHP:
    '#image=([^"].+)#'
    Первый знак не кавычка и дальше любое количество знаков до конца строки
     
    _________________________
    #6265 Gifts, 21 Nov 2008
    Last edited: 21 Nov 2008
  6. Solker

    Solker Elder - Старейшина

    Joined:
    4 May 2006
    Messages:
    175
    Likes Received:
    53
    Reputations:
    18
    Странно. Спасибо, был не прав.
    Code:
    '#image=([^"]+)#' [B]*[/B]
     
    #6266 Solker, 21 Nov 2008
    Last edited: 21 Nov 2008
  7. Кубик Рубик

    Joined:
    10 Apr 2008
    Messages:
    48
    Likes Received:
    0
    Reputations:
    0
    На сколько хороша функция проверки форм?
    PHP:
    function insec($text) {
     
    $text htmlentities(strip_tags($text));
     return 
    $text;
    }
    Как добавить сюда регулярку чтобы проходили только буквы и цифры ну и другие безопасные символы?
     
  8. Byrger

    Byrger Elder - Старейшина

    Joined:
    7 Mar 2008
    Messages:
    521
    Likes Received:
    26
    Reputations:
    -4
    PHP:
    if ($addnewfaq==1){
     if ((
    $haed!="")&&($faq!=="")){
      
    $link2connect($host,$user,$pass,$db);         //подключаемся к MySQL
       
    $addFAQaddmysql($link2,faq,faq,$head,$faq,$note);            //Добавить запись из формы в MySQL
       
    unset($haed);
       unset(
    $faq);
       unset(
    $note);
        };
        };
     echo 
    '<form method="POST" action="adminka.php?str=faq">
        <input type="text" name="haed" size="100" /><br />
        <textarea name="faq" rows="10" cols="100"></textarea> <br />
        <input type="text" name="note" size="100" /><br />
        <input type="hidden" name="addnewfaq" value="1">
        <input type="submit" value="Ввод" />
         </form>'

    При вводе данных в форму, они вносятся в БД с помощью функции addMySQL но после внесения данных при обновлении старицы они сного вносятся...и так при каждом обновлении...уже и в форму скрытое поле ввёл и обнуление переменных с помощью unset() не помогло...
    Что можно сделать?
     
  9. Кубик Рубик

    Joined:
    10 Apr 2008
    Messages:
    48
    Likes Received:
    0
    Reputations:
    0
    имя поставь на кнопку
    убери скрытое поле
     
    #6269 Кубик Рубик, 21 Nov 2008
    Last edited: 21 Nov 2008
  10. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    что-что - переадресовывать на другую страницу, типо "Спасибо, вы внеслися". Нафига там же оставлять?

    а вообще быдлокод, юзай лучше if(isset($submit))

    т.е. сначала форма, а потом обработка того, что ввели и строго по нажатию кнопки
     
    #6270 Pashkela, 21 Nov 2008
    Last edited: 21 Nov 2008
  11. Кубик Рубик

    Joined:
    10 Apr 2008
    Messages:
    48
    Likes Received:
    0
    Reputations:
    0
    На сколько хороша функция проверки форм?

    PHP код:
    Code:
     function insec($text) {
     $text = htmlentities(strip_tags($text));
     return $text;
    } 
    
    Как добавить сюда регулярку чтобы проходили только буквы и цифры ну и другие безопасные символы?
     
  12. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    $text = htmlspecialchars($text);

    Если сделаешь так - точно не обломаешься
     
  13. Byrger

    Byrger Elder - Старейшина

    Joined:
    7 Mar 2008
    Messages:
    521
    Likes Received:
    26
    Reputations:
    -4
    Нет не помогло, может это браузер сохраняет данные и при обновлении сного их отсылает?
    стоит Opera
    мозила также выводит но она выдаёт предупреждение что внесенны данные в форму.
    Обновить или нет?
     
  14. MuXaJIbI4

    MuXaJIbI4 Member

    Joined:
    20 Nov 2008
    Messages:
    66
    Likes Received:
    7
    Reputations:
    0
    а не проще header('Location: your_page.php'); отправить после занесения данных из формы в базу.
     
  15. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    PHP:
    <head>
    <meta http-equiv="Content-Type" content="text; charset=windows-1251">
    <title>ДОБАВИТЬ СВОЙ МЕГА-FAQ</title>
    </head>
    <form method="POST"> 
        <input type="text" name="haed" size="100" /><br /> 
        <textarea name="faq" rows="10" cols="100"></textarea> <br /> 
        <input type="text" name="note" size="100" /><br /> 
        <input type="hidden" name="addnewfaq" value="1"> 
        <input type="submit" value="Ввод" /> 
         </form>
    <?
    $haed=$_POST['haed'];
    $faq=$_POST['faq'];
    $note=$_POST['note'];
    $submit=$_POST['addnewfaq'];

    if(isset($submit))
    {
    echo "Уря";
    // тут идет твоя вставка чего надо куда надо в БАЗУ
      
    //подключаемся к MySQL  - ну тут сам напишешь процедуру подключения, лучше вывести в config.php и инклудить
    // Теперь вставляем данные
    $query="INSERT INTO FAQ_TABLE(haed, faq, note) values ('$haed', '$faq', '$note')";                        
    $submitsql=mysql_query($query) or die(mysql_error());
    //А теперь перенаправляем куда нам надо
    header("Location: http://твой_сайт/adminka.php?str=faq");
    }
     
  16. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Pashkela Ну и выбьет тебе ошибку - что заголовки уже посланы. Header - должен быть до любого вывода выполнен
     
    _________________________
  17. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    )) ну в смысле да, это меня этот чорт попутал

    там надо исправить

    <input type="submit" value="Ввод" />

    на <input type="submit" name="submit" value="Ввод" />

    исправить

    $submit=$_POST['addnewfaq'];

    на

    $submit=$_POST['submit'];

    и

    <input type="hidden" name="addnewfaq" value="1"> вообще удалить нах

    ЗЫЖ Бгг
     
  18. Byrger

    Byrger Elder - Старейшина

    Joined:
    7 Mar 2008
    Messages:
    521
    Likes Received:
    26
    Reputations:
    -4
    Он что-то на строчку header("Location: http://твой_сайт/adminka.php?
    ругается....
    Code:
    Warning: Cannot modify header information - headers already sent by (output started at Z:\home\***\www\adminka.php:3) in Z:\home\***\www\adminka.php on line 86 
     
  19. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    Pashkela Ты перед тем как постить сначала сам выучи ...

    Во 1 .... Скрипт содержит скуль
    Во 2.... header("Location: http://твой_сайт/adminka.php?str=faq"); Выведет ошиьку о том что хидеры уже отослали =\\

    PHP:
    <? 
    if(isset(
    $_POST['submit'])) 

    // тут идет твоя вставка чего надо куда надо в БАЗУ 
       
    //подключаемся к MySQL  - ну тут сам напишешь процедуру подключения, лучше вывести в config.php и инклудить 

    $haed="'".mysql_real_escape_string($_POST['haed'])."'"
    $faq="'".mysql_real_escape_string($_POST['faq'])."'"
    $note="'".mysql_real_escape_string($_POST['note'])."'"

    // Теперь вставляем данные 
    $query="INSERT INTO FAQ_TABLE SET haed=".$haed.", faq=".$faq.", note=".$note;                         
    $submitsql=mysql_query($query) or die(mysql_error()); 
    //А теперь перенаправляем куда нам надо 
    header("Location: http://твой_сайт/adminka.php?str=faq"); 

    ?>

     <head> 
    <meta http-equiv="Content-Type" content="text; charset=windows-1251"> 
    <title>ДОБАВИТЬ СВОЙ МЕГА-FAQ</title> 
    </head> 
    <form method="POST">  
        <input type="text" name="haed" size="100" /><br />  
        <textarea name="faq" rows="10" cols="100"></textarea> <br />  
        <input type="text" name="note" size="100" /><br />  
        <input type="submit" value="Ввод" name="submit" />  
         </form> 
    чтото тип того нада
     
    #6279 Doom123, 21 Nov 2008
    Last edited: 21 Nov 2008
  20. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Чего выучи, ну перепутал местами html и php

    А у тебя в каждом поле XSS:))) Сам учись так что

    ЗЫЖ Тут вообще про безопасность не спрашивали
     
Thread Status:
Not open for further replies.