Меню
Бесплатно
Главная  /  Советы  /  Рождения мужчине search item php i. Многоуровневое меню на PHP и MySQL

Рождения мужчине search item php i. Многоуровневое меню на PHP и MySQL

By Ibrahim Diallo

Published Jul 2 2014 ~ 16 minutes read

Search is an important feature on a website. When my few readers want to look for a particular passage on my blog, they use the search box. It used to be powered by Google Search, but I have since then changed it to my own home-brewed version not because I can do better but because it was an interesting challenge.

If you are in a hurry and just want your site to be searchable, well do what I did before, use Google.

// In search.php file $term = isset($_GET["query"])?$_GET["query"]: ""; $term = urlencode($term); $website = urlencode("www.yourwebsite.com"); $redirect = "https://www.google.com/search?q=site%3A{$website}+{$term}"; header("Location: $redirect"); exit;

What it does is pretty simple. Get the term passed by the user, and forward it to Google search page. Limit the search result to our current domain using the site: keyword in the search query. All your pages that are indexed by Google will be available through search now. If you do want to handle your search in house however, then keep reading.

Homemade Search Solution

Before we go any further, try using the search box on this blog. It uses the same process that I will describe below. If you feel that this is what you want then please continue reading.

This solution is catered to small websites. I make use of LIKE with wild cards on both ends, meaning your search cannot be indexed. This means the solution will work fine for your blog or personal website that doesn"t contain tons of data. Port it to a bigger website and it might become very slow. MySQL offers Full Text Search which is not what we are doing here.

Note: If you have 5000 blog posts you are still fine. .

We will take the structure of this blog as a reference. Each blog post has:

  • A title p_title
  • A url p_url
  • A summary p_summary
  • A post content p_content
  • And catergories category.tagname

For every field that matches with our search term, we will give it a score. The score will be based on the importance of the match:

// the exact term matches is found in the title $scoreFullTitle = 6; // match the title in part $scoreTitleKeyword = 5; // the exact term matches is found in the summary $scoreFullSummary = 5; // match the summary in part $scoreSummaryKeyword = 4; // the exact term matches is found in the content $scoreFullDocument = 4; // match the document in part $scoreDocumentKeyword = 3; // matches a category $scoreCategoryKeyword = 2; // matches the url $scoreUrlKeyword = 1;

Before we get started, there are a few words that do not contribute much to a search that should be removed. Example "in","it","a","the","of" ... . We will filter those out and feel free to add any word you think is irrelevant. Another thing is, we want to limit the length of our query. We don"t want a user to write a novel in the search field and crash our MySQL server.

// Remove unnecessary words from the search term and return them as an array function filterSearchKeys($query){ $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // expand this list with your words. $list = array("in","it","a","the","of","or","I","you","he","me","us","they","she","to","but","that","this","those","then"); $c = 0; foreach(explode(" ", $query) as $key){ if (in_array($key, $list)){ continue; } $words = $key; if ($c >= 15){ break; } $c++; } return $words; } // limit words number of characters function limitChars($query, $limit = 200){ return substr($query, 0,$limit); }

Our helper functions can now limit character count and filter useless words. The way we will implement our algorithm is by giving a score every time we find a match. We will match words using the if statement and accumulate points as we match more words. At the end we can use that score to sort our results

Note: I will not be showing how to connect to MySQL database. If you are having problems to efficiently connect to the database I recommend reading this .

Let"s give our function a structure first. Note I left placeholders so we can implement sections separately.

Function search($query){ $query = trim($query); if (mb_strlen($query)===0){ // no need for empty search right? return false; } $query = limitChars($query); // Weighing scores $scoreFullTitle = 6; $scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreUrlKeyword = 1; $keywords = filterSearchKeys($query); $escQuery = DB::escape($query); // see note above to get db object $titleSQL = array(); $sumSQL = array(); $docSQL = array(); $categorySQL = array(); $urlSQL = array(); /** Matching full occurrences PLACE HOLDER **/ /** Matching Keywords PLACE HOLDER **/ $sql = "SELECT p.p_id,p.p_title,p.p_date_published,p.p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Title score ".implode(" + ", $titleSQL).")+ (-- Summary ".implode(" + ", $sumSQL).")+ (-- document ".implode(" + ", $docSQL).")+ (-- tag/category ".implode(" + ", $categorySQL).")+ (-- url ".implode(" + ", $urlSQL).")) as relevance FROM post p WHERE p.status = "published" HAVING relevance >

In the query, all scores will be summed up as the relevance variable and we can use it to sort the results.

Matching full occurrences

We make sure we have some keywords first then add our query.

If (count($keywords) > 1){ $titleSQL = "if (p_title LIKE "%".$escQuery."%",{$scoreFullTitle},0)"; $sumSQL = "if (p_summary LIKE "%".$escQuery."%",{$scoreFullSummary},0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",{$scoreFullDocument},0)"; }

Those are the matches with higher score. If the search term matches an article that contains these, they will have higher chances of appearing on top.

Matching keywords occurrences

We loop through all keywords and check if they match any of the fields. For the category match, I used a sub-query since a post can have multiple categories.

Foreach($keywords as $key){ $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",{$scoreTitleKeyword},0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key)."%",{$scoreSummaryKeyword},0)"; $docSQL = "if (p_content LIKE "%".DB::escape($key)."%",{$scoreDocumentKeyword},0)"; $urlSQL = "if (p_url LIKE "%".DB::escape($key)."%",{$scoreUrlKeyword},0)"; $categorySQL = "if ((SELECT count(category.tag_id) FROM category JOIN post_category ON post_category.tag_id = category.tag_id WHERE post_category.post_id = p.post_id AND category.name = "".DB::escape($key)."") > 0,{$scoreCategoryKeyword},0)"; }

Also as pointed by a commenter below, we have to make sure that the these variables are not empty arrays or the query will fail.

// Just incase it"s empty, add 0 if (empty($titleSQL)){ $titleSQL = 0; } if (empty($sumSQL)){ $sumSQL = 0; } if (empty($docSQL)){ $docSQL = 0; } if (empty($urlSQL)){ $urlSQL = 0; } if (empty($tagSQL)){ $tagSQL = 0; }

At the end the queries are all concatenated and added together to determine the relevance of the post to the search term.

// Remove unnecessary words from the search term and return them as an array function filterSearchKeys($query){ $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // expand this list with your words. $list = array("in","it","a","the","of","or","I","you","he","me","us","they","she","to","but","that","this","those","then"); $c = 0; foreach(explode(" ", $query) as $key){ if (in_array($key, $list)){ continue; } $words = $key; if ($c >= 15){ break; } $c++; } return $words; } // limit words number of characters function limitChars($query, $limit = 200){ return substr($query, 0,$limit); } function search($query){ $query = trim($query); if (mb_strlen($query)===0){ // no need for empty search right? return false; } $query = limitChars($query); // Weighing scores $scoreFullTitle = 6; $scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreUrlKeyword = 1; $keywords = filterSearchKeys($query); $escQuery = DB::escape($query); // see note above to get db object $titleSQL = array(); $sumSQL = array(); $docSQL = array(); $categorySQL = array(); $urlSQL = array(); /** Matching full occurences **/ if (count($keywords) > 1){ $titleSQL = "if (p_title LIKE "%".$escQuery."%",{$scoreFullTitle},0)"; $sumSQL = "if (p_summary LIKE "%".$escQuery."%",{$scoreFullSummary},0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",{$scoreFullDocument},0)"; } /** Matching Keywords **/ foreach($keywords as $key){ $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",{$scoreTitleKeyword},0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key)."%",{$scoreSummaryKeyword},0)"; $docSQL = "if (p_content LIKE "%".DB::escape($key)."%",{$scoreDocumentKeyword},0)"; $urlSQL = "if (p_url LIKE "%".DB::escape($key)."%",{$scoreUrlKeyword},0)"; $categorySQL = "if ((SELECT count(category.tag_id) FROM category JOIN post_category ON post_category.tag_id = category.tag_id WHERE post_category.post_id = p.post_id AND category.name = "".DB::escape($key)."") > 0,{$scoreCategoryKeyword},0)"; } // Just incase it"s empty, add 0 if (empty($titleSQL)){ $titleSQL = 0; } if (empty($sumSQL)){ $sumSQL = 0; } if (empty($docSQL)){ $docSQL = 0; } if (empty($urlSQL)){ $urlSQL = 0; } if (empty($tagSQL)){ $tagSQL = 0; } $sql = "SELECT p.p_id,p.p_title,p.p_date_published,p.p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Title score ".implode(" + ", $titleSQL).")+ (-- Summary ".implode(" + ", $sumSQL).")+ (-- document ".implode(" + ", $docSQL).")+ (-- tag/category ".implode(" + ", $categorySQL).")+ (-- url ".implode(" + ", $urlSQL).")) as relevance FROM post p WHERE p.status = "published" HAVING relevance > 0 ORDER BY relevance DESC,p.page_views DESC LIMIT 25"; $results = DB::query($sql); if (!$results){ return false; } return $results; }

Now your search.php file can look like this:

$term = isset($_GET["query"])?$_GET["query"]: ""; $search_results = search($term); if (!$search_results) { echo "No results"; exit; } // Print page with results here.

We created a simple search algorithm that can handle a fair amount of content. I arbitrarily chose the score for each match, feel free to tweak it to something that works best for you. And there is always room for improvement.

It is a good idea to track the search term coming from your users, this way you can see if most users search for the same thing. If there is a pattern, then you can save them a trip and just cache the results using Memcached .

If you want to see this search algorithm in action, go ahead and try looking for an article on the search box on top of the page. I have added extra features like returning the part where the match was found in the text. Feel free to add features to yours.

Did you like this article? You can subscribe to read more awesome ones. .

On a related note, here are some interesting articles.

If there is one thing a web server does everyday it iss connecting to the database. I have been using PHP for many years now, but if you ask me to write a script to fetch data from the database I couldn"t do it without going back to the Ultimate PHP manual to find a few examples first.

A few months ago I updated my PHP version. PHP 5.4 to 5.5 . I never had any problems updating PHP before. I follow its development closely and try to remove my deprecated functions long before they are officially removed. But this time I was caught off guard. It silently broke part of my website for the silliest reason.

Comments(45)

Zaryel Aug 12 2015:

Ian Mustafa Sep 26 2015:

Rob Sep 29 2015:

adeem Feb 11 2016:

Ivan Venediktov Apr 9 2016.

Updated on April 30, 2016

I"m going to show you how to create simple search using PHP and MySQL. You"ll learn:

  • How to use GET and POST methods
  • Connect to database
  • Communicate with database
  • Find matching database entries with given word or phrase
  • Display results

Preparation

You should have Apache, MySQL and PHP installed and running of course (you can use for different platforms or WAMP for windows, MAMP for mac) or a web server/hosting that supports PHP and MySQL databases.

Let"s create database, table and fill it with some entries we can use for search:

  • Go to phpMyAdmin, if you have server on your computer you can access it at http://localhost/phpmyadmin/
  • Create database, I called mine tutorial_search
  • Create table I used 3 fields, I called mine articles.
  • Configuration for 1st field. Name: id, type: INT, check AUTO_INCREMENT, index: primary

INT means it"s integer
AUTO_INCREMENT means that new entries will have other(higher) number than previous
Index: primary means that it"s unique key used to identify row

  • 2nd field: Name: title, type: VARCHAR, length: 225

VARCHAR means it string of text, maximum 225 characters(it is required to specify maximum length), use it for titles, names, addresses
length means it can"t be longer than 225 characters(you can set it to lower number if you want)

  • 3rd field: Name: text, type: TEXT

TEXT means it"s long string, it"s not necessary to specify length, use it for long text.

  • Fill the table with some random articles(you can find them on news websites, for example: CNN, BBC, etc.). Click insert on the top menu and copy text to a specific fields. Leave "id" field empty. Insert at least three.

It should look something like this:

  • Create a folder in your server directory and two files: index.php and search.php (actually we can do all this just with one file, but let"s use two, it will be easier)
  • Fill them with default html markup, doctype, head, etc.

Search

  • Create a form with search field and submit button in index.php, you can use GET or POST method, set action to search.php. I used "query" as name for text field

GET - means your information will be stored in url (http://localhost/tutorial_search/search.php?query=yourQuery )
POST - means your information won"t be displayed it is used for passwords, private information, much more secure than GET

Ok, let"s get started with php.

  • Open search.php
  • Start php ()
  • Connect to a database(read comments in following code)

< to > $query = mysql_real_escape_string($query); // makes sure nobody uses SQL injection $raw_results = mysql_query("SELECT * FROM articles WHERE (`title` LIKE "%".$query."%") OR (`text` LIKE "%".$query."%")") or die(mysql_error()); // * means that it selects all fields, you can also write: `id`, `title`, `text` // articles is the name of our table // "%$query%" is what we"re looking for, % means anything, for example if $query is Hello // it will match "hello", "Hello man", "gogohello", if you want exact match use `title`="$query" // or if you want to match just full word so "gogohello" is out use "% $query %" ...OR ... "$query %" ... OR ... "% $query" if(mysql_num_rows($raw_results) >

".$results["title"]."

".$results["text"]."

"; // posts results gotten from database(title and text) you can also show id ($results["id"]) } } else{ // if there is no matching rows do following echo "No results"; } } else{ // if query length is less than minimum echo "Minimum length is ".$min_length; } ?>

Done!

Now it works. Try different words, variations, editing code, experiment. I"m adding full code of both files in case you think you"ve missed something. Feel free to ask questions or ask for tutorials.

index.php

Search

search.php

Search results = $min_length){ // if query length is more or equal minimum length then $query = htmlspecialchars($query); // changes characters used in html to their equivalents, for example: < to > $query = mysql_real_escape_string($query); // makes sure nobody uses SQL injection $raw_results = mysql_query("SELECT * FROM articles WHERE (`title` LIKE "%".$query."%") OR (`text` LIKE "%".$query."%")") or die(mysql_error()); // * means that it selects all fields, you can also write: `id`, `title`, `text` // articles is the name of our table // "%$query%" is what we"re looking for, % means anything, for example if $query is Hello // it will match "hello", "Hello man", "gogohello", if you want exact match use `title`="$query" // or if you want to match just full word so "gogohello" is out use "% $query %" ...OR ... "$query %" ... OR ... "% $query" if(mysql_num_rows($raw_results) > 0){ // if one or more rows are returned do following while($results = mysql_fetch_array($raw_results)){ // $results = mysql_fetch_array($raw_results) puts data from database into array, while it"s valid it does the loop echo "

".$results["title"]."

".$results["text"]."

"; // posts results gotten from database(title and text) you can also show id ($results["id"]) } } else{ // if there is no matching rows do following echo "No results"; } } else{ // if query length is less than minimum echo "Minimum length is ".$min_length; } ?>

В этой статье я покажу, как можно создавать многоуровневое меню на PHP и MySQL . Безусловно, вариантов его создания можно придумать много, но, судя по количеству Ваших вопросов на эту тему, Вам нужен пример. И его я приведу в этой статье. Сразу отмечу, что данная статья имеет смысл только для тех, кто знает PHP и умеет работать с MySQL . Всем остальным сначала надо пройти этот , либо прочитать какие-нибудь книги по PHP и MySQL .

Для начала создадим таблицу в базе данных со следующими полями:

  • id - уникальный идентификатор.
  • title - анкор ссылки в меню.
  • link - адрес, на который будет вести пункт меню.
  • parent_id - родительский ID. Если родительского пункта нет, то здесь будет NULL (либо можно ещё 0 поставить).

С таблицей разобрались, теперь пришло время PHP-кода . Полный PHP-код приведён ниже:

$mysqli = new mysqli("localhost", "root", "", "db"); // Подключаемся к БД
$result_set = $mysqli->query("SELECT * FROM `menu`"); // Делаем выборку всех записей из таблицы с меню
$items = array(); // Массив для пунктов меню
while (($row = $result_set->fetch_assoc()) != false) $items[$row["id"]] = $row; // Заполняем массив выборкой из БД
$childrens = array(); // Массив для соответствий дочерних элементов их родительским
foreach ($items as $item) {
if ($item["parent_id"]) $childrens[$item["id"]] = $item["parent_id"]; // Заполняем массив
}
function printItem($item, $items, $childrens) {
/* Выводим пункт меню */
echo "

  • ";
    echo "".$item["title"]."";
    $ul = false; // Выводились ли дочерние элементы?
    while (true) {
    /* Бесконечный цикл, в котором мы ищем все дочерние элементы */
    $key = array_search($item["id"], $childrens); // Ищем дочерний элемент
    if (!$key) {
    /* Дочерних элементов не найдено */
    if ($ul) echo ""; // Если выводились дочерние элементы, то закрываем список
    break; // Выходим из цикла
    }
    unset($childrens[$key]); // Удаляем найденный элемент (чтобы он не выводился ещё раз)
    if (!$ul) {
    echo "
      "; // Начинаем внутренний список, если дочерних элементов ещё не было
      $ul = true; // Устанавливаем флаг
      }
      echo printItem($items[$key], $items, $childrens); // Рекурсивно выводим все дочерние элементы
      }
      echo "";
      }
      ?>

      Этот код полностью рабочий, однако, Вы должны понимать, что так никто не пишет (в частности, вывод через echo HTML-тегов ). И Ваша задача взять алгоритм из этого кода, но не сам код. А дальше этот алгоритм подключить к своему движку. Я постарался тщательно прокомментировать код вывода многоуровневого меню на PHP и MySQL , но, безусловно, он не самый прозрачный и требует уже неплохих начальных знаний. Если Вы ещё плохо знаете PHP и MySQL , то сначала настоятельно рекомендую пройти этот

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

      Ведущая произносит тост за именинника и заканчивает его словами:

      Шампанское в бокалы наливаем
      И дружно выпиваем все до дна!
      За молодость свой тост мы поднимаем,
      А молодость бывает не одна!

      Закончен первый круг, начался новый,
      Ты во вторую молодость вступил.
      Мужчина видный, крепкий и здоровый,
      Ты полон свежих замыслов и сил.

      Таким же оставайся энергичным,
      Ведь ты не зря трудился столько лет!
      Таким же будь веселым, симпатичным,
      И пусть судьба хранит тебя от бед!

      Гости исполняют для виновника торжества старинный цыганский романс
      (двое могут запевать, а все остальные подхватывают припев) :

      Бокалы наливаются,
      В них отблеск янтаря,
      И лица загораются,
      Как вешняя заря!

      С вином тоска уносится,
      Становится светлей,
      И тост на сердце просится:
      Мы пьем за юбилей!

      Припев:

      Хор наш поет напев старинный,
      Льет шампанское рекой!
      За тебя, наш друг любимый,
      Наш именинник (может быть и имя) дорогой!

      Что может быть чудеснее,
      Когда, любовь тая,
      Тебя встречают с песнею
      Родные и друзья!

      Пусть вечер начинается,
      Как жизни новый круг,
      И все мечты сбываются,
      И все цветет вокруг!

      Припев:
      Пей до дна! Пей до дна! Пей до дна!

      Музыкальная пауза.

      Затем призносится тост за родителей .

      Ведущий:

      Ну, а сейчас, друзья, момент настал
      Наполнить за родителей бокал!
      За тех, кто радость жизни подарил
      И в мир прекрасный двери отворил,

      За тех, кто доброте его учил
      И эстафету мужества вручил.
      За тех, благодаря кому, сейчас
      Сидит наш именинник среди нас!

      Итак, пьем за родителей… (называет их по имени-отчеству)

      Музыкальная пауза.

      Ведущий вкратце рассказывает о жизненном пути юбиляра.

      Ведущий: А сейчас мы споем «Старые песни о главном герое нашего праздника» .

      (Гости поют на мотив песни о летчиках)


      Без юбиляра, скажем прямо, делать нечего.
      Мы соберемся за столом,
      Бокалы полные нальем
      И за его здоровье песенку споем:

      Пора нам отметить,
      И день этот встретить

      Пускай тебе не двадцать и не тридцать, пускай!
      Ты планку своей бодрости не опускай!
      Следить будем строго,
      От нас не скроешься, ты так и знай!

      Мы видим бравого, бравого, бравого
      Мужчину стройного, красивого, кудрявого!
      Пусть чередой идут года,
      Но мы желаем, чтоб всегда
      Душа твоя оставалась молода!

      Пора нам отметить,
      Пора отпраздновать, праздновать славный юбилей!
      И день этот встретить
      В большой компании родных, друзей!

      Пускай судьба порою к нам жестока, пускай!
      В ответ ей свои шуточки ты отпускай!
      Следи так же строго,
      Вокруг уныния не допускай!

      Сегодня вечером, вечером, вечером
      Без дорогого юбиляра делать нечего!
      Мы выпьем раз, мы выпьем два
      За юбилей и за дела,
      Но чтобы завтра не болела голова!

      Мы юбиляра любим, уважаем
      И наше поздравленье продолжаем!

      (Гости поют на мелодию песни «Не могу я тебе в День рождения…»:)

      Мы не можем тебе в День рождения
      Дорогой Мерседес подарить,
      Но подарок вручим, без сомнения,
      И готовы сто раз повторить:

      Что ты добрый, веселый, внимательный
      И в делах общепризнанный спец,
      Что вообще ты у нас замечательный
      И товарищ, и муж, и отец!

      Ведущий:

      Мы от души хотим тебя поздравить,
      А также возраст в паспорте исправить,
      Ведь говорит твой вид, твоя улыбка,
      Что лет на десять в паспорте ошибка!

      (Гости поют на мотив солдатской песни «Путь далек у нас с тобою…»)

      Именинник - парень бравый
      Смотрит соколом в строю!
      Уважаем всеми он по праву
      И на службе, как в бою!

      Припев:

      ________ (имя именинника) В путь! В путь! В путь!
      До сотни лет добраться
      И сильным оставаться
      Судьба тебя зовет!
      ________ (имя именинника) Вперед!

      Дорогого юбиляра
      Поздравляем от души!
      И медаль вручаем, и подарок
      В знак заслуг его больших!

      Припев.

      Юбиляру вручается подарок и памятная медаль с надписью : "За большие заслуги в работе, дружбе и любви." (Медаль можно выпилить из дерева и повесить ее на шею имениннику на ленте

      Конкурс на тему «Кто лучше знает именинника»!

      Судьей будет сам именинник.
      Ведущая задает вопросы и вручает фишки за правильные ответы. Тот, кто в конце игры стал обладателем наибольшего количества фишек, получает приз с афтографом именинника.

      Музыкальная пауза.

      Викторина по дням рождения в кино

      Дорогие друзья! Давайте попробуем определить самого эрудированного гостя! Тема, разумеется, все та же - День рождения. Только не в жизни, а на экране!

      За каждый правильный или остроумный ответ вручается фишка. По итогам викторины за наибольшее количество фишек вручается приз. Например, шоколадку. Если гости не могут угадать, ведущая должна дать подсказку, немного напомнить об этом фильме.

      Шуточные вопросы и ответы

      Вы делаете два кулёчка с вопросами и ответами. Вначале человек объявляет, кому он будет задавать вопрос, вытягивает вопрос и зачитывает. Передаёт кулёчек с ответами тому, кого он назвал. Затем тот, кого назвали, вытягивает ответ и зачитывает. Потом тоже объявляет, кому он будет задавать вопрос, вытягивает вопрос и зачитывает. И т.д.

      Танец по команде ведущего

      Поздравительные телеграммы-загадки (в том числе от гостей)

      Ведущая объявляет: Для Тани пришли поздравительные телеграммы, но все они без подписи. Нужно угадать отправителя. Это известные всем люди, а также гости. И даже сказочные герои!

      Пусть шепчут о любви тебе на ушко!
      Царевна по прозванию… Лягушка

      Желаю пить лишь марочные вина!
      Весёлого вам праздника!… Мальвина

      Желаю петь почаще под гитару!
      Хорошей вам компании!… Ротару

      Желаю не встречать любви внеплановой!
      Привет вам музыкальный от… Булановой

      Живи, серёжа, весело и клево!
      Не забывай про детство!… Королёва

      Желаю много музыки и смеха,
      любви и вечной молодости!… Пьеха

      Пускай будет денег всегда до фига!
      И ножки куриные!… Баба яга

      Бывай почаще в поле и в лесу!
      Здоровья тебе крепкого!… Алсу

      унынья никогда не допускайте!
      Большой привет от мамы!… Орбокайте

      Не попадай в ЧП и перестрелки!
      Желаю долгой жизни! Группа… Стрелки

      Тому, кто первый дал правильный ответ, вручаются фишки. За наибольшее количество фишек вручается приз.

      Лотерея-загадка

      Приз получает тот, кто угадал, что за предмет у ведущего в мешке. Можно задавать ведущему наводящие вопросы. Тот отвечает «да» или «нет».

      Лотерея - прогноз

      Все вытягивают билетики или получают их за шутку, анекдот. Во время розыгрыша Ведущий говорит:
      - Сейчас мы испытаем судьбу и узнаем, что она кому приготовила.
      Выдаёт подарки, начиная с первого номера и зачитывает прогноз на ближайший год.

      Тест «Нарисовать несуществующее животное»

      Вы просите гостей нарисовать несуществующее животное и написать его название.

      Тест «нарисуй человечка»

      Нужно нарисовать человека из 12-ти фигур: нужно использовать все фигуры - круг и треугольники, квадраты. (В сумме их 12)

      В заключение вечера можно предложить гостям открыть для именинника счет в банке. После чего вынести 3-х - литровую банку, куда все гости могут бросить по десятке.