За последние 24 часа нас посетили 17678 программистов и 1723 робота. Сейчас ищут 910 программистов ...

выбрать Все

Тема в разделе "PHP для новичков", создана пользователем Andrey5555, 9 фев 2008.

  1. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Есть код
    Код
    Код (Text):
    1.  
    2. <?php
    3. include ("mysql.php");
    4. if (isset($_GET['search']))
    5. $search = $_GET['search'];
    6. $s_section = $_GET ['section'];
    7. $s_type = $_GET ['type'];
    8. if ($s_section != 1111)
    9. $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section = '$s_section' and type = '$s_type' and text LIKE '%$search%'");
    10. else
    11. $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE type = '$s_type' and text LIKE '%$search%'");
    12. if ($s_type != 1111)
    13. $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section = '$s_section' and type = '$s_type' and text LIKE '%$search%'");
    14. else
    15. $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section='$section' and text LIKE '%$search%'");
    16. $allnum = mysql_num_rows ($query1);
    17. if(!isset($_GET['page']))
    18. $page = 1;
    19. else
    20. $page = ($_GET['page']);
    21. $on_page = 10;
    22. $begin = ($page - 1) * $on_page;
    23. $num_pages = ceil ($allnum / $on_page);
    24. if ($s_section != 1111)
    25. $query = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section = '$s_section' and type = '$s_type' and text LIKE '%$search%' LIMIT $begin, $on_page");
    26. else
    27. $query = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE type = '$s_type' and text LIKE '%$search%' LIMIT $begin, $on_page");
    28. if ($s_type != 1111)
    29. $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section = '$s_section' and type = '$s_type' and text LIKE '%$search%'");
    30. else
    31. $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section='$section' and text LIKE '%$search%'");
    32.      while (list ($section, $type, $text, $name, $email, $date) = mysql_fetch_array ($query))
    33.      {
    34.      echo "<table width='300' border ='1' >";
    35.      echo "<tr>";
    36.      echo "<td width='150'>$type</td><td><div align='right'>$date</div></td>";
    37.      echo "</tr>";
    38.      echo "</table>";
    39.      echo "<table width='300' border ='1'>";
    40.      echo "<tr>";
    41.      echo "<td>$text</td>";
    42.      echo "</tr>";
    43.      echo "</table>";
    44.      echo "<table width='300' border ='1'>";
    45.      echo "<tr>";
    46.      echo "<td width='150'>$name</td><td><div align='right'><a href='mailto:$email'>$email</div></td>";
    47.      echo "</tr>";
    48.      echo "</table>";
    49.      echo "<br>";
    50.      }
    51. for($i=0;$i<$num_pages;$i++)
    52. {
    53. $pages = $i+1;
    54. echo "<a href=?page=$pages&section=$s_section&type=$s_type&search=".urlencode($search).">$pages</a> ";
    55. }
    56. ?>
    Но он не работает. Должны выбираються Все категории и\или типы. Но этого не происходит. В чем моя ошибка? И как ее исправить? Заранее спасибо.
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    -Чего ж вы сами не следуете своему кредо? Каждый день по нескольку тем создаете.
    Я понимаю, что всегда есть соблазн не париться и задать на форуме вопрос, на который ответят. И у меня когда-то такое было. Года три назад...
    -Попробуйте сами решать свои задачи. Если уже ушел день/два/три и результата никакого - тогда пишите на форум, четко объяснив, что и как, сказав, какие вариант перепробовали.
    -Для РНР есть специальный тег, который подсвечивает синтаксис.
    -Ошибки какие-нибудь код выдает? error_reporting(E_ALL) в начало файла вставьте.
    -
    PHP:
    1. <?php
    2. if (isset($_GET['search']))
    3. $search = $_GET['search'];
    4. $s_section = $_GET ['section'];
    5. $s_type = $_GET ['type'];
    6. if ($s_section != 1111)
    7. $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section = '$s_section' and type = '$s_type' and text LIKE '%$search%'");
    8. else
    9. ?>
    Лучше пользуйтесь фигурными скобками и табуляцией, чтобы разделять большие блоки. Иначе в коде самому запутаться легко.
    -
    Код (Text):
    1. echo "<td>$text</td>";
    2.      echo "</tr>";
    3.      echo "</table>";
    4.      echo "<table width='300' border ='1'>";
    5.      echo "<tr>";
    Отвратительно. Во-первых, зачем столько раз вызывать эхо, во-вторых, ошибочно убеждение, что в php каждая строка -новая команда.
    -Ваш код потенциально опасен. Не фильтруются параметры, принимаемые от пользователя и отправляемые в бд.
    -
    А теперь посмотрите, как называется переменная, которая является результатом запроса в базу, и сравните с той, что вы разбираете на массив.

    Прекратите уже, в конце концов. Читайте мануалы, прежде чем браться за работу.
    Зачем лезть в работу с бд, не поняв принципа и основ?
     
  3. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Я не могу разобраться с этим вопросом уже достаточно долго, около 2 недель. Если выбирать только все категории или все типы, то код работает. А если вместе, то нет.
    Где необходимо фильтровать данные?

    Буду вам очень благодарен, если вы мне поможете навести бардак в голове и в скрипте.
     
  4. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Правило номер один:
    а) Если что-то куда-то пишеться не так, как надо/хотелось бы - проверь, что именно ты записываешь. Например, выводя на экран переменную перед записью. В этом тебе поможет var_dump.
    б) Если что-то не так селектица - проверь, что именно ты селектишь - выведи ПОЛНЫЙ свой селект на экран и внимательно его рассмотри. Здесь тебе поможет echo. Только имей в виду, что есть такая противная вещь, как пробелы вначале либо в конце. Поэтому я обычно пишу так: echo """.$переменная."""; либо так: echo "[".$переменная."]";

    Правило номер два:
    Пиши как можно меньше кода. Оптимизируй его. До упора. Чем меньше кода, тем меньше мест, где можно сделать ошибки.
    Например, вот этот кусок:
    можно и нужно написать так:

    Код (Text):
    1. $query1="SELECT section, type, text, name, email, date FROM announcements WHERE ";
    2. if ($s_section != 1111)
    3. $query1 .= "section = '$s_section' and type = '$s_type' and text LIKE '%$search%'");
    4. else
    5. $query1 .= "type = '$s_type' and text LIKE '%$search%'");
    6. if ($s_type != 1111)
    7. $query1 .= "section = '$s_section' and type = '$s_type' and text LIKE '%$search%'");
    8. else
    9. $query1 .= "section='$section' and text LIKE '%$search%'");
    10.  
    11. echo "[".$query1."]<br>"
    12. mysql_query ($query1);
    а вот этот кусок:

    написать так:

    PHP:
    1.      <?while (list ($section, $type, $text, $name, $email, $date) = mysql_fetch_array ($query))
    2.      {  ?>
    3.      <table width="300" border ="1" >
    4.      <tr>
    5.      <td width="150"><?=$type;?></td><td><div align="right"><?=$date;?></div></td>
    6.      </tr>
    7.      </table>
    8.      <table width="300" border ="1">
    9.      <tr>
    10.      <td><?=$text;?></td>
    11.      </tr>
    12.      </table>
    13.      <table width="300" border ="1">
    14.      <tr>
    15.      <td width="150"><?=$name;?></td><td><div align="right"><a href="mailto:$email"><?=$email;?></div></td>
    16.      </tr>
    17.      </table>
    18.      <br>
    19. <? }
    Правило номер три:
    Внимательно читай подписи всех стариков на этом форуме. В них очень много нужного.
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ага.
    =)
     
  6. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    издевайся - издевайся! Не всё коту масленница - будет и на нашей улице публичный дом.
     
  7. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    у меня правильная подпись 8)
     
  8. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    можно и нужно написать так:

    Код (Text):
    1. $query1="SELECT section, type, text, name, email, date FROM announcements WHERE ";
    2. if ($s_section != 1111)
    3. $query1 .= "section = '$s_section' and type = '$s_type' and text LIKE '%$search%'");
    4. else
    5. $query1 .= "type = '$s_type' and text LIKE '%$search%'");
    6. if ($s_type != 1111)
    7. $query1 .= "section = '$s_section' and type = '$s_type' and text LIKE '%$search%'");
    8. else
    9. $query1 .= "section='$section' and text LIKE '%$search%'");
    10.  
    11. echo "[".$query1."]<br>"
    12. mysql_query ($query1);
    Тут непойму зачем .=


    написать так:

    PHP:
    1.      <?while (list ($section, $type, $text, $name, $email, $date) = mysql_fetch_array ($query))
    2.      {  ?>
    3.      <table width="300" border ="1" >
    4.      <tr>
    5.      <td width="150"><?=$type;?></td><td><div align="right"><?=$date;?></div></td>
    6.      </tr>
    7.      </table>
    8.      <table width="300" border ="1">
    9.      <tr>
    10.      <td><?=$text;?></td>
    11.      </tr>
    12.      </table>
    13.      <table width="300" border ="1">
    14.      <tr>
    15.      <td width="150"><?=$name;?></td><td><div align="right"><a href="mailto:$email"><?=$email;?></div></td>
    16.      </tr>
    17.      </table>
    18.      <br>
    19. <? }
    А здесь <?=

    Обьясните пожалуйста. А на подписи я обращаю внимание, только они иногда не в тему
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Andrey5555
    Купите хорошую книгу по PHP 5 (Желательно для профессионалов, а не для новичков).
    Чтобы сэкономить место (имеется в виду и размер скрипта (кб) и текст скрипта (ведь когда много одинакового, то сложно ориентироваться)), необходимо как можно меньше писать одинаковых участков.
    На вашем примере:
    Если запрос идет в одну и ту же базу, то не проще ли написать его один раз? Но в зависимости от условий (которые задаются пользователем), дополнять запрос.
    То есть -
    $query = 'SELECT * FROM `table1`'; //Пишем тело общего запроса
    if ($_GET["searchwhere"] == "cars") // если пользователем заданы параметры поиска в столбце машины
    $query .= ' WHERE `cars`="%'.$searchtxt.'"'; // то добавляем дополнительные параметры поиска. знак ".=" означает присоединение с присвоением, то есть, его расшифровка это $var = $var.$var2 (переменная $var2 присоединяется к переменной $var). Допустим $var = "папа", а $var2 = "мама", то результат действия будет "папамама"


    Ваш код опасен тем, что приходящие данные от пользователя, не проверяются. То есть любой человек может произвольно изменить строку запроса и запустить произвольную команду в базу. Чревато это тем, что у вас могут украсть пароль от админпанели, поменять любые данные, удалить базу.
    Ищите фразу mysql injections.
    Имейте привычку проверять любые данные от пользователя.

    Это сокращенная версия <? echo $var; ?>. Но она не на всех хостингах поддерживается.

    Начните с основ, разберите синтаксис, типы переменных, массивы, отладка скрипта, файловая система, куки, сесии, а потом уже базы данных. Все нужно со временем постигать. Не пытайтесь написать хорошую систему в первые месяцы изучения php.
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Она везде поддерживается. Вот что оно не всегда по умолчанию включено, это да.
     
  11. Anonymous

    Anonymous Guest

    В рекурсию поверг мозг ты мой фразой этой.
    Так "по умолчанию", или "не всегда"? :)
     
  12. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Когда ты выводишь html через echo - тебе надо соблюдать кучу условий. Например, надо экранировать кавычки. Ища ошибку, ты можешь просто тупо пропустить какую-то кавычку и долго думать, почему ругается php.
    Есть ещё мелочи.
    А когда пишешь так, как я тебе показал - ты пишешь чистый html, который спокойно разбирается взглядом. Заметить ошибку гораздо проще. В том числе - ошибку в вёрстке.
    Есть ещё один способ: <<<
    В данном случае это будет выглядеть так:
    Код (Text):
    1. <?while (list ($section, $type, $text, $name, $email, $date) = mysql_fetch_array ($query))
    2.      {  <<<EOT
    3.      <table width="300" border ="1" >
    4.      <tr>
    5.      <td width="150">$type</td><td><div align="right">$date</div></td>
    6.      </tr>
    7.      </table>
    8.      <table width="300" border ="1">
    9.      <tr>
    10.      <td>$text</td>
    11.      </tr>
    12.      </table>
    13.      <table width="300" border ="1">
    14.      <tr>
    15.      <td width="150">$name</td><td><div align="right"><a href="mailto:$email">$email</div></td>
    16.      </tr>
    17.      </table>
    18.      <br>
    19. EOT;
    20.  }
     
  13. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    По дефолту включена опция, но хостеры, бывает отключают. Разве это не равноценно фразе "Но она не на всех хостингах поддерживается." ? =)

    Только не надо впаривать ему про хередоки. Человека только запутаете. И экранировать не обязательно, когда кавычки ' '. Но тут свои тонкости - не обрабатываются переменные и спецсимволы \n \t etc внутри таких кавычек.
     
  14. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Не. В .htaccess
    Код (Text):
    1. php_flag short_open_tag on
     
  15. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А пади разбери теперь, чё я хотел сказать :)
     
  16. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Иногда нужно дышать свежим воздухом :lol:
     
  17. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Иногда это уже не помогает.

    Вот теперь ты в рекурсии - я про это и говорил. Что есть куча правил, которые надо учитывать - если одни кавычки, то так, а если другие - то эдак. Что ещё куча умолчаний.
     
  18. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    А если сделать так:
    $search = $_GET['search'];
    $search = mysql_real_escape_string($search);


    И еще через trim.

    Это убезопасит от иньекций?
     
  19. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Убезопасит. Только ещё substr сделать.
     
  20. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Andrey5555
    Не обезопасит от XSS...

    Пример:
    ?search=<script>alert();</script>
     
  21. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Ну а такой вариант:

    $id = $_GET['id'];
    $id = htmlspecialchars ($id, ENT_QUOTES);
    $id = mysql_real_escape_string($id);
    $id = trim ($id);
    $id = (int)$id;
     
  22. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    RomanBush

    Я так понял, что надо хтмл код отделять от php. Правильно?
     
  23. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Это хорошая практика. Ещё раз повторюсь - чем чище код, тем проще найти в нём ошибки.
     
  24. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Ну а если ошибки нет, то можно хтмл вставлять в php?
     
  25. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Если $id - число, то предостаточно последнего варианта.
    Если слово, то достаточно третьего варианта, но это смотря с какой целью используются в дальнейшем данные.