Поздрав до моите читатели, стекнав искуство и ќе ви кажам за принципите на работа на формуларот за повратни информации PHP. Ќе ви покажам јасни примери за да разберете како функционира сè и како се јавува интеракцијата помеѓу самата форма за внесување (нејзините влезни полиња) и датотеката со управувачот напишана во PHP. Покрај тоа, можете бесплатно да ги преземете изворите заедно со .

Секако, ќе биде одлично доколку барем малку го разбирате HTML/CSS бидејќи... Ќе треба да го повлечете кодот на вашата страница по аналогија. Нема да го допираме јазикот PHP, ќе ви ги покажам сите потребни промени што треба да ги направите за себе.

АЖУРИРАЊЕ: Врз основа на одговорите од читателите, сфатив дека ми треба нешто поубаво и пофункционално, ве молам запознајте ме, проверете го и погледнете. Изберете кој ви се допаѓа најдобро)

АЖУРИРАЊЕ2: Верзија 3.0 Приспособливо слетување + формулар ајакс со пренос на UTM ознаки, прочитајте и видете. Ќе ви се допадне

Се сетив на себе кога првпат се обидов сам да креирам формулар за повратни информации во PHP и да бидам искрен, тоа беше трудоинтензивно, бидејќи ... Не разбрав што и како се случува. Трпение и истрајност, пријатели, и ќе успеете.

PHP повратна форма - структура

Ќе ја проучуваме анализата на самата форма за повратни информации користејќи го примерот на Целна страница; патем, има посебна статија за. Можете да видите како ова функционира на дело користејќи ги копчињата подолу, ги прикачувам изворите на оваа страница на една страница и главната датотека за ракувач php (оваа датотека ќе ја обработи и испрати е-поштата)

Откако ќе ги преземете изворите и ќе ја отпакувате архивата, ќе ја видите следнава структура на датотека:

  • слика - сите слики што се користат за самата Целна страница, копчиња, итн.
  • js - скрипти за Javascript кои обезбедуваат, на пример, скокачки модален прозорец на страница и други визуелни ефекти
  • index.html - индексна датотека на нашата страница на една страница
  • index1.php е датотека за ракувач во која се пренесуваат вредностите од формуларот, потоа се генерира буква од примените променливи и се испраќа на наведената адреса за е-пошта. Index1.php ќе делува и како посредна страница за известување за успешното испраќање податоци со автоматско пренасочување назад на index.html (т.е. нашата страница на една страница)

Важно е вашиот хостинг, каде што се наоѓаат датотеките на страницата, да поддржува PHP обработка, во спротивно датотеката index1.php нема да се изврши и нема да работи. За да ја разјасните оваа нијанса, контактирајте ја кампањата каде што е регистриран вашиот хостинг или само тестирајте го - функционира, тоа значи дека има поддршка. Ако не, тогаш овозможете ја опцијата за поддршка на јазикот php

Погледнете го дијаграмот за тоа како сите елементи комуницираат (страница, форма, управувач)

Изворниот код за повикување на формуларот и управувачот

Ајде да погледнеме како работи едно од копчињата, што прикажува модален скокачки прозорец кој содржи формулар за повратни информации. Овој даден изворен код не е нешто што можете да го вметнете во страница еднаш или двапати и ќе функционира. Ќе мора сами да го приспособите за да одговара на вашиот дизајн и потреби.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Побарајте повратен повик Побарајте повратен повик

Побарајте повратен повик Побарајте повратен повик

Подолу е целосниот изворен код на управувачот index1.php, за да го поставите испраќањето до вашето поштенско сандаче, промените „ [заштитена е-пошта]„Само за себе, останатото, во принцип, може да се остави непроменето

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 Ќе бидете контактирани

Ќе ве контактираат телото (заднина: #22BFF7 url(img/zakaz.jpg) врвот -70% центар без повторување; ) setTimeout("location.replace("/index.html")", 3000); /*Променете ја адресата на тековната страница по 3 секунди (3000 милисекунди)*/

Проверка на функционалноста на формуларот

Повикајте го прозорецот и внесете податоци за тест проверка на нашата форма

Дозволете ми да ве потсетам уште еднаш дека вашиот хостинг мора да поддржува обработка на PHP-датотеки, инаку нашиот управувач едноставно нема да биде извршен и нема да биде испратено писмо на наведената адреса за е-пошта. Резултат од успешно пополнет формулар за повратни информации


Тоа е се за мене, се обидов на најдобар можен начин да го пренесам значењето и функционирањето на сценариото. Ако имате какви било прашања, слободно контактирајте ме во коментарите или на VK (видете детали за контакт). Ви посакувам лесна и продуктивна работа.

Операциите со бази на податоци многу често стануваат тесно грло при спроведување на веб-проект. Прашањата за оптимизација во такви случаи не се однесуваат само на администраторот на базата на податоци. Програмерите треба правилно да ги структурираат табелите, да пишуваат оптимални прашања и попродуктивен код. Оваа статија дава мала листа на техники за оптимизирање на работата со MySQL за програмери.

1. Оптимизирајте ги вашите барања за кешот за пребарување.

Повеќето MySQL сервери користат кеширање на барања. Ова е една од ефективни техники за подобрување на перформансите што ја изведува моторот на базата на податоци во позадина. Ако барањето се извршува многу пати, кешот почнува да се користи за да се добие резултатот и операцијата се завршува многу побрзо.

Проблемот е што е толку едноставно и во исто време скриено од развивачот, а повеќето програмери игнорираат таква одлична можност да ги подобрат перформансите на проектот. Некои дејства всушност може да спречат користење на кешот за пребарување за време на извршувањето.

// Кешот за пребарување НЕ РАБОТИ $r = mysql_query("ИЗБЕРИ корисничко име ОД корисникот WHERE signup_date >= CURDATE()"); // Кешот за пребарување РАБОТИ! $ денес = датум ("Y-m-d"); $r = mysql_query ("ИЗБЕРЕТЕ корисничко име ОД корисникот WHERE signup_date >= "$денес"");

Причината зошто кешот за пребарување не работи во првиот случај е поради употребата на функцијата CURDATE(). Овој пристап се користи за сите недетерминистички функции, на пример, NOW(), RAND() итн. Бидејќи резултатот за враќање на функцијата може да се промени, MySQL одлучува да не го кешира барањето. Сè што е потребно за да се поправи ситуацијата е да се додаде дополнителна линија PHP код пред барањето.

2. Користете EXPLAIN за вашите прашања SELECT

Користењето на клучниот збор EXPLAIN може да помогне да се наслика што прави MySQL за да го заврши вашето барање. Оваа слика го олеснува идентификувањето на тесните грла и другите проблеми во барањата или структурата на табелата.

Резултатот од барањето EXPLAIN покажува кои индекси се користат, како се скенира и сортира табелата итн.

Ајде да земеме барање SELECT (по можност сложено, со JOIN) и да го додадеме клучниот збор EXPLAIN пред него. Можете да го користите PhpMyAdmin за ова. Таквото барање ќе го даде резултатот во убава табела. Да речеме дека заборавивме да додадеме индекс на колона што се користи за JOIN:

По додавањето на индекс за полето group_id:

Сега наместо да се скенираат 7883 редови, ќе се скенираат само 9 и 16 редови од две табели. Добар начин за оценување на перформансите е да се умножат сите броеви во колоната „редови“. Резултатот е приближно пропорционален на количината на податоци што се обработуваат.

3. Користете LIMIT 1 ако треба да добиете единствена низа

Понекогаш, додека користите барање, веќе знаете дека барате само еден ред. Можете да добиете единствен запис или едноставно да проверите дали постои било кој број записи што ја задоволуваат клаузулата WHERE.

Во таков случај, додавањето на LIMIT 1 на вашето барање може да ги подобри перформансите. Под овој услов, моторот на базата на податоци престанува да скенира записи веднаш штом ќе најде еден и не ја скенира целата табела или индекс.

// Дали има некој корисник од Алабама? // Не го правете ова: $r = mysql_query("SELECT * FROM user WHERE држава = "Алабама""); if (mysql_num_rows($r) > 0) ( // ... ) // Ова ќе биде многу подобро: $r = mysql_query("SELECT 1 FROM user WHERE state = "Alabama" LIMIT 1"); ако (mysql_num_rows($r) > 0) ( // ... )

4. Индексирајте ги полињата за пребарување

Индексирајте повеќе од само примарни и единствени клучеви. Ако било која колона во вашата табела се користи за прашања за пребарување, тогаш тие треба да се индексираат.

Како што можете да видите, ова правило важи и за пребарување по дел од низата, на пример, „презиме КАКО „a%““. Кога почетокот на низата се користи за пребарување, MySQL може да го користи индексот на колоната што се пребарува.

Треба да разберете и за какви типови на пребарувања не можете да користите редовно индексирање. На пример, кога го пребарувате зборот („КАДЕ КАДЕ „%apple%“ на пост_содржината“, придобивките од индексирањето нема да бидат достапни. Во такви случаи, подобро е да користите пребарување на целосен текст mysql или да изградите свои решенија засновани на индексирање.

5. Индексирање и користење на истите типови за поврзани колони

Ако вашата апликација содржи многу прашања JOIN, треба да ги индексирате колоните што се поврзани во двете табели. Ова има ефект на внатрешно оптимизирање на операциите за врзување во MySQL.

Исто така, колоните што се поврзуваат мора да бидат од ист тип. На пример, ако поврзете DECIMAL колона со колона INT од друга табела, MySQL нема да може да користи индекс на барем една од двете табели. Дури и кодирањето на знаци мора да биде исто за колони со идентични типови на низа.

// Пребарај за компанија од одредена држава $r = mysql_query("SELECT company_name FROM users LEFT JOIN company ON (users.state = company.state) WHERE users.id = $user_id"); // двете колони за името на државата мора да бидат индексирани // и двете мора да бидат ист тип и кодирање на знаци // или MySQL ќе изврши скенирање на целосна табела

6. Не користете ORDER BY RAND()

Ова е еден од оние трикови кои изгледаат кул, а многу нови програмери паѓаат во неговата замка. Тие не можат ни да замислат каков ужасен проблем си создаваат со тоа што почнуваат да го користат овој израз во своите прашања.

Ако навистина треба да ги рандомизирате редовите во резултатот од вашето барање, има многу подобри начини да го направите ова. Секако, ова ќе се имплементира со дополнителен код, но ќе се спасите од проблем кој експоненцијално расте со обемот на податоци. Работата е во тоа што MySQL врши операција RAND() (која одзема време на процесорот) на секој ред во табелата пред да го подреди и да ви даде само еден ред.

// НЕ правете го ова: $r = mysql_query("ИЗБЕРИ корисничко име ОД корисникот ORDER BY RAND() LIMIT 1"); // Ова ќе работи подобро: $r = mysql_query("SELECT count(*) FROM user"); $d = mysql_fetch_row ($r); $rand = mt_rand(0,$d - 1); $r = mysql_query ("ИЗБЕРЕТЕ корисничко име ОД ОГРАНИЧУВАЊЕ НА корисникот $rand, 1");

На овој начин добивате случаен број кој е помал од бројот на редови во резултатот од барањето и го користите како поместување во клаузулата LIMIT.

7. Избегнувајте користење SELECT *

Колку повеќе податоци се читаат од табелата, толку побавно ќе биде барањето. Таквите операции, исто така, бараат време за да се завршат операциите на дискот. И ако серверот на базата на податоци е одделен од веб-серверот, тогаш доцнењата ќе бидат предизвикани и од пренос на податоци преку мрежата помеѓу серверите.

Добра навика е да наведете колона кога правите SELECT.

// Лошо: $r = mysql_query("SELECT * FROM user WHERE user_id = 1"); $d = mysql_fetch_assoc ($r); ехо "Добредојдовте ($d["корисничко име"])"; // Ова е подобро: $r = mysql_query("SELECT корисничко име ОД корисник WHERE user_id = 1"); $d = mysql_fetch_assoc ($r); ехо "Добредојдовте ($d["корисничко име"])"; // Разликата станува значајна со големи количини на податоци

8. Обидете се да го користите полето id насекаде

Добра практика е да се користи поле за идентификација во секоја табела што има ПРИМАРЕН КЛУЧ, поставени својства AUTO_INCREMENT и е од типот од семејството INT. По можност - НЕПОТПИШАНО, бидејќи во овој случај вредноста не може да биде негативна.

Дури и ако вашата табела има поле со единствено корисничко име, не го правете примарен клуч. Полињата VARCHAR бавно работат како примарни клучеви. Исто така, структурата на вашата база на податоци ќе биде подобра ако внатрешно користи врски до записи базирани на id.

Дополнително, моторот MySQL користи примарни клучеви за своите внатрешни задачи, а користењето на полето id создава оптимални услови за нивно решавање.

Еден можен исклучок од ова правило се „асоцијативни табели“, кои се користат за многу-до-многу врски помеѓу две други табели. На пример, табелата „posts_tags“ содржи 2 колони: post_id, tag_id. Тие се користат за да се опише односот помеѓу две табели „пост“ и „ознаки“. Опишаната табела може да има примарен клуч кој ги содржи двете полиња за идентификација.

9. Користете ENUM наместо VARCHAR // Направете подготвен израз ако ($stmt = $mysqli->prepare("SELECT корисничко име FROM user WHERE state=?")) ( // Bind параметри $stmt->bind_param("s" , $ држава); // Изврши $stmt->execute(); // Поврзи ги променливите за резултат $stmt->bind_result($username); // Земете ги вредностите $stmt->fetch(); printf(" %s е од %s \n", $username, $state); $stmt->close(); ) 13. Небаферирани барања

Вообичаено, кога извршувате барање од скрипта, скриптата се прекинува додека барањето не се комплетира. Ова однесување може да се промени со помош на небаферирани барања.

Одлично објаснување на функцијата mysql_unbuffered_query() од документацијата PHP:

„mysql_unbuffered_query() испраќа SQL барање до MySQL серверот без автоматско преземање и баферирање на редовите со резултати како што тоа го прави функцијата mysql_query(). На овој начин, одредено количество меморија се зачувува со SQL пребарувања кои произведуваат голем сет на резултати и можете да започнете да работите на множеството резултати веднаш по добивањето на првиот ред, без да чекате SQL барањето целосно да се изврши.

Сепак, постојат неколку ограничувања. Мора да ги прочитате сите редови или да повикате mysql_free_result() пред да го извршите следното барање. Исто така, не можете да користите mysql_num_rows() или mysql_data_seek() за да го поставите резултатот.

14. Чувајте ја IP-адресата како НЕПИСТИГНА ИНТ

Многу програмери создаваат поле VARCHAR(15) за складирање на IP адреса, без воопшто да размислуваат за фактот дека ќе складираат цел број во ова поле. Ако користите INT, големината на полето ќе се намали на 4 бајти и ќе има фиксна должина.

Мора да го користите типот UNSIGNED INT бидејќи IP адресата ги користи сите 32 бита од непотпишан цел број.

$r = "Ажурирање на корисниците ПОСТАВЕТЕ ИП = INET_ATON("($_SERVER["REMOTE_ADDR"])") WHERE user_id = $user_id";

15. Табелите со фиксна должина на рекордот (Static) се побрзи

Кога секоја поединечна колона во табела има фиксна должина, тогаш табелата како целина се смета за „статична“ или „фиксна должина на записот“. Примери на типови колони кои немаат фиксна должина: VARCHAR, TEXT, BLOB. Ако вклучите барем една колона од овој тип, табелата повеќе нема да се смета за „статична“ и ќе биде различно обработена од моторот MySQL.

„статичните“ табели се обработуваат побрзо од MySQL моторот кога се бараат записи. Кога треба да прочитате одреден запис во табела, неговата позиција брзо се пресметува. Ако големината на редот не е фиксна, тогаш одредувањето на позицијата на записот бара време за пребарување и споредба со индексот на главниот клуч.

Ваквите табели, исто така, се полесни за кеширање и полесно закрепнување од неуспеси. Но, тие можат да заземат повеќе простор. На пример, ако конвертирате поле VARCHAR(20) во поле CHAR(20), тогаш 20 бајти секогаш ќе бидат зафатени, без разлика дали се во употреба или не.

Користењето на техниката Vertical Splitting овозможува да се одделат колоните со променлива должина во посебна табела.

16. Вертикално одвојување

Вертикалната партиција е чин на делење на структурата на табелата вертикално со цел оптимизација.

Пример 1: Имате табела која содржи домашни адреси кои ретко се користат во апликацијата. Можете да ја поделите вашата табела и да ги зачувате адресите во посебна табела. Ова ќе ја намали големината на главната корисничка табела. И како што знаете, помалата табела се обработува побрзо.

Пример 2: Имате поле „last_login“ во вашата табела. Се ажурира секогаш кога некој корисник се регистрира на страницата. Но, секое ажурирање на табелата предизвикува барањето да се кешира, што може да создаде преоптоварување на системот. Можете да го одделите ова поле во друга табела за да ги поретки ажурирањата на табелата со корисници.

Но, треба да бидете сигурни дека нема потреба трајно да ги поврзувате двете табели што штотуку ги поделивте, бидејќи тоа може да доведе до слаби перформанси.

17. Одделете ги големите барања за DELETE или INSERT

Ако треба да извршите големо барање DELETE или INSERT на веб-локација во живо, треба да внимавате да не го нарушите сообраќајот. Кога се извршува големо барање, тоа може да ги заклучи вашите табели и да предизвика вашата апликација да престане.

Apache работи многу паралелни процеси/нишки. поради оваа причина, таа работи поефикасно кога скриптата ќе заврши со извршувањето што е можно побрзо, со што серверот не користи премногу отворени врски и процесира кои трошат ресурси, особено меморија.

Ако ги заклучувате табелите подолг временски период (на пример, 30 секунди или повеќе) на силно натоварен веб-сервер, може да предизвикате заостанати процеси и барања што ќе бараат значително време за чистење или дури и да предизвикаат прекин на вашиот веб-сервер.

Ако имате скрипта што брише голем број записи, едноставно користете ја клаузулата LIMIT за да ја разделите на мали групи за да ја избегнете оваа ситуација.

Додека (1) ( mysql_query ("БРИШИ ОД дневниците WHERE log_date