Есть код Код Код (Text): <?php include ("mysql.php"); if (isset($_GET['search'])) $search = $_GET['search']; $s_section = $_GET ['section']; $s_type = $_GET ['type']; if ($s_section != 1111) $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section = '$s_section' and type = '$s_type' and text LIKE '%$search%'"); else $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE type = '$s_type' and text LIKE '%$search%'"); if ($s_type != 1111) $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section = '$s_section' and type = '$s_type' and text LIKE '%$search%'"); else $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section='$section' and text LIKE '%$search%'"); $allnum = mysql_num_rows ($query1); if(!isset($_GET['page'])) $page = 1; else $page = ($_GET['page']); $on_page = 10; $begin = ($page - 1) * $on_page; $num_pages = ceil ($allnum / $on_page); if ($s_section != 1111) $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"); else $query = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE type = '$s_type' and text LIKE '%$search%' LIMIT $begin, $on_page"); if ($s_type != 1111) $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section = '$s_section' and type = '$s_type' and text LIKE '%$search%'"); else $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section='$section' and text LIKE '%$search%'"); while (list ($section, $type, $text, $name, $email, $date) = mysql_fetch_array ($query)) { echo "<table width='300' border ='1' >"; echo "<tr>"; echo "<td width='150'>$type</td><td><div align='right'>$date</div></td>"; echo "</tr>"; echo "</table>"; echo "<table width='300' border ='1'>"; echo "<tr>"; echo "<td>$text</td>"; echo "</tr>"; echo "</table>"; echo "<table width='300' border ='1'>"; echo "<tr>"; echo "<td width='150'>$name</td><td><div align='right'><a href='mailto:$email'>$email</div></td>"; echo "</tr>"; echo "</table>"; echo "<br>"; } for($i=0;$i<$num_pages;$i++) { $pages = $i+1; echo "<a href=?page=$pages§ion=$s_section&type=$s_type&search=".urlencode($search).">$pages</a> "; } ?> Но он не работает. Должны выбираються Все категории и\или типы. Но этого не происходит. В чем моя ошибка? И как ее исправить? Заранее спасибо.
-Чего ж вы сами не следуете своему кредо? Каждый день по нескольку тем создаете. Я понимаю, что всегда есть соблазн не париться и задать на форуме вопрос, на который ответят. И у меня когда-то такое было. Года три назад... -Попробуйте сами решать свои задачи. Если уже ушел день/два/три и результата никакого - тогда пишите на форум, четко объяснив, что и как, сказав, какие вариант перепробовали. -Для РНР есть специальный тег, который подсвечивает синтаксис. -Ошибки какие-нибудь код выдает? error_reporting(E_ALL) в начало файла вставьте. - PHP: <?php if (isset($_GET['search'])) $search = $_GET['search']; $s_section = $_GET ['section']; $s_type = $_GET ['type']; if ($s_section != 1111) $query1 = mysql_query ("SELECT section, type, text, name, email, date FROM announcements WHERE section = '$s_section' and type = '$s_type' and text LIKE '%$search%'"); else ?> Лучше пользуйтесь фигурными скобками и табуляцией, чтобы разделять большие блоки. Иначе в коде самому запутаться легко. - Код (Text): echo "<td>$text</td>"; echo "</tr>"; echo "</table>"; echo "<table width='300' border ='1'>"; echo "<tr>"; Отвратительно. Во-первых, зачем столько раз вызывать эхо, во-вторых, ошибочно убеждение, что в php каждая строка -новая команда. -Ваш код потенциально опасен. Не фильтруются параметры, принимаемые от пользователя и отправляемые в бд. - А теперь посмотрите, как называется переменная, которая является результатом запроса в базу, и сравните с той, что вы разбираете на массив. Прекратите уже, в конце концов. Читайте мануалы, прежде чем браться за работу. Зачем лезть в работу с бд, не поняв принципа и основ?
Я не могу разобраться с этим вопросом уже достаточно долго, около 2 недель. Если выбирать только все категории или все типы, то код работает. А если вместе, то нет. Где необходимо фильтровать данные? Буду вам очень благодарен, если вы мне поможете навести бардак в голове и в скрипте.
Правило номер один: а) Если что-то куда-то пишеться не так, как надо/хотелось бы - проверь, что именно ты записываешь. Например, выводя на экран переменную перед записью. В этом тебе поможет var_dump. б) Если что-то не так селектица - проверь, что именно ты селектишь - выведи ПОЛНЫЙ свой селект на экран и внимательно его рассмотри. Здесь тебе поможет echo. Только имей в виду, что есть такая противная вещь, как пробелы вначале либо в конце. Поэтому я обычно пишу так: echo """.$переменная."""; либо так: echo "[".$переменная."]"; Правило номер два: Пиши как можно меньше кода. Оптимизируй его. До упора. Чем меньше кода, тем меньше мест, где можно сделать ошибки. Например, вот этот кусок: можно и нужно написать так: Код (Text): $query1="SELECT section, type, text, name, email, date FROM announcements WHERE "; if ($s_section != 1111) $query1 .= "section = '$s_section' and type = '$s_type' and text LIKE '%$search%'"); else $query1 .= "type = '$s_type' and text LIKE '%$search%'"); if ($s_type != 1111) $query1 .= "section = '$s_section' and type = '$s_type' and text LIKE '%$search%'"); else $query1 .= "section='$section' and text LIKE '%$search%'"); echo "[".$query1."]<br>" mysql_query ($query1); а вот этот кусок: написать так: PHP: <?while (list ($section, $type, $text, $name, $email, $date) = mysql_fetch_array ($query)) { ?> <table width="300" border ="1" > <tr> <td width="150"><?=$type;?></td><td><div align="right"><?=$date;?></div></td> </tr> </table> <table width="300" border ="1"> <tr> <td><?=$text;?></td> </tr> </table> <table width="300" border ="1"> <tr> <td width="150"><?=$name;?></td><td><div align="right"><a href="mailto:$email"><?=$email;?></div></td> </tr> </table> <br> <? } Правило номер три: Внимательно читай подписи всех стариков на этом форуме. В них очень много нужного.
можно и нужно написать так: Код (Text): $query1="SELECT section, type, text, name, email, date FROM announcements WHERE "; if ($s_section != 1111) $query1 .= "section = '$s_section' and type = '$s_type' and text LIKE '%$search%'"); else $query1 .= "type = '$s_type' and text LIKE '%$search%'"); if ($s_type != 1111) $query1 .= "section = '$s_section' and type = '$s_type' and text LIKE '%$search%'"); else $query1 .= "section='$section' and text LIKE '%$search%'"); echo "[".$query1."]<br>" mysql_query ($query1); Тут непойму зачем .= написать так: PHP: <?while (list ($section, $type, $text, $name, $email, $date) = mysql_fetch_array ($query)) { ?> <table width="300" border ="1" > <tr> <td width="150"><?=$type;?></td><td><div align="right"><?=$date;?></div></td> </tr> </table> <table width="300" border ="1"> <tr> <td><?=$text;?></td> </tr> </table> <table width="300" border ="1"> <tr> <td width="150"><?=$name;?></td><td><div align="right"><a href="mailto:$email"><?=$email;?></div></td> </tr> </table> <br> <? } А здесь <?= Обьясните пожалуйста. А на подписи я обращаю внимание, только они иногда не в тему
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.
Когда ты выводишь html через echo - тебе надо соблюдать кучу условий. Например, надо экранировать кавычки. Ища ошибку, ты можешь просто тупо пропустить какую-то кавычку и долго думать, почему ругается php. Есть ещё мелочи. А когда пишешь так, как я тебе показал - ты пишешь чистый html, который спокойно разбирается взглядом. Заметить ошибку гораздо проще. В том числе - ошибку в вёрстке. Есть ещё один способ: <<< В данном случае это будет выглядеть так: Код (Text): <?while (list ($section, $type, $text, $name, $email, $date) = mysql_fetch_array ($query)) { <<<EOT <table width="300" border ="1" > <tr> <td width="150">$type</td><td><div align="right">$date</div></td> </tr> </table> <table width="300" border ="1"> <tr> <td>$text</td> </tr> </table> <table width="300" border ="1"> <tr> <td width="150">$name</td><td><div align="right"><a href="mailto:$email">$email</div></td> </tr> </table> <br> EOT; }
По дефолту включена опция, но хостеры, бывает отключают. Разве это не равноценно фразе "Но она не на всех хостингах поддерживается." ? =) Только не надо впаривать ему про хередоки. Человека только запутаете. И экранировать не обязательно, когда кавычки ' '. Но тут свои тонкости - не обрабатываются переменные и спецсимволы \n \t etc внутри таких кавычек.
Иногда это уже не помогает. Вот теперь ты в рекурсии - я про это и говорил. Что есть куча правил, которые надо учитывать - если одни кавычки, то так, а если другие - то эдак. Что ещё куча умолчаний.
А если сделать так: $search = $_GET['search']; $search = mysql_real_escape_string($search); И еще через trim. Это убезопасит от иньекций?
Ну а такой вариант: $id = $_GET['id']; $id = htmlspecialchars ($id, ENT_QUOTES); $id = mysql_real_escape_string($id); $id = trim ($id); $id = (int)$id;
Если $id - число, то предостаточно последнего варианта. Если слово, то достаточно третьего варианта, но это смотря с какой целью используются в дальнейшем данные.