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

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

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

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

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    spamoney, проблема в file_get_contents, она посылает кривой запрос... Скорее всего не посылает заголовок Host. Лучше тяни через сокеты...
     
  2. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    spamoney
    Ошибка в том, что этот скрипт пытается получить страницу, а получает ошибку 403 (доступ запрещён), это чаще всего бывает из-за robots.txt (http://anekdotov.net/robots.txt) он блочит если вы заходите без браузера как видно. Поэтому здесь вряд ли получится сделать без сокетов.
    Чушь. Так можно, но здесь нужны сокеты.
     
    1 person likes this.
  3. MegaDeth

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

    Joined:
    8 Nov 2006
    Messages:
    192
    Likes Received:
    72
    Reputations:
    13
    я имел ввиду в конкретном этом случае, что еще сказать челу который про ошибку протокола хттп "403 доступ запрещен" не знает? (ну или невидет...)
     
  4. XIII

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

    Joined:
    6 Feb 2006
    Messages:
    109
    Likes Received:
    17
    Reputations:
    -1
    скрипт добавления в mysql базу

    <?php
    $login = $_POST['login'];
    $email = $_POST['email'];
    $pass = $_POST['pass'];


    $link = mysql_connect("localhost", "root", "*****") or
    die("Could not connect: " . mysql_error());


    mysql_select_db("nova");

    $query = DBQuery("SELECT * FROM admin WHERE email = '$email'");
    if (mysql_num_rows($query))
    die("Такой пользователь уже существует");


    DBQuery("insert into admin (username, passwd, email) values('$login','$pass','$email')");


    mysql_close($link);
    ?>
    php ругается на выделеную строку а вот почему незнаю =(
     
  5. Helios

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

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    в php нет функции DBQuery(), есть mysql_query(), а DBQuery() ты скорее всего взял из какого-нибудь движка, где она и была определена.
     
    1 person likes this.
  6. XIII

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

    Joined:
    6 Feb 2006
    Messages:
    109
    Likes Received:
    17
    Reputations:
    -1
    спасибо
     
  7. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    вобщем если DBQuery() у тебя определена, то пользуй так :
    Code:
    $query = DBQuery("SELECT * FROM admin WHERE email = '".$email."'");
    аналогично и с mysql_query()

    ЗЫ это же у тебя все равно не конечный вариант скрипта, да? (надеюсь)
     
    #647 Scipio, 20 Oct 2007
    Last edited: 20 Oct 2007
    1 person likes this.
  8. spamoney

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

    Joined:
    26 Dec 2006
    Messages:
    120
    Likes Received:
    7
    Reputations:
    1
    Всем спасибо, что сказали про сокеты, а то я в php как то не очень по этому сам бы не догнал, сделал через сокеты, вроде получилось, правда там наверное много лишннего кода, т.к фук-цию function httpSocketConnection нашел в полезных скриптах:

    PHP:
    <?php

    function httpSocketConnection($host$method$path$data
       { 
           
    $method strtoupper($method);        
           
           if (
    $method == "GET"
           { 
               
    $path.= '?'.$data
           }    
           
           
    $filePointer = @fsockopen($host80$errorNumber$errorString); 
           
           if (!
    $filePointer
           { 
               exit(
    'Failed opening http socket connection: '.$errorString.' ('.$errorNumber.')<br/>\n'); 
               return 
    false
           } 

           
    $requestHeader $method." ".$path."  HTTP/1.1\r\n"
           
    $requestHeader.= "Host: ".$host."\r\n"
           
    $requestHeader.= "User-Agent:      Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0\r\n"
           
    $requestHeader.= "Content-Type: application/x-www-form-urlencoded\r\n"

           if (
    $method == "POST"
           { 
               
    $requestHeader.= "Content-Length: ".strlen($data)."\r\n"
           } 
           
           
    $requestHeader.= "Connection: close\r\n\r\n"
           
           if (
    $method == "POST"
           { 
               
    $requestHeader.= $data
           }            

           
    fwrite($filePointer$requestHeader); 
           
           
    $responseHeader ''
           
    $responseContent ''

           do 
           { 
               
    $responseHeader.= fread($filePointer1); 
           } 
           while (!
    preg_match('/\\r\\n\\r\\n$/'$responseHeader)); 
           
           
           if (!
    strstr($responseHeader"Transfer-Encoding: chunked")) 
           { 
               while (!
    feof($filePointer)) 
               { 
                   
    $responseContent.= fgets($filePointer128); 
               } 
           } 
           else 
           { 

               while (
    $chunk_length hexdec(fgets($filePointer))) 
               { 
                   
    $responseContentChunk ''
               
                   
    //logEventToTextFile('debug', $chunk_length); 
                   
    $read_length 0
                   
                   while (
    $read_length $chunk_length
                   { 
                       
    $responseContentChunk .= fread($filePointer$chunk_length $read_length); 
                       
    $read_length strlen($responseContentChunk); 
                   } 

                   
    $responseContent.= $responseContentChunk
                   
                   
    fgets($filePointer); 
                   
               } 
               
           } 

           
    //logEventToTextFile('debug', $responseContent); 
           
           
           
    return chop($responseContent); 
       } 

    $bb=0;
     for(
    $f=0;$f<3;$f++){  


    $data=""
    $host "anekdotov.net"
    $path "http://anekdotov.net/vovochka/index-page-$f.html"
    $method "GET"


    $a=httpSocketConnection($host$method$path$data);

     
    $file preg_match_all("#<input type=hidden name=story value='(.*?)<INPUT type=image src=#si",$a,$frazes);  


     for(
    $i=0;$i<$file;$i++){  
         echo 
    "<hr>".$frazes[1][$i]."\r\n<hr>";  
      }  
    $bb++;
    }
    $vsego=$bb*$file;
    echo 
    "Анекдотов на странице: <font color=red>$file</font><br>";
    echo 
    "Всего Анекдотов: <font color=green>$vsego</font>";

    ?>
     
  9. XIII

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

    Joined:
    6 Feb 2006
    Messages:
    109
    Likes Received:
    17
    Reputations:
    -1
    между проверкой на совпадение в базе и добавлением в базу надо чтото ещё написать? просто если даже находит совпадение оно всё равно дальше лезет добавлять в базу и пишит успешно зарегистрирован =) чтото не пойму в чём ошибка
     
  10. XIII

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

    Joined:
    6 Feb 2006
    Messages:
    109
    Likes Received:
    17
    Reputations:
    -1
    уже разобрался всем спасибо
    сделал чтота типа вот работает =)
     
  11. groundhog

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

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    XIII, ты коряво сделал... Нужно так:

     
    1 person likes this.
  12. Impuls*

    Impuls* Elder - Старейшина

    Joined:
    3 Oct 2007
    Messages:
    75
    Likes Received:
    6
    Reputations:
    -1
    Обратите внимание! :)

    Помогите пожалуйста!

    Вот хочу сделать так, чтобы на моем сайте не флудили, не спамили не нужной фигней :)
    А именно:
    Вот когда пользователь добавляет комментарий, то ту переменную, допустим строка комментария - $text, обыскивали. Я это реализовал через strstr() .

    PHP:
    $www=strstr($text"http://");
    if (
    $www=='http://'){
    echo 
    "
    Реклама запрещена!"
    ;
    exit;}
    Но проблема заключается в том, что будут же вводить не "http://", а там "http://mysite.ru" и это уже обходит скрипт, как мне это подредактировать под все случаи?Как можно сделать так что, если в строке $text php-сценарий находит фрагмент "http://", то независимо от того что идет дальше или шло раньше делает то-то? :)

    P.S. если есть более рациональный способ анти-спама, то сообщите пожалуйста.
    Заранее спасибо!
     
    #652 Impuls*, 20 Oct 2007
    Last edited: 20 Oct 2007
  13. Helios

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

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    PHP:
    if (preg_match('/http:\/\//'$text))
    {
        
    //... что-то делаем
    }
     
    1 person likes this.
  14. Ch3ck

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

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,192
    Reputations:
    430
    стр реплэйс
     
  15. lsass.exe

    lsass.exe Elder - Старейшина

    Joined:
    5 Aug 2007
    Messages:
    156
    Likes Received:
    161
    Reputations:
    24
    как уже сказал Dr.Check юзай
    $www=str_replace("http://","",$text);
    например
    переменные сам поменяешь, ну и на что заменять тоже
     
    2 people like this.
  16. Impuls*

    Impuls* Elder - Старейшина

    Joined:
    3 Oct 2007
    Messages:
    75
    Likes Received:
    6
    Reputations:
    -1
    Спасибо всем за помощь, но я решил сделать через preg_match()
    ИМХО так удобнее на мой взгляд. :)
    Еще вопрос в связи с этим...
    Вот я решил все слова забить в массив, но сценарий почему-то неправильно обрабатывается, пишет ошибку - preg_match() expects parameter 1 to be string
    Пробывал я сам решить проблему, но не понял... :-D

    PHP:
    $_words=array('http://''.ru''.com''.mobi''.info''.org');
    if (
    preg_match($_words$text)){
    // делаем то-то :)
    exit;}
    Подскажите, что тут не правильно) надо значения из массива как-то по-другому выводить что ли?Заранее спасибо.
     
  17. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    preg_match($_words[n], $text) где n номер елемента массива. Возможно тебе нужен цикл.

    Как то так
    for ($n=1, $n>count($_words), $n++) if preg_match($_words[n], $text)......

    Нужно все это только по одной причине у preg_match первым параметром идет строка, а ты ставишь массив.
     
    #657 Red_Red1, 21 Oct 2007
    Last edited: 21 Oct 2007
  18. Impuls*

    Impuls* Elder - Старейшина

    Joined:
    3 Oct 2007
    Messages:
    75
    Likes Received:
    6
    Reputations:
    -1
    Оо. А без цикла что ли никак??
     
  19. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Можно и без цикла, почитай про оператор альтернативы в регулярных выражениях.
    Должно быть примерно так
    $_words='^http://|\.ru$|\.com$|\.mobi$|\.info$|\.org$'
    if (preg_match($_words, $text))....
     
  20. Impuls*

    Impuls* Elder - Старейшина

    Joined:
    3 Oct 2007
    Messages:
    75
    Likes Received:
    6
    Reputations:
    -1
    Нет, что-то не так... не работает.
    А как же массив? :)
     
Thread Status:
Not open for further replies.