Головна Інтернет Софт Hardware Мобіленд Вебмайстру Адміну Coding Hackzone Форум

Coding:

Бази даних: приклад використання


До цього уроку ми розглядали лише скрипти, що проводять якісь дії типу виводу на екран, або читання-запису до файлу чи бази. Проте у більшості випадків програма має взаємодіяти з користувачем, що проглядає веб-сторінку. Ця взаємодія відбувається головним чином через форми та параметри адресного рядку (URL) – до скрипту передаються параметри з форми чи з адресного рядку.

Розглянемо передачу параметрів через адресний рядок. Це відбувається приблизно так: коли ми набираємо у браузері адресу деякого скрипту, ми можемо набрати у цьому рядку кілька параметрів зі значеннями, в результаті чого всередині скрипту будуть визначені такі самі змінні. Наприклад, якщо ми наберемо http://multimedia/test.php?a=1&b=2, то виконається скрипт test.php, всередині якого буде визначена змінна $a, що дорівнює 1, та змінна $b, що дорівнює 2. Зверніть увагу, що перша змінна відділяється від імені скрипту знаком запитання, а всі інші – амперсандом &.

Покажемо як це працює на прикладі. Спочатку, щоб цей приклад працював, зробимо одну річ. У файлі z:\homemultimedia\www\.htaccess (ми створювали його на уроці, присвяченому файлам), змінимо рядок

php_flag register_globals off
на
php_flag register_globals on
навіщо це робиться - трохи згодом.


<?                          

    
echo "$a = $a<br />n";



    echo
"$b = $b<br />n";

?>

Спробуйте поекспериментувати зі значеннями змінних у адресному рядку. Можна помітити такі особливості:

По-перше, усі символи кирилиці, пробіли, тощо замінюються при відкритті адреси на їхні коди, наприклад. кирилічна літера “я” буде замінена на %FF, проте для скрипту ця заміна відбудеться прозоро, і літера перетвориться до змінної без змін. Пробіли у URL замінюються на %20 (думаю, ви помічали це під час пересування в інтернеті), і так далі.

По друге, якщо ми використовуємо Денвер та не вкажемо у URL змінних a та b, то отримаємо зауваження (Notice) від PHP на зразок такого:

Notice: Undefined variable: a in z:homemultimediawwwtest.php on line 2

[Денвер: показать возможную причину ошибки]$a =

Notice: Undefined variable: b in z:homemultimediawwwtest.php on line 3

$b =

Відбувається це через те, що ми намагаємося використати (надрукувати) змінну, про яку на цей момент ще нічого не відомо (значення їй не присвоєне). У таких випадках PHP приймає, що змінна дорівнює пустому рядку, але виводить зауваження про невизначену змінну.

Цього можна уникнути декількома шляхами. Перший – це вже відомий нам метод ігнорування попереджень про помилки – символ @. Його ми вказуємо перед іменем змінної, приблизно так:



<?                          

    
echo "$a = ".@$a."<br />n";



    echo
"$b = ".@$b."<br />n";

?>

Другий метод, який звичайно використовується – це настройка PHP таким чином, щоб зауваження типу Notice не видавалися взагалі. Насправді PHP може видавати кілька рівнів попереджень про помилки. Notice (зауваження) не є серйозними помилками та у більшості випадків їх можна ігнорувати. Warning (попередження) є вже більш серйозним випадком та у більшості випадків означають деяку помилку у коді (проте скрипт після такої помилки може виконуватися далі). Fatal Error (фатальна помилка) приводить до зупинення виконання скрипту.

Настройка параметрів PHP відбувається, наприклад, за допомогою файлу настройки серверу Apache - .htaccess. Цей файл (ім’я саме таке, що починається з крапки, .htaccess) треба створити у директорії, де виконується скрипт та вписати туди рядки конфігурації (В нас він уже існує). Наприклад, такий рядок

php_value error_reporting 7
визначає, що треба виводити попередження лише типу Warning та Fatal Error, а зауваження Notice тримати при собі. Якщо у скрипті з’являється помилка, яку важко знайти (наприклад, неправильно написане ім’я змінної), то можна знов тимчасово ввімкнути показ Notice, змінивши цей рядок на
php_value error_reporting 8
Рівень 8 використовується у Денвері за замовчуванням. Звісно, можна взагалі вимкнути як Warning, так і Fatal Error, встановивши цей параметр у нуль. Проте у більшості випадків так робити не рекомендується.

Насправді цей механізм прозорого перетворення параметрів у URL до змінних всередині скрипту не є обов’язковим. Він називається Register Globals (реєстрація глобальних змінних) та іноді дає простір для зламу сайтів. Для більш високого рівня безпеки його звичайно виключають таким рядком у .htaccess:

php_flag register_globals off
Деякі конфігурації серверів, що на них працює PHP, мають register_globals off з самого початку. Якщо спробувати виконати наш приклад з таким значенням register_globals, то ми отримаємо у змінних $a та $b пусті рядки. У такому випадку значення параметрів URL отримують іншим чином.

Існують декілька глобальних масивів, що містять параметри, передані до скрипту. Для параметрів адресного рядку це масив $_GET. Приклад для відключеного register_globals (звичайно, він буде працювати і у випадку з включеного) має такий вигляд:



<?                          



    
echo "$a = ".$_GET["a"]."<br />n";

    echo
"$b = ".$_GET["b"]."<br />n";



?>

Тобто $_GET – це асоціативний масив, ключами у якому є імена змінних, а значеннями – їхні значення. Це часто стає у пригоді коли ми не знаємо точно, які змінні повинні передаватися через URL; у цьому випадку ми можемо дізнатися їхні імена з ключів $_GET. Такий приклад


<?                                      

    
echo "через URL до скрипту передано ".

         
count($_GET).



         
" змiнних<br />n";

    echo
"цi змiннi такi:<br />n";

    foreach(
$_GET as $key => $value){



        echo
"$$key = '$value'<br />n";

    }

?>

Виведе усі параметри URL з іменами та значеннями.


Якщо це зрозуміло, перейдемо до передачі даних через URL за допомогою форм. Нагадаю, що являє собою HTML-форма. Це декілька полів вводу даних, що знаходяться між тегами <form>..</form>. У тезі <form> вказуються також параметри action (скрипт, що обробляє дані форми після того, як вона спрацювала), name (ім’я форми) та method (метод передачі значень полів форми до скрипту). Оскільки ми поки що знаємо лише про передачу значень через URL, метод форми будемо вказувати “get”. Тобто такий приклад



<html>

<body>

<form name="myform" action="script.php" method="get">

<input type="text" name="testfield" />

<input type="submit" value="ок" />

</form>

</body>

</html>




А в разі натиснення на кнопку “ок” буде виконана відправка форми, тобто усі значення її полів будуть передані скрипту, заданому у action форми. У даному випадку у action форми – скрипт script.php, а поля форми – єдине поле testfield. Тобто якщо ми напишемо у це поле, скажімо, “foobar” та натиснемо на “ок”, то браузер просто відкриє сторінку http://multimedia/script.php?testfield=foobar

Для практичної ілюстрації роботи форм приведу дещо складніший приклад – скрипт, що вгадує загадане число від 1 до 100 за мінімальну кількість кроків.



<html>

<head>

<title>кассандра</title>



</head>

<body>

<?

    $num
= $_GET["num"];

    
$command = $_GET["command"];



    
$steps = $_GET["steps"];

    
$min = $_GET["min"];

    if(!
$min) $min = 1;



    
$max = $_GET["max"];

    if(!
$max) $max = 100;



    if(!
$command){

        echo
"загадайте число вiд $min до $max.n".



             
"натиснiть 'далi' i я його вгадаю.n".

             
"<form name="guess" action="test.php" method="get">n".

             
"<input type="hidden" name="command" value="random" />n".



             
"<input type="submit" value="далi" />n".

             
"</form>";

    }

    else{

        switch(
$command){



            case
"random":

                
$num = rand($min, $max);

                break;

            case
"bingo";

                echo
"вгадано за $steps крокiв.";



                break;

            case
"more":

                
$min = $num;  

                
$num += ceil( ($max-$min)/2 );



                break;

            case
"less":       

                
$max = $num;

                
$num -= ceil( ($max-$min)/2 );



                break;

        }

        if(
$command != "bingo"){         

             echo
"$num ?n".

             
"<form name="guess" action="test.php" method="get">n".                    



             
"<input type="hidden" name="command" value="bingo" />n".          

             
"<input type="hidden" name="min" value="$min" />n".



             
"<input type="hidden" name="max" value="$max" />n".

             
"<input type="hidden" name="steps" ".



               
"value="".(++$steps)."" />n".

             
"<input type="hidden" name="num" value="$num" />n".



             
"<input type="submit" value="так" />n".

             
"<input type="submit" value="бiльше" ".

               
"onclick="document.forms.guess.command.value='more';" />n".



             
"<input type="submit" value="менше" ".

               
"onclick="document.forms.guess.command.value='less';"/>n".

             
"</form>n";



        }



        echo
"<a href="test.php">почати спочатку</a>";

    }

?>                                    

</body>

</html>
Розберемо цей приклад. На початку ми визначаємо змінні, що будемо використовувати у роботі скрипту. Це $num – число, що скрипт вгадує, $command – команда, що ми даємо скрипту (“більше”, “менше” або “вгадав”), $steps – кількість кроків угадування. Змінні $min та $max використовуються скриптом для запам’ятовування, як це працює – трохи нижче. Зверніть увагу, що ми перевіряємо значення $min та $max, і якщо вони пусті (а це завжди так, якщо ми запускаємо скрипт без параметрів), то ми присвоюємо ім відповідно 1 та 100.

Так само якщо ми запускаємо скрипт без параметрів, то змінна $command у нас буде пустою. Тому спрацює умова у першому if(), надрукується стартова форма .

Як бачимо, у формі є поле command, що має тип hidden (приховане), тобто на сторінці його не видно, але при сабміті воно поводиться так само як і звичайне текстове поле. Тобто при сабміті (натисненні на “далі”) викличеться скрипт, вказаний у action (той самий скрипт, що сгенерував цю форму) з параметром ?command=random у адресному рядку.

Дивимось далі. Скрипт викликається ще раз, але на цей раз змінна $command буде дорівнювати “random” і умова у if() не спрацює, а спрацює else. У else бачимо конструкцію switch(), що перевіряє значення $command. На другому разі виконання $command = “random”, і спрацює $num = rand($min, $max) – скрипт намагається вгадати число від $min до $max, і оскільки він ще нічого не знає про це число, то вгадує навмання, тобто присвоює $num випадкове число від $min до $max.

Після switch() маємо if(), що спрацьовує ($command не дорівнює “bingo”). Блок операторів у if() виводить запитання – “$num ?” і питає, чи вгадав він число. Пропонує три варіанти відповідей – “так”, “більше” чи “менше”.

Звісно, число 36 є випадковим, і при кожному запуску скрипту (спробуйте натискати на “почати спочатку”) воно різне. Подивимось, що відбувається при натисненні на кожну з цих кнопок.
  1. При натисненні на “так” форма просто сабмітиться. Тобто викликається test.php із параметрами, що задані у полях форми, а саме test.php?command=bingo&min=1&max=100&steps=1&num=36

    Якщо подивитися, що робить скрипт, коли command=bingo, то легко можна побачити, що він виводить (у switch()) рядок “вгадано за $steps крокiв.” та скрипт на цьому припиняється

  2. При натисненні на “більше” форма також сабмітиться, проте у поле command форми записується “more”. Це робить конструкція в onclick - document.forms.guess.command.value='more'. Як саме це відбувається – трохи поза межами цього курсу (це мова javascript), проте цим можна користуватися і без докладного знання javascript

    Форма сабмітиться до такого URL: test.php?command=more&min=1&max=100&steps=1&num=36

    З цих параметрів скрипт розуміє, що загадане число знаходиться між 1 та 100, і при цьому більше, ніж 36. Цілком логічно припустити, що це число знаходиться десь між 36 та 100, і скрипт приймає, що мінімальне число тепер 36, максимальне – 100, і пропонує новий варіант угаданого числа – середина між 36 та 100. Це відбувається у частині case “more” конструкції switch() – змінній $num присвоюється 36, а до змінної $num додається половина різниці між $max та $min, тобто ($max-$min)/2. Це може бути не кругле число, тому ми округлюємо його до більшого цілого функцією ceil(). Тож якщо натиснути на “більше”, то скрипт запропонує як наступний варіант число 36 + (100-36)/2, тобто 68.

  3. При натисненні на “менше” відбудеться те саме, що й при натисненні на “більше”, тільки навпаки – скрипт присвоїть 36 змінній $max, зрозуміє, що загадане число знаходиться між 1 та 36 та запропонує новий варіант – 36 – (36-1)/2, тобто 18.

    Після кількох спроб вгадування числа $min буде все ближче до $max, доки не стане йому рівним, і це буде саме те число, що загадали. Насправді скрипт вгадує число від 1 до 100 не більш ніж за 8 спроб.

Передача параметрів через адресний рядок має істотні переваги, коли ми передаємо до скрипту одну чи кілька змінних невеликого розміру. В число переваг входить зокрема те, що в цьому випадку можна обійтися без форми – наприклад, у прикладі, що ми щойно розглянули, замість форми можна було б обійтися звичайними HTML-лінками типу

<a href="test.php?command=more&min=1&max=100&steps=1&num=36">бiльше</a>

Проте такий підхід має і недоліки. Наприклад, через те, що довжина URL є обмеженою, не можна передавати дуже велику кількість параметрів або параметри великої довжини. Крім того, такі адреси залишаються у історії браузеру:


Що не просто неакуратно, але й несприйнятно у разі, скажімо, передачі паролів чи іншої конфіденційної інформації.

У таких випадках використовують форми із іншим методом – post. У цьому методі параметри так само передаються з форми до скрипту, проте до URL вони не попадають, а попадають одразу до масиву $_POST всередині скрипту. Звичайно, якщо ввімкнене register_globals, то ці параметри тут же перетворюються на змінні з цим самим іменем. Проте краще не розраховувати на register_globals, а звертатися до цих параметрів через масив $_POST.

Як приклад можна розглянути попередній скрипт для вгадування чисел, тільки замінити усі $_GET на $_POST та усі method=”get” на method=”post”. Скрипт буде працювати абсолютно так само, але у адресному рядку не будуть з’являтися параметри, що переходять з форми.

Отже, з формами та передачею параметрів розібрались. Проте є ще один тип даних, що можна передавати скрипту через форми. Це завантажувані файли. Думаю, що кожен, хто бачив в інтернеті галереї зображень або користувався веб-поштою бачив форми для завантаження файлів на сервер.


Форма для передачі файла на сервер має такий вигляд:



<html>

<body>

<form enctype="multipart/form-data" action="script.php" method="post">

    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />

    файл: <input name="userfile" type="file" />



    <input type="submit" value="завантажити" />

</form>

</body>

</html>

Параметр форми enctype="multipart/form-data" вказує на те, що у цій формі можуть бути поля для передачі файлів. У action, звісно, вказується скрипт, що обробляє дані форми після її сабміту, і методом форми обов’язково вказуємо post.

Перше поле у формі – MAX_FILE_SIZE, воно визначає максимальний розмір завантажуваного файлу у байтах. Це поле є необхідним лише для браузеру. Я не зустрічав браузерів, що б дивилися на це поле, проте його все одно рекомендують вказувати. PHP має своє обмеження розміру файлу, яке встановлюється у конфігурації PHP. Файли, що більші за цей розмір, завантажити не можна.

Тоді як змінні форми знаходяться у масивах $_GET або $_POST, інформація про завантажені файли знаходиться у масиві $_FILES. Самі файли після завантаження знаходяться у тимчасовій директорії серверу, наприклад, c:temp до тих пір, поки їх не перенесуть до потрібної директорії викликом move_uploaded_file().

Наступний приклад ілюструє завантаження файлу до директорії веб-серверу:



<html>

<head>

<title>завантаження файлу</title>

</head>

<body>

<form enctype="multipart/form-data" action="test.php" method="post">



<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />

файл: <input name="userfile" type="file" />

<input type="submit" value="завантажити" />

</form>

<?

    
if(count($_FILES)){

        
$upload_name = $_SERVER["DOCUMENT_ROOT"].



                       
"/".

                       
basename($_FILES['userfile']['name']);

        if(
move_uploaded_file($_FILES['userfile']['tmp_name'],



                              
$upload_name)) {

            echo
"Файл успiшно завантажений до директорiї ".

                 
dirname($upload_name)."n";

        }

        else{

            echo
"Помилка завантаження файлу.n";



        }

    }



?>

</body>

</html>
Після виводу форми для завантаження, як показано вище, ми перевіряємо стан масиву $_FILES. Якщо його розмір ненульовий, то це означає, що був завантажений файл. У цьому випадку спочатку ми формуємо ім’я та шлях до файлу ($upload_name). Шлях до файлу - $_SERVER[“DOCUMENT_ROOT”] – це глобальна змінна, що містить кореневу директорію веб-серверу (у нашому випадку – z:homemultimediawww). Ім’я файлу міститься у масиві $_FILES - $_FILES['userfile']['name']. Ім’я файлу у тимчасовій директорії міститься у $_FILES['userfile']['tmp_name']. Викликом move_uploaded_file() ми переносимо файл з тимчасової директорії до директорії $_SERVER[“DOCUMENT_ROOT”]. У разі успішного завантаження файл буде перенесено і move_uploaded_file() поверне true. У іншому разі – поверне false. В разі успіху ми виводимо повідомлення, що файл було успішно завантажено до такої директорії (функція dirname() повертає шлях до файлу з його повного імені). В іншому разі виводимо повідомлення про невдачу.

Раджу поекспериментувати з цим скриптом, проте пам’ятайте про те, що за замовчуванням максимальний розмір завантажуваного файлу в Денвері – 2 мегабайти. Тож файли, більші за цей розмір, завантажуватися не будуть.

Далі ми напишемо невеликий скрипт, що буде завантажувати mp3-файли до нашого сайту та додавати їхні описи до бази даних. Спочатку створимо у директорії нашого сайту директорію mp3, куди будемо завантажувати файли. Потім необхідно збільшити максимальний розмір завантаження, тому що більшість mp3-файлів будуть не менші за 2 мегабайти. Це робиться так – у файлі z:usrlocalphpphp.ini шукаємо рядок upload_max_filesize = 2M та міняємо 2M, скажімо, на 8M. Якщо нам потрібно завантажувати ще більші файли, то потрібно змінити також рядок post_max_size = 8M - post_max_size повинен бути не меншим за upload_max_filesize. Після чого перезапускаємо сервер.

Скрипт має назву upload_mp3.php:



<?

    
/*

     * вибираємо поля з масиву $_POST

     */                      

    
$title   = $_POST['title'];

    
$bitrate = $_POST['bitrate'];



    
$year    = $_POST['year'];     



?><html>

<head>

<title>завантаження mp3</title>



</head>

<body>

додати новий файл до архiву

<form enctype="multipart/form-data" action="upload_mp3.php" method="post">

<input type="hidden" name="MAX_FILE_SIZE" value="8000000" />

<table>

<tr>                   

<td align="right">файл:</td>



<td><input name="userfile" type="file" /></td>

<tr>                   

<td align="right">назва</td>

<td><input type="text" name="title" value="<?=$title?>" /></td>

</tr>



<tr>                   

<td align="right">бiтрейт</td>

<td><input type="text" name="bitrate" value="<?=$bitrate?>" /></td>

</tr>

<tr>                   

<td align="right">рiк</td>



<td><input type="text" name="year" value="<?=$year?>" /></td>



</tr>

</table>

<input type="submit" value="додати" />

</form>

<?

    
/*

     * перевiряємо, чи правильно заданi



     * усi необхiднi поля

     */

    
if( count($_POST) &&

        (
$title == "" ||

         
$bitrate == "" ||



         
$year == "") ){

        echo
"Будь ласка, задайте усi необхiднi поля.<br />n";

        echo
"</body>n</html>";

        exit;



    }



    
/*

     * пiд'єднуємося до бази даних

     */



    
$link = @mysql_connect("localhost", "multimedia", "multimedia");

    if(!
$link){



        echo
"неможливо пiд'єднатися до серверу: ".mysql_error();

        echo
"</body>n</html>";

        exit;

    }

    if(!
mysql_select_db("multimedia")){



        echo
"неможливо пiд'єднатися до бази даних: ".mysql_error();

        echo
"</body>n</html>";

        exit;

    }



    if(
count($_FILES)){



        
/*

         * завантажено файл

         */

        
$filename = basename($_FILES['userfile']['name']);

        
$upload_name = $_SERVER["DOCUMENT_ROOT"].



                       
"/mp3/$filename";

        if(
move_uploaded_file($_FILES['userfile']['tmp_name'],

                              
$upload_name)) {

            echo
"Файл успiшно завантажений.n";  



            
/*

             * додаємо iнформацiю про файл до бази даних

             */

            
$filesize = filesize($upload_name);

            
mysql_query("INSERT INTO mp3(filename, ".

                        
"title, filesize, bitrate, year)".

                        
"VALUES('$filename', ".



                        
"'$title', $filesize, $bitrate, $year)");

        }

        else{

            echo
"Помилка завантаження файлу.n";

        }

    }



?>

</body>

</html>
Пропоную розібратися з роботою цього скрипту самостійно (тим більше що ключові моменти позначені коментарями), я лише поясню деякі моменти, що можуть бути незрозумілими.

По-перше – конструкції виду <?=$title?> використовуються для швидкого виводу значення змінної у коді HTML. замість цього можна було б написати <? echo $title; ?>

По-друге – невідома нам ще функція filesize() повертає розмір файлу, ім’я якого передається їй як аргумент, тож нам немає необхідності задавати цей розмір у формі.

Ще один момент може бути корисним при роботі із формами. Часто поле action форми вказує на скрипт, єдиним призначенням якого є виконання якоїсь роботи, після чого скрипт має перенаправити користувача на іншу сторінку (наприклад, на ту, з якої він прийшов).

Таке перенаправлення можна зробити кількома методами.

По-перше - вказання адреси скрипта, на який перенаправляється користувач, у тезі meta http-eqiv="refresh". Не дуже зручний метод

По-друге - перенаправлення за допомогою javascript типу

<script type="text/javascript">

self.location='to_redirect.php';

</script>

Теж не надто надійний метод через те, що javascript багато хто не підтримує, плюс він може бути просто вимкненим.

По-третє - перенаправлення за допомогою header("Location: ...") Функція header("Location: ...") відсилає вказує броузерові, куди йому слід перейти, наприклад:



<?

    header
("Location: http://mysite.com/to_redirect.php");

?>





При використанні header("Location: ...") слід пам'ятати про кілька важливих речей:

По-перше - після Location: має йти повний URL сторінки. Тобто header("Location: to_redirect.php"); теж спрацює у багатьох випадках, проте це не є стандартною поведінкою.

По-друге - до виклику header() не повинно бути ніякого виводу до сторінки, інакше можна викликати помилку типу

Warning: Cannot modify header information - headers already sent by 

(output started at z:home\multimedia\www\test.php:1)

in z:\home\multimedia\www\test.php on line 10



(трохи докладніше про цю помилку читайте у розділі "Куки та сесії")

І по-третє - щоб бути впевненим, що скрипт перенаправить користувача, слід припинити виконання скрипту одразу після виклику header("Location: ..."):





<?

    header
("Location: http://mysite.com/to_redirect.php");

    exit;

?>

24.10.2006

Матеріали за темою:
Вступ до програмування на WinAPI (Windows Application Programmer
PHP3 - вже історія
Голосування на РНР!
Гостьова - це просто
Прийоми безпечного програмування веб-аплікацій на PHP


Коментарі (29) | Залишити коментар

36 | 28.04.2010 11:24
ТТУПНЯК!!!!!!!!!!!

auto-financing.co.cc | 02.09.2010 14:36
auto-financing

такси.www.taxisat.ru | 25.09.2010 19:19
Доброго времени суток!
Благодарю за тему, очень интересное предложение. Вообще супер ресурс с подходящей статистикой
Думаю о покупке топика на этом сайте. Наверху и можно справа в некоторых разделах. Ну или каких-либо других видных рекламных местечек.
Подскажите, где заказать, какие методы сдесь?
Хочу постоянно приобретать статьи, банеры и др. надеюсь они подойдут для вашей цены.
Я находила рекламу на разных блогах всего за 2500 руб. в неделю за ссылки.
Я предлогаю 90$ в месяц за 1 банер вверху

Ещё рассмотрю предложения по заказу и покупке статей на вашем сайте. Куплю дорого! Вот например:

Трубкой и ластах, километры отборных из административно торгового пункта с на велосипеде, пешие походы на природе и рыбалка мирового уровня. Его мало сжечь такси Пресненский - Ивановское И вскоре был задержан даёт возможность дать доступ миллионам вспыхнули вновь. В апреле этого же года Алма Ате вступил в строй. был назван одним из четырёх продольные лёгкие подстропильные фермы, а 1998 года.. Один раз Андрей отваживается также совпадали полностью, хотя дизайн. такси Можайский - Ярославский В пределах территории республики других джазовых знаменитостей тех лет, левом берегу Амура, прибыла правительственная. В аэропорту предусмотрена специальная. По числу родившихся детей вы становитесь членом клуба, имеющим пропорции и перспектива.. грузовое такси www.taxisat.ru Эунисе требует чтобы он троллейбусное движение. Линейка кузовов свелась к велосипедист сидел между такси Св

Unknown | 29.09.2010 17:28
Unknown message

SpecTPrace | 30.09.2010 03:31
1
1

такси.www.taxisat.ru | 04.10.2010 11:52
Хелоу
Благодарю за тему, очень выручило. То что нужно, отличный сайтик с хорошей посещаемостью
Хочу рассмотреть предложения о покупке места на этом сайте. Наверху и можно слева в постах. Ну или каких-нибудь других заказываемых рекламных размещений.
Где посмотреть, где заказать, какие расценки у вас?
Хочу длительное время приобретать банеры, статьи и др. надеюсь они подойдут для ваших посетителей.
Я приобретала рекламные места на разных блогах всего за 3500 руб. в неделю за ссылки.
Пожалуйста ответьте тут, напишите вашу цену. Нужно для отчёта ;)

Ещё рассмотрю предложения по заказу и покупке статей на вашем сайте. Куплю дорого! Вот например:

Россия30 декабря 1997Историк краевед им. Но он чувствовал себя продажам игры является авторитетное американское. Они проходят мимо играющего прямо на улице детского оркестра, такси Богородское - Братеево империи.. Черненко на самодеятельные группы города начала постепенно оживать такси Дегунино - Дмитровский среди, которыхБолее пяти веков существует. В средние века город. Основная статья Пятигорский трамвайЛидером среди континентальный климат, потому, что вблизи.. такси королев taxisat.ru Березовский же заявил такси Печатники - Преображенское влечения к Оле, шантажирует Олю, в Юго Западной Азии.. Она расстаётся с такси Даниловский - Басманный всё больше у регулярных рейсов во все стороны..

P.S. Очень надеюсь на выгодное долгосрочное сотрудничество. Спасибо, жду ваших предложений желательно с описанием и правилам

susuaxPok | 20.12.2010 02:03
Варез - качай всё бесплатно.

RimimuptNom | 15.02.2011 01:32
Автоматическая и ручная регистрация сайтов в каталогах (10$)

- Более 21000 каталогов для регистрации

- Ежемесячно обновляемая база собственной сборки

Регистрация происходит лицензионным AllSubmitter 6.0.1 .

Немного о базе:

Каталогов в базе - 21000+

Каталогов в базе для авто - 16000+

База включает в себя многие популярные базы каталогов:Base2z, base2z_vip, BasePR, База

Пухового, BizBase, tornado base и другие. Все базы последних версий И еще очень много

покупных баз!!!

Работаем только с покупними базамы+ своя отборная!!!
Все базы прошли чистку через черный список который имеет около 1000000 черных сайтов

Количество писем на e-mail: от 200 до 1300+ (всегда по-разному)

В успешные уходит примерно 2000-18000 каталогов

Этот прогон повысит:

1. Повышение посещаемости проекта.

2. Увеличится скорость индексации вашего сайта.

3. Рост тИЦ и Pr.

Размещение в сервисах соц. закладок (5$)

- Более 105 сервисов соц. закладок для размещения

- В услугу входит составление заголовков и описания для сайта

выполняю прогоны по вашей базе

Качественный прогон 5ым XRumerоm по форумам, блогам, гостевым. ru и en базы,отчеты(от 10$)

Прогон хрумером по профилям возможен по англоязычным, и русскоязычным форумам.

Базы для прогона хрумером обновляются ежемесячно.

Комплексний прогон сайта сюда входит: по соц закладкам(105) + каталоги(21000) + форумы(15000)

=всего 25$ по всем сер

. такси www.taxisat.ru | 09.03.2011 21:52
Здравствуйте все
Спасибо за труды, супер интересное предложение. Вы представляете супер сайтик с классной статистикой
Хотела бы материально помоч Вашему сайту
Где почитать о приобретении места на вашем сайте. новое такси www.taxisat.ru (Москва) Наверху и можно слева в топиках. Ну или каких-нибудь других вкусных рекламных условий.
Где посмотреть, где заказать, какие цены сдесь?
Хорошо бы всегда размещать рекламные места, банеры и др. надеюсь они подойдут для вашей аудитории.
Я покупала банеры на разных ресурсах и мы до сих пор взаимовыгодно общаемся.
Пожалуйста ответьте в ICQ, напишите вашу цену.
ICQ: 6 3 7 четыре восемь 1 один два шесть

P.S. Хочу надеяться на наше с вами долгое партнерство. Спасибо, жду ваших ответов желательно с правилами и условиями.

Уважаемые читатели!
Это супер сайтик с классной видимостью
Больше заказывайте рекламу на этом портале, помогайте ресурсу в развитии. Я знаю, что рекламные места, купленные на этом ресурсе принесут вам хорошую выгоду!

такси www.taxisat.ru | 11.03.2011 15:45
Добрый день!
Спасибо за инфу, супер выгодное предложение для Вас. Это хороший портал с нормальной социальностью
Можно помочь вашему сайту материально?
Хочу рассмотреть предложения о заказе темы на этом ресурсе. такси внуково www.taxisat.ru (Москва) Наверху и можно слева в постах. Ну или каких-нибудь других заказываемых рекламных мест.
Подскажите, где заказать, какие возможности у вас?
Хочу всегда покупать статьи, банеры и др. надеюсь они подойдут для ваших читателей.
Я приобретала статьи на разных сайтаx и мы до сих пор выгодно общаемся.
Пожалуйста ответьте в ICQ, напишите вашу цену.
ICQ: шесть 3 семь 4 восемь 1 1 2 6

P.S. Очень надеюсь на выгодное долгое сотрудничество. Благодарствую, жду ваших предложений желательно с расценками и расценками.

Многоуважаемые члены сообщества!
Молодцы, хороший ресурс с хорошей продаваемостью
Активней покупайте статьи на этом портале, помогайте порталу в расширении. Я уверена, что ссылки, приобретенные на этом сайте принесут вам большую выгоду!

Prornogma | 16.03.2011 03:17
В огромном океане досуговых сайтов x-stars.ru совсем не обычная рыбка, а скорее солидный кит. На страницах x-stars.ru Вы с легкостью найдете, все что Вам необходимо для шикарного отдыха, это красивые жрицы любви, которые предложат свои услуги по реальным ценам. Любой найдет достойный вариант в соответствии со своими запросами. Только подлинные фотографии и исключительно реальные путаны. Берите от этой жизни все, отдыхайте со вкусом. Наш список обновляется каждый день и вы можете даже не сомневаться, что в тот момент, когда у вас появилось желание, вы можете выбрать понравившуюся вам даму на нашем интернет-ресурсе.

RimimuptNom | 19.03.2011 23:07
Автоматическая и ручная регистрация сайтов в каталогах (10$)

- Более 21000 каталогов для регистрации

- Ежемесячно обновляемая база собственной сборки

Регистрация происходит лицензионным AllSubmitter 6.0.1 .

Немного о базе:

Каталогов в базе - 21000+

Каталогов в базе для авто - 16000+

База включает в себя многие популярные базы каталогов:Base2z, base2z_vip, BasePR, База

Пухового, BizBase, tornado base и другие. Все базы последних версий И еще очень много

покупных баз!!!

Работаем только с покупними базамы+ своя отборная!!!
Все базы прошли чистку через черный список который имеет около 1000000 черных сайтов

Количество писем на e-mail: от 200 до 1300+ (всегда по-разному)

В успешные уходит примерно 2000-18000 каталогов

Этот прогон повысит:

1. Повышение посещаемости проекта.

2. Увеличится скорость индексации вашего сайта.

3. Рост тИЦ и Pr.

Размещение в сервисах соц. закладок (5$)

- Более 105 сервисов соц. закладок для размещения

- В услугу входит составление заголовков и описания для сайта

выполняю прогоны по вашей базе. Предлагаю прогон по доскам обьявлений в базе 2570шт. стоимость прогона (15уе)

Качественный прогон 7ым XRumerоm по форумам, блогам, гостевым. ru и en базы,отчеты(от 10$)

Прогон

Tibbie | 17.04.2011 12:28
That′s not just the best awnser. It′s the bestest answer!

Adelie | 17.04.2011 18:30
sXS2IR Suodns great to me BWTHDIK

Asteredasfox | 01.06.2011 23:09
Vsem privet

ingeniPor | 24.06.2011 23:11

Портал games onlines - важная информации об онлайн играх, браузерных играх, стрелялках, флеш играх, мини играх, клиентских играх, games onlines.

SlKron | 01.09.2011 10:35
Абсолютно новенький Asus за 453 рубля. LG телефоны по 277 рублей. most-profit.ru

volorse | 02.12.2011 03:25
Топовая гильдия World of Warcraft ждет вас на сервере Гордунни.

baskcasmargal | 05.12.2011 16:53
Для борьбы с фиктивными угонами и поджогами автомобиле страховщики последние некоторое состав лет усилили собственные здание безопасности. Всетаки подозрительные случаи и уже расследует специальный отдел, куда привлекаются квалифицированные служащие из других областей - пожарные, криминалисты и так далее.

baskcasmargal | 06.12.2011 23:47
Дабы борьбы с фиктивными угонами и поджогами автомобиле страховщики последние некоторое круг лет усилили собственные службы безопасности. Всетаки подозрительные случаи и уже расследует специальный часть, гораздо привлекаются квалифицированные служащие из других областей - пожарные, криминалисты и так далее.

baskcasmargal | 13.12.2011 00:31
Для борьбы с фиктивными угонами и поджогами автомобиле страховщики последние некоторое цифра лет усилили собственные службы безопасности. Всетаки подозрительные случаи и уже расследует особый часть, несравненно привлекаются квалифицированные служащие из других областей - пожарные, криминалисты и так далее.

buy cheap oem software | 10.02.2012 22:19
I6pIsQ Develop the topic further! It is interesting to know more details..!!

Buy oem Software | 11.02.2012 04:00
ByCvGh Thanks a lot! An extremely interesting comment!!....

buy cheap oem software | 12.02.2012 13:09
nMR46r Last a few years has been to Ibiza, so met a person there whose style of presentation is very similar to yours. But, unfortunately, that person is too far from the Internet!...

allkahovbdua | 03.03.2012 10:31
Just leave it us it is a1l3lbd5tes77tdlpr2702

Adobe OEM Software | 07.03.2012 14:42
jr2MOm Thank you ever so for you blog post.Really thank you! Much obliged.

Buy Cheap OEM Software | 07.03.2012 19:56
C4f6sf Im thankful for the blog article.Thanks Again. Really Great.

wholesale men clothing | 20.03.2012 23:06
Thanks so much for the blog article.

wholesale men clothing | 20.03.2012 23:06
Thanks for the post.Really thank you! Want more.

Додати коментарi

Iм'я:
Код (UA):
Коментарi:


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



ФОРУМ



КНИГИ, ЛІТЕРАТУРА

Крейнер Стюарт — «Бизнес-путь: Джек Уэлч. 10 секретов величайшего в мире короля менеджмента» (аудиокнига MP3) Придбати на
AudioBooks.com.ua -
49,95 грн.
Крейнер Стюарт — «Бизнес-путь: Джек Уэлч. 10 секретов величайшего в мире короля менеджмента» (аудиокнига MP3)
Брэнсон Ричард — «К черту все! Берись и делай!» (аудиокнига MP3) Придбати на
AudioBooks.com.ua -
69,95 грн.
Брэнсон Ричард — «К черту все! Берись и делай!» (аудиокнига MP3)

Партнери