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

Discussion in 'PHP' started by Kaimi, 7 May 2015.

  1. FindeR

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

    Joined:
    15 Nov 2006
    Messages:
    623
    Likes Received:
    138
    Reputations:
    20
    Грабитель, ideone.com/qIriap

    Updated: начиная с PHP 5.3.6 у saveHTML() появился аргумент, в качестве которого можно указать один из узлов страницы, содержащейся в DOMDocument.
     
    #41 FindeR, 31 Aug 2015
    Last edited: 31 Aug 2015
  2. dondy

    dondy Member

    Joined:
    5 Jun 2015
    Messages:
    560
    Likes Received:
    61
    Reputations:
    5
    хочу вывести в переменную весь результат запроса:
    PHP:
    <?php
    foreach (getallheaders() as $name => $value) {
    $zagolovki_zaprosa "$name$value\r\n<br>";
    }
    echo 
    $zagolovki_zaprosa;
    ?>
    но выводит только одну строку: Accept-Charset: UTF-8,*;q=0.5

    как вывести все строки цикла в переменную ?
     
  3. winstrool

    winstrool ~~*MasterBlind*~~

    Joined:
    6 Mar 2007
    Messages:
    1,413
    Likes Received:
    910
    Reputations:
    863
    Code:
    <?
    foreach (getallheaders() as $name => $value) {$zagolovki_zaprosa = "$name: $value\r\n<br>";
    echo $zagolovki_zaprosa;
    }?>
    
    в сам цикл и включить вывод или в самом цикле переменную использовать с точкой $zagolovki_zaprosa. = "$name: $value\r\n<br>";

    Code:
    <?
    foreach (getallheaders() as $name => $value) {$zagolovki_zaprosa. = "$name: $value\r\n<br>";
    }
    echo $zagolovki_zaprosa;
    ?>
    
     
    _________________________
    dondy likes this.
  4. FindeR

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

    Joined:
    15 Nov 2006
    Messages:
    623
    Likes Received:
    138
    Reputations:
    20
    winstrool, так не будет работать. Нужно не переменную с точкой, а присваивание с конкатенацией ( .= )
    dondy,
    PHP:
    <?php
    foreach (getallheaders() as $name => $value)
    {
       
    $zagolovki_zaprosa .= "$name$value\r\n<br>";
    }
    echo 
    $zagolovki_zaprosa;
    ?>
     
    dondy likes this.
  5. winstrool

    winstrool ~~*MasterBlind*~~

    Joined:
    6 Mar 2007
    Messages:
    1,413
    Likes Received:
    910
    Reputations:
    863
    собственно это и сказал, только пробел не убрал
     
    _________________________
    dondy likes this.
  6. dondy

    dondy Member

    Joined:
    5 Jun 2015
    Messages:
    560
    Likes Received:
    61
    Reputations:
    5
    Всем спасибо!
    а что же лучше использовать для вывода заголовков: getallheaders или apache_request_headers ?
    apache_request_headers выводит тоже самое что getallheader
     
  7. FindeR

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

    Joined:
    15 Nov 2006
    Messages:
    623
    Likes Received:
    138
    Reputations:
    20
    getallheaders - псевдоним функции apache_request_headers. Одно и то же.
     
    dondy likes this.
  8. dondy

    dondy Member

    Joined:
    5 Jun 2015
    Messages:
    560
    Likes Received:
    61
    Reputations:
    5
    Всем привет, сделал поиск по всем txt файлам, которые лежат в определённой папке,
    но он ищет не стабильно, иногда указываю конкретное слово, которое есть в тексте или словосочетание, и он не находит их совпадения, а некоторые запросы находит.
    (ищу в логах, где новая запись начинается с новой строки)
    что может быть не так в коде, помогите пожалуйста с доработкой?
    PHP:
    <html>
    <head>
    <title>Поиск совпадений в файлах txt</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <form action="" class="required-form" method="post">
    <input type="text" style="background-color: lightyellow;border: solid 1px red;font-weight: bold;" placeholder="поиск по файлам" name="search_file" value="
    <?php
    if(empty($_POST['search_file'])){
    }
    else
    {
    echo 
    $_POST['search_file'];
    };
    ?>">
    <input type="submit" style="font-weight: bold;cursor:pointer; cursor:hand;" value="Отправить" name="search">
    </form>
    <?php
    if($_POST['search']) {
    $searchthis $_POST['search_file'];
    $searchthis2 mb_convert_case($searchthisMB_CASE_LOWER'UTF-8');
    $matches = array();
    $dir './logs/';
    foreach(
    glob($dir '*.txt') as $filename) {
      
    $handle = @fopen($filename"r");
      if (
    $handle)
      {
        while (!
    feof($handle))
        {
          
    $buffer fgets($handle);
          if(
    strpos($buffer$searchthis2) !== FALSE$matches[] = $filename ': ' $buffer;
        }
        
    fclose($handle);
      }
    }
    print_r($matches);
    }
    ?>
    </html>
     
  9. mustedlife

    mustedlife New Member

    Joined:
    31 Jan 2013
    Messages:
    11
    Likes Received:
    3
    Reputations:
    0
    Хотел тебе помочь, но понял, что у тебя расплывчатая задача, поэтому тебе никто не помогает.
    Укажи конкретно, что не находит, потому что при проверке на сервере он нормально находит нужный файл и выводит его в массиве.
     
  10. dondy

    dondy Member

    Joined:
    5 Jun 2015
    Messages:
    560
    Likes Received:
    61
    Reputations:
    5
    не ищет например слово-фразу, которое явно встречается в файле, усложнил тест, загрузил txt электронную книгу: http://www.filedropper.com/lavkraftderletvedminlogwwwlitmirnet6910

    фразу Войдя внутрь или слово Войдя - не находит
    а фразу старинной керосиновой лампой - находит
     
  11. Muracha

    Muracha Member

    Joined:
    30 Jul 2011
    Messages:
    153
    Likes Received:
    10
    Reputations:
    0
    Есть скрипт. рабочий.
    Брутер md5 по словарю.
    Code:
    <?php
    
    @set_time_limit(0);
    @ignore_user_abort(1);
    
    $page='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>MD5 брутер</title>
    </head>
    <body>
    <form action="" method="POST">
     <p><strong>MD5 hash:<br />
     <br />
       </strong>
       <input name="md5" type="text" value="5af666243008e2bf781e4245cfb0e915" maxlength="32" size="40" /><br />
     <br />
     <br />
     <strong>Паролей в словаре: '.sizeof(file('password.txt')).'</strong>
     </p><p><br />
       <input value="Готово!" type="submit" /> <input value="Очистить!" type="reset" />
     </p>
    </form>
    </body></html>';
    
    function md5_bruter(){
       $password=file('password.txt');
       
       for($c=0;$c<=sizeof($password)-1;$c++){
           if($_POST['md5']==md5(trim($password[$c]))){
               return $password[$c];
           }else{
               continue;
           }
           return false;
       }
    }
    
    if(isset($_POST['md5'])===false){
       print $page;
    }else{
       if(!md5_bruter()){
           print '<html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>MD5 брутер</title>
    </head>
    <body>
    <strong>Соответствие не найдено :(</strong>
    </body></html>';
       }else{
           print '<html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>MD5 брутер</title>
    </head>
    <body>
    Зашифрованый пароль: <strong>'.md5_bruter().'</strong>
    </body></html>';
       }
    }
    
    ?>
    
    На его основе я хочу сделать консольную версию.
    Для себя. В академических целях.
    И сделал вот так:
    Code:
    <?php
    $hash = "21232f297a57a5a743894a0e4a801fc3"; // Пароль, который нужно брутить admin по умолчанию
    set_time_limit(0);
     function md5_bruter() {
      $pass = fopen("/srv/www/htdocs/pass/pass.txt","r") or die("ошибка");
      for($c=0;$c<=sizeof($pass)-1;$c++){
      if($hash==md5(trim($pass[$c]))){
      return $pass[$c];
      }else{
      continue;
      }
      return false;
      }
    }
    
    if(isset($hash)===false){
      if(!md5_bruter()){
      print "\nБрат...У нас проблема. Пароль не найден :( \n";
      }else{
      echo "Зашифрованый пароль: <strong>'.md5_bruter().'</strong>";
      }
    }
    ?>
    


    Скрипт я разобрал полностью. Убрал html, выделил классы.
    Глобальные переменные "$_POST['md5']" заменил на "$hash".

    Но при выполнении у меня ничего не выводит. Совсем ничего.
    Ни ошибок, ни результата.
    Возможно, ошибся в указании переменной. Возможно в чем-то еще.
    Но в чем?
     
  12. hesher

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

    Joined:
    23 Aug 2005
    Messages:
    74
    Likes Received:
    108
    Reputations:
    4
    Видимо, потому, что поисковую строку ты приводишь к нижнему регистру
    ( $searchthis2 = mb_convert_case($searchthis, MB_CASE_LOWER, 'UTF-8'); )

    А дальше в каждой строке текста ищешь строгое совпадение.

    Соответственно, удаляем строку:
    $searchthis2 = mb_convert_case($searchthis, MB_CASE_LOWER, 'UTF-8');
    и

    if(strpos($buffer, $searchthis2) !== FALSE) $matches[] = $filename . ': ' . $buffer;
    заменяем на:
    if(mb_stripos($buffer, $searchthis, 0, 'UTF-8') !== FALSE) $matches[] = $filename . ': ' . $buffer;
     
    dondy likes this.
  13. hesher

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

    Joined:
    23 Aug 2005
    Messages:
    74
    Likes Received:
    108
    Reputations:
    4
    Muracha
    Code:
    <?php
    $hash = "21232f297a57a5a743894a0e4a801fc3"; // Пароль, который нужно брутить admin по умолчанию
    set_time_limit(0);
    function md5_bruter($hash) {
      $pass = file("pass.txt") or die("ошибка");
      for ($c = 0; $c <= sizeof($pass) - 1; $c++) {
      if ($hash == md5(trim($pass[$c])))  return $pass[$c];
      }
      return "НЕ НАЙДЕН";
    }
    
    if (isset($hash)) {
      echo "Зашифрованый пароль: <strong>".md5_bruter($hash)."</strong>";
    }
    
     
    #53 hesher, 11 Sep 2015
    Last edited: 11 Sep 2015
    dondy and Muracha like this.
  14. Muracha

    Muracha Member

    Joined:
    30 Jul 2011
    Messages:
    153
    Likes Received:
    10
    Reputations:
    0
    Продолжая донимать брутер...
    С выперечисленным мне понятно. В класс нужно было указать $hash.
    Мелочь, а решить это для меня было трудно.
    Теперь встал вопрос.
    А что если видоизменить скрипт, когда он будет брать файл не из pass.txt, а из каталога файлов, где будут всякие значения но в текстовом формате:
    file.txt, zdesbilya.txt, e233ewdsd.txt?

    Логично, что нужно брать фунцию glob().
    Спарсить каталог и просканировать его на txt файл, где взять каждую строку из файла и хешировать.
    Если в 1 файле не совпадает, берется другой и так до конца...
    Мне понятна логика, но я чисто технически путаюсь.
    Накидал следующее , нерабочее.
    Как заставить его обходить файлы?
    Code:
    <?php
    
    
    $hash = "21232f297a57a5a743894a0e4a801fc3"; // Пароль, который нужно брутить admin по умолчанию
    $dir = "/srv/htdocs/www/pass/";
    set_time_limit(0);
    function md5_bruter($hash) {
    foreach (glob("*.txt") as $filename) {
       
      if (is_dir($dir)) {
      if ($dh = opendir($dir)) {
      while (($file = readdir($dh)) !== false) {
          $text = fread( $f , filesize( $f ) );
    
          close($f);
      }
      closedir($dh);
      }
    }
      for ($c = 0; $c <= sizeof($pass) - 1; $c++) {
      if ($hash == md5(trim($pass[$c])))  return $pass[$c];
      }
      return "НЕ НАЙДЕН";
    }
    
    if (isset($hash)) {
      echo "Зашифрованый пароль: <strong>".md5_bruter($hash)."</strong>";
    }
    }
    ?>
    
     
  15. hesher

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

    Joined:
    23 Aug 2005
    Messages:
    74
    Likes Received:
    108
    Reputations:
    4
    Если нужно только в папке $dir, то:
    PHP:
    <?php
    set_time_limit
    (0);
    $hash "21232f297a57a5a743894a0e4a801fc3";// Пароль, который нужно брутить admin по умолчанию
    $dir "logs/";
    echo 
    "Зашифрованый пароль: <strong>" md5_bruter($hash$dir) . "</strong>";

    function 
    md5_bruter($hash$dir) {
        foreach (
    glob($dir "*.txt") as $current_file) {
            
    $pass = (filesize($current_file)>0)?file($current_file):array();
            for (
    $c 0$c <= sizeof($pass) - 1$c++)
                if (
    $hash == md5(trim($pass[$c]))) return $pass[$c]. " в файле $current_file";  
        }
        return 
    "НЕ НАЙДЕН";
    }
    Если также и во всех подпапках нужно искать, то можно вместо glob использовать glob_recurcive:
    PHP:
    <?php
    set_time_limit
    (0);
    $hash "21232f297a57a5a743894a0e4a801fc3";// Пароль, который нужно брутить admin по умолчанию
    $dir "logs/";
    echo 
    "Зашифрованый пароль: <strong>" md5_bruter($hash$dir) . "</strong>";

    function 
    md5_bruter($hash$dir) {
        foreach (
    glob_recursive($dir "*.txt") as $current_file) {
            
    $pass = (filesize($current_file)>0)?file($current_file):array();
            for (
    $c 0$c <= sizeof($pass) - 1$c++)
                if (
    $hash == md5(trim($pass[$c]))) return $pass[$c]. " в файле $current_file";  
        }
        return 
    "НЕ НАЙДЕН";
    }

    function 
    glob_recursive($pattern$flags 0) {
        
    $files glob($pattern$flags);
        foreach (
    glob(dirname($pattern) . '/*'GLOB_ONLYDIR GLOB_NOSORT) as $dir)
            
    $files array_merge($filesglob_recursive($dir '/' basename($pattern), $flags));
        return 
    $files;
    }
     
    #55 hesher, 12 Sep 2015
    Last edited: 12 Sep 2015
    dondy and Muracha like this.
  16. dondy

    dondy Member

    Joined:
    5 Jun 2015
    Messages:
    560
    Likes Received:
    61
    Reputations:
    5
    всем привет, переделывал один код для календаря на php, но сделать выделение текущего дня в таблице не смог, помогите пожалуйста выделить текущий день в ячейке календаря
    код календаря:
    PHP:
    <style>
    /* календарь */
    table.calendar    { border-left:1px solid #999; }
    tr.calendar-row  {  }
    td.calendar-day  { min-height:80px; font-size:11px; position:relative; } * html div.calendar-day { height:80px; }
    td.calendar-day:hover  { background:#eceff5; }
    td.calendar-day-np  { background:#eee; min-height:80px; } * html div.calendar-day-np { height:80px; }
    td.calendar-day-head { background:#ccc; font-weight:bold; text-align:center; width:120px; padding:5px; border-bottom:1px solid #999; border-top:1px solid #999; border-right:1px solid #999; }
    div.day-number    { background:#999; padding:5px; color:#fff; font-weight:bold; float:right; margin:-5px -5px 0 0; width:20px; text-align:center; }
    td.calendar-day, td.calendar-day-np { width:120px; padding:5px; border-bottom:1px solid #999; border-right:1px solid #999; }
    </style>
    <?php
    /* Функция генерации календаря */
    function draw_calendar($month,$year){
      
    /* Начало таблицы */
      
    $calendar '<table cellpadding="0" cellspacing="0" class="calendar">';
      
    /* Заглавия в таблице */
      
    $headings = array('Понедельник','Вторник','Среда','Четверг','Пятница','Субота','Воскресенье');
      
    $calendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$headings).'</td></tr>';
      
    /* необходимые переменные дней и недель... */
      
    $running_day date('w',mktime(0,0,0,$month,1,$year));
      
    $running_day $running_day 1;
      
    $days_in_month date('t',mktime(0,0,0,$month,1,$year));
      
    $days_in_this_week 1;
      
    $day_counter 0;
      
    $dates_array = array();
      
    /* первая строка календаря */
      
    $calendar.= '<tr class="calendar-row">';
      
    /* вывод пустых ячеек в сетке календаря */
      
    for($x 0$x $running_day$x++):
        
    $calendar.= '<td class="calendar-day-np"> </td>';
        
    $days_in_this_week++;
      endfor;
      
    /* дошли до чисел, будем их писать в первую строку */
      
    for($list_day 1$list_day <= $days_in_month$list_day++):
        
    $calendar.= '<td class="calendar-day">';
          
    /* Пишем номер в ячейку */
          
    $calendar.= '<div class="day-number">'.$list_day.'</div>';
          
    /** ЗДЕСЬ МОЖНО СДЕЛАТЬ MySQL ЗАПРОС К БАЗЕ ДАННЫХ! ЕСЛИ НАЙДЕНО СОВПАДЕНИЕ ДАТЫ СОБЫТИЯ С ТЕКУЩЕЙ - ВЫВОДИМ! **/
          
    $calendar.= str_repeat('<p> </p>',2);
         
        
    $calendar.= '</td>';
        if(
    $running_day == 6):
          
    $calendar.= '</tr>';
          if((
    $day_counter+1) != $days_in_month):
            
    $calendar.= '<tr class="calendar-row">';
          endif;
          
    $running_day = -1;
          
    $days_in_this_week 0;
        endif;
        
    $days_in_this_week++; $running_day++; $day_counter++;
      endfor;
      
    /* Выводим пустые ячейки в конце последней недели */
      
    if($days_in_this_week 8):
        for(
    $x 1$x <= ($days_in_this_week); $x++):
          
    $calendar.= '<td class="calendar-day-np"> </td>';
        endfor;
      endif;
      
    /* Закрываем последнюю строку */
      
    $calendar.= '</tr>';
      
    /* Закрываем таблицу */
      
    $calendar.= '</table>';
     
      
    /* Все сделано, возвращаем результат */
      
    return $calendar;
    }
    /* СПОСОБ ПРИМЕНЕНИЯ */
    //месяцы и недели на русском
    function rdate($param$time=0) {
    if(
    intval($time)==0)$time=time();
    $MN=array('Января''Февраля''Марта''Апреля''Мая''Июня''Июля''Августа''Сентября''Октября''Ноября''Декабря');
    $MonthNames[]=$MN[date('n',$time)-1];
    $MN=array('Воскресенье','Понедельник''Вторник''Среда''Четверг''Пятница''Суббота''');
    $MonthNames[]=$MN[date('w',$time)];
    $arr[]='M';
    $arr[]='N';
    if(
    strpos($param,'M')===false) return date($param$time); else return date(str_replace($arr,$MonthNames,$param), $time);
    }
    //месяцы и недели на русском
    $mesjac date('n');
    $god date('Y');
    echo 
    '<h2 style="text-align:center; font-family: Monotype Corsiva; font-size: 19px; color: #1E90FF; text-shadow: #828282 3px 2px 3px;"">Сегодня '.rdate('j M Y года. N. H:i').'</h2>';
    echo 
    draw_calendar($mesjac,$god);
    ?>
     
  17. hesher

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

    Joined:
    23 Aug 2005
    Messages:
    74
    Likes Received:
    108
    Reputations:
    4
    date('d') генерирует текущее число. А в календаре число пробегается по переменной $list_day, соответственно, когда они совпадают - меняем цвет ячейки.

    Если нужно "всю ячейку с цифрой выделить", то строчку:
    $calendar.= '<div class="day-number">'.$list_day.'</div>';
    Замени на
    PHP:
    if ($list_day==date('d')) $calendar.= '<td class="calendar-day" style="background-color:#6B90D4">';
    else 
    $calendar.= '<td class="calendar-day">';
    А если только маленькую ячейку, то строчку:
    $calendar.= '<div class="day-number">'.$list_day.'</div>';
    Замени на:
    PHP:
    if ($list_day==date('d')) $calendar.= '<div class="day-number" style="background-color:#6B90D4">' $list_day '</div>';
    else 
    $calendar.= '<div class="day-number">' $list_day '</div>';
    P.s. Плюс date('d') имеет смысл заранее куда-то в переменную занести и потом уже с этой переменной сравнивать, чтобы лишний раз функцию не вызывать.
     
    dondy likes this.
  18. InfectedM

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

    Joined:
    4 Nov 2007
    Messages:
    155
    Likes Received:
    12
    Reputations:
    0
    На весь код можно не смотреть, самое главное это return и break
    Не могу понять почему не работает return во 2-ом скрипте.
    Возвращает всегда не правильный результат.подскажите плиз.
    как правильно вернуть результат из цикла?

    Так работает:
    PHP:
    function check_spider_bot($u_a){
    ....
        foreach (
    $spider_bots as $items) { 
        
    $pos strpos($u_a$items);

                if (
    $pos) {
                    
    $result true;
                    break;
                }  else {
                    
    $result false;
                };
        }

    return 
    $result;
    }
    Так не работает
    PHP:
    function check_spider_bot($u_a){
    ....
        foreach (
    $spider_bots as $items) { 
        
    $pos strpos($u_a$items);

                if (
    $pos) {
                    return 
    true;
                    break;
                }  else {
                    return 
    false;
                };
        }


    }
    Просто не хочу использовать дополнительную переменную $result, можно ли как то напрямую из цикла вернуть результат ?
     
    #58 InfectedM, 24 Sep 2015
    Last edited: 24 Sep 2015
  19. Fepsis

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

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    Убери из второго варианта блок else {...} - он у тебя всегда возвращает результат обработки первого элемента массива $spider_bots.
     
    InfectedM likes this.
  20. --=[Bob]=--

    --=[Bob]=-- New Member

    Joined:
    8 Mar 2011
    Messages:
    39
    Likes Received:
    3
    Reputations:
    1
    Можно ли использовать foreach внутри foreach?

    К примеру, с помощью одного foreach() из бд `vii_page` есть таблица, в которой насчитывается насчитываются 4 строки c информацией.
    Эта информация оформляется и выгружается в блок, оформление которого описывается в page.tpl


    Нужно, чтобы в каждом этом блоке, с помощью второго foreach() насчитывалось еще информация из таблицы `vii_photos', где есть, к примеру 10 строк, информация которая тоже оформляется в photo.tpl


    В конечном итоге, информация выведенная из второго foreach() выводилась в photo.tpl, которая потом, с информацией из первого foreach() оформлялась в конечный page.tpl.


    Можно ли это, используя foreach внутри foreach? Или это можно как-то по другому реализовать без нагрузки на mysql.



    Например:

    При открытие страницы было вынесено 4 блока из базы данных 'vii_blocks' с параметром WHERE type='photo'.

    В каждом вынесеном блоке была инормация из бд 'vii_photos'.

    В одном блоке 'vii_photos'. album_id = '1'; (4 результата)

    Во втором блоке 'vii_photos'.album_id = '3'; (2 результата)

    В третьем блоке 'vii_photos'.album_id = '4'; (3 результата)

    В четвертом блоке 'vii_photos'.album_id = '11';(5 результатов)


    Каждый результат оформлялся в шаблоный блок.



    В итоге на странице из бд выведено 4 блока. В первом блоке еще !4 блока! с выведеной информацией, во втором 2 , и т.д.