Formular de alăturare nefondat php. Înțelegerea mySQL JOIN, reprezentare vizuală

De ceva vreme, la începutul carierei mele de dezvoltator web, am lucrat cu această bază de date cât am putut de bine, dar nu știam mare lucru. El a compus interogări primitive simple și uneori chiar a inserat interogări în bucle. La acel moment, din păcate, nu am pus mâna pe cartea potrivită despre MySQL și a trebuit să învăț prin încercare și eroare. Multe articole de pe Internet cumva nu mi-au transmis imediat minunatul interogare mySQL- A TE ALATURA.
În această publicație vă voi spune despre toată lumea opțiuni posibile lucrând cu JOIN și, mai mult, voi prezenta principiul de funcționare a fiecărei comenzi – vizual.

Vom lua în considerare:
  • INNER JOIN
  • LEFT JOIN
  • ÎNSCRIEȚI DREPT
  • UNIUNEA EXTERIOARĂ
  • LEFT JOIN, FĂRĂ INNER JOIN
  • ALĂTURAREA DREPTA FĂRĂ ALĂTURAREA INTERIOARĂ
  • ÎMPĂRREA EXTERIOARĂ, FĂRĂ ÎNCHIDEREA INTERIOARĂ
  • Separat, merită remarcat punctele 5, 6 și 7. De fapt, aceste interogări nu conectează două tabele, ci mai degrabă exclud coloanele dintr-un tabel care sunt prezente în celălalt. De fapt, acest lucru poate fi foarte util.

    Inner JOIN

    Una dintre cele mai frecvente solicitări, apare extrem de des. Această interogare va returna toate înregistrările din tabelul din stânga (Tabelul A) și înregistrările din (Tabelul B), dar va returna numai coloanele care se potrivesc.

    Exemplu de cerere:

    Vizualizați codul SQL

    SELECTAȚI< select_list>FROM Table_A A INNER JOIN Table_B B ON A. Cheie = B. Cheie

    Stânga JOIN

    Aceasta cerere va returna toate coloanele din tabelul din stânga (Tabelul A), precum și toate coloanele din tabelul din dreapta (Tabelul B), dar numai cele care se potrivesc cu coloanele din tabelul din stânga.

    Exemplu de cerere:

    Vizualizați codul SQL

    SELECTAȚI< select_list>FROM Table_A A LEFT JOIN Table_B B ON A. Cheie = B. Cheie

    Dreapta JOIN

    Similar cu interogarea anterioară, dar va returna toate coloanele din tabelul din dreapta (Tabelul B), precum și toate coloanele din tabelul din stânga (Tabelul A) care se potrivesc cu coloanele din tabelul din dreapta.

    Exemplu de cerere:

    Vizualizați codul SQL

    SELECTAȚI< select_list>FROM Table_A A RIGHT JOIN Table_B B ON A. Cheie = B. Cheie

    EXTERIOR JOIN

    Adesea, această interogare este scrisă ca FULL OUTER JOIN sau FULL JOIN, toate variațiile efectuează o singură acțiune, și anume, returnează toate coloanele din ambele tabele, în timp ce coloanele potrivite vor fi suprapuse de coloanele din tabelul din stânga.

    Exemplu de cerere:

    Vizualizați codul SQL

    SELECTAȚI< select_list>FROM Table_A A FULL OUTER JOIN Table_B B ON A. Cheie = B. Cheie

    Stânga Excluzând JOIN

    Această interogare va returna toate coloanele din tabelul din stânga (Tabelul A) care nu se potrivesc cu coloanele din tabelul din dreapta (Tabelul B).

    Exemplu de cerere:

    Vizualizați codul SQL

    În MySQL, puteți selecta folosind JOIN căi diferite. Vom încerca să luăm în considerare toate aceste tipuri de solicitări. Iată o listă cu toate interogările care implică JOIN:

  • INNER JOIN
  • LEFT JOIN
  • ÎNSCRIEȚI DREPT
  • RIGHT JOIN fără intersecții cu tabelul din stânga
  • COMPLET EXTERIOR
  • FULL OUTER unde tabelul din stânga sau din dreapta este gol
  • Și iată o ilustrare a acestor tipuri de JOIN:

    Voi atasa la articol fisiere de pe site-ul nostru, printre care va fi join.php in care voi afisa toate intrarile folosind diferiți operatori A TE ALATURA.

    INNER JOIN

    Vom începe cu acest operator INNER JOIN, deoarece acest operator se declanșează în mod implicit dacă pur și simplu scrieți JOIN în interogare. Acest operator selectează toate înregistrările din două tabele în care este îndeplinită condiția următoare operatorului ON. Avem două tabele Fișiere și Mesaje:

    Tabel cu mesaje:

    Interogarea cu JOIN va fi după cum urmează:

    SELECT * FROM Messages INNER JOIN Fișiere ON Messages.fid=Files.fid

    Ca urmare, vor fi afișate următoarele înregistrări:

    Tabel de fișiere:

    LEFT JOIN va fi necesar atunci când afișăm toate înregistrările mesajelor și dacă există sau nu un fișier atașat, vom verifica prin PHP.

    LEFT JOIN fără intersecții cu tabelul din dreapta

    LEFT JOIN returnează toate înregistrările din tabelul din stânga, cu excepția celor a căror fid se potrivește în tabelul din dreapta.

    Tabel cu mesaje:

    O interogare cu un LEFT JOIN fără intersecții ar fi:

    SELECTAȚI * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid WHERE Files.fid IS NULL

    Ca rezultat, obținem următoarea selecție:

    Tabel de fișiere:

    RIGHT JOIN va fi necesar atunci când vom afișa toate fișierele atașate, indiferent dacă sunt utilizate sau nu, doar toate fișierele.

    RIGHT JOIN fără intersecții

    RIGHT JOIN fără intersecții afișează toate înregistrările din tabelul din dreapta, cu excepția celor care au intersecții cu tabelul din stânga.

    Tabel cu mesaje:

    O interogare cu un RIGHT JOIN fără intersecții ar fi:

    SELECTAȚI * FROM Messages RIGHT JOIN Files ON Messages.fid=Files.fid WHERE Messages.fid IS NULL

    În acest fel vom obține următoarele date:

    mijlocul corpul textului fid cale
    NUL NUL 1 /fișiere/1.png

    RIGHT JOIN va fi necesară la afișarea tuturor fișierelor atașate care nu sunt atașate la niciun mesaj. De exemplu, dacă vrem să afișăm fișiere care nu sunt utilizate.

    UNIRE EXTERIOR COMPLET

    În ciuda faptului că în Limbajul SQL Există un FULL OUTER JOIN, dar MySQL nu are acest operator. Faptul este că un astfel de operator este o sarcină uriașă pe server. Acum avem 3 fișiere și 3 mesaje, în timp ce în urma solicitării se formează 4 rânduri. Nu sunt sigur ce este bună idee scrieți o interogare care oferă împreună două interogări LEFT JOIN și RIGHT JOIN. Dar este încă posibil să se emuleze o solicitare FULL OUTER JOIN.

    Tabel cu mesaje:

    Emularea unei cereri cu FULL OUTER JOIN ar fi după cum urmează:

    SELECT * FROM Mesaje LEFT JOIN Fișiere ON Messages.fid = Files.fid UNION SELECT * FROM Mesaje RIGHT JOIN Fișiere ON Messages.fid = Files.fid

    În această interogare, folosim operatorul UNION pentru a uni două interogări LEFT JOIN și RIGHT JOIN.

    Ca urmare, vom primi următoarele înregistrări:

    mijlocul corpul textului fid cale
    1 Test 2 /fișiere/2.png
    2 Bună NUL NUL
    3 Buna ziua 3 /fișiere/3.png
    NUL NUL 1 /fișiere/1.png

    Și aici îmi este greu să spun de ce este necesară o FULL OUTER JOIN. Dar, deoarece este în SQL, probabil că va fi necesar mai târziu.

    UNIRE EXTERIOR COMPLET fără intersecții

    Un alt tip de JOIN este chiar mai nebun decât FULL OUTER JOIN, și anume FULL OUTER JOIN fără intersecții. Nici măcar nu pot sugera unde poate fi folosit acest tip de JOIN. Pentru că, drept rezultat, primim fișiere care nu sunt folosite și mesaje fără fișiere. Și după cum probabil ați ghicit deja, acest operator nu este nici în MySQL. Tot ce rămâne este să-l emulați folosind doi operatori: LEFT JOIN fără enumerații și RIGHT JOIN fără intersecții.

    Emularea unei solicitări FULL OUTER JOIN fără intersecții:

    $sql = "SELECT * FROM Messages LEFT JOIN Files ON Messages.fid = Files.fid WHERE Files.fid IS NULL UNION SELECT * FROM Messages RIGHT JOIN Files ON Messages.fid = Files.fid WHERE Messages.fid IS NULL";

    Ca rezultat (tabelele sursă sunt aceleași ca în exemplul cu FULL OUTER JOIN) obținem:

    mijlocul corpul textului fid cale
    2 Bună NUL NUL
    NUL NUL 1 /fișiere/1.png

    Probabil asta e tot, în lecțiile următoare vom începe să scriem interogări și mai complexe la mai multe tabele deodată.

    Deși poate fi aplicat și la dezvoltarea standardului produse software, Pentru uz local. Dar nu despre asta va vorbi acest articol.

    Adesea, atunci când lucrați cu baze de date în fiecare limbă, sarcina este de a face o selecție de date pentru afișare în diferite rapoarte, grafice și așa mai departe. De regulă, atunci când implementați acest tip de sarcină, trebuie să utilizați nu unul, ci mai multe tabele, combinându-le într-o singură interogare, complicând semnificativ proiectarea acesteia. În acest caz, este necesar să se ia în considerare modul în care vor fi scoase datele, modul în care tabelele vor fi „trase” și ce rezultat va fi cel mai acceptabil pentru programator. Pentru a rezolva astfel de probleme, se folosește unul dintre modelele standard limbajul MySQL- A te alatura.

    Conceptul cuvântului Join

    Limbile de dezvoltare a bazelor de date, indiferent de ce fel de limbă este, se bazează pe cuvinte standard din dicționarele engleze (de aceea, cu condiția să știți Limba engleză, îți va fi mult mai ușor să lucrezi cu tabele). Pentru a implementa conexiunea tabelelor la selecție, se folosește același cuvânt - Join. Limbajul de programare a bazei de date folosește My SQL. Traducerea acestui cuvânt funcțional este exact aceeași ca în limba însăși - „unificare”.

    Interpretarea constructului MySQL - Join și oricare dintre ele, va fi exact aceeași. Dacă descifrăm scopul construcției, și anume schema funcționării acesteia, obținem următorul sens: construcțiile vă vor permite să colectați câmpurile necesare din mese diferite sau interogări imbricate într-o singură selecție.

    Tipuri de structuri pentru combinare

    Dacă un programator trebuie să colecteze o probă din mai multe tabele și știe care câmpuri cheieîn ele și ce date sunt necesare pentru raport, atunci puteți utiliza una dintre principalele structuri de îmbinare pentru a obține rezultatul dorit. Există patru construcții principale (pentru îmbinarea meselor):

  • Îmbinare interioară.
  • Cross Join.
  • Alăturare stânga.
  • Alăturați-vă dreapta.
  • În funcție de sarcina la îndemână, fiecare dintre modelele standard va oferi rezultate diferite, ceea ce vă va permite să primiți rapoarte despre parametri diferiți in scurt timp.

    Crearea și completarea tabelelor pentru utilizare ulterioară

    Înainte de a începe, de exemplu, să luăm în considerare mecanismele de lucru cu constructele de agregare a datelor, merită să pregătim mai multe tabele cu care vom lucra în viitor. Acest lucru va ajuta la arătarea clară a tuturor principiilor de funcționare ale operatorilor, în plus, în acest fel, începătorii vor învăța mai ușor toate elementele de bază ale programării tabelelor.

    Primul tabel va descrie câteva dintre obiectele pe care o persoană le întâlnește constant de-a lungul vieții.

    În al doilea tabel vom descrie câteva proprietăți ale obiectelor din primul tabel, astfel încât să puteți lucra cu ele în viitor.

    În general, două tabele vor fi suficiente pentru a arăta cum funcționează cu un exemplu. Acum putem începe o examinare practică a proiectelor noastre.

    Folosind Inner Join

    Când utilizați construcția MySQL - Join Ineer, merită să luați în considerare unele dintre caracteristicile sale. Acest design vă va permite să selectați din ambele tabele numai acele înregistrări care se află atât în ​​primul cât și în cel de-al doilea tabel. Cum functioneaza? În primul tabel avem o cheie principală - ID, care indică numărul de serie al înregistrărilor din tabel.

    La crearea unui al doilea tabel, aceeași cheie este folosită ca număr de secvență; un exemplu poate fi văzut în imagini. La selectarea datelor Selectați operatorul Ca rezultat, va determina numai acele înregistrări ale căror numere de serie se potrivesc - ceea ce înseamnă că se află atât în ​​primul cât și în cel de-al doilea tabel.

    Când utilizați designul, trebuie să înțelegeți exact ce date trebuie să obțineți. Cea mai frecventă greșeală, în special în rândul unui programator începător, este utilizarea irațională și incorectă a construcției Inner Join. Cum putem considera un script care ne va returna informații despre obiecte și proprietățile lor din tabelele descrise și completate anterior. Dar aici pot exista mai multe moduri de a folosi structura. În acest sens, My SQL este un limbaj foarte flexibil. Deci, putem privi exemple de utilizare MySQL Inner Join.

    Combinarea tabelelor fără a specifica niciun parametru. În acest caz, vom obține următorul rezultat:

    Dacă indicăm prin cuvântul auxiliar Folosind că este necesar să luăm în considerare principalele chei ale înregistrărilor din tabele, atunci rezultatul selecției se va schimba dramatic. În acest caz, vom obține o selecție care va returna doar acele rânduri care au aceleași chei primare.

    O a treia opțiune de utilizare a construcției este, de asemenea, posibilă, atunci când interogarea folosește cuvântul „on” pentru a indica câmpurile prin care tabelele ar trebui îmbinate. În acest caz, selecția va returna următoarele date:

    Caracteristicile utilizării Left Join

    Dacă luăm în considerare o altă modalitate de a uni tabele folosind constructul MySQL - Join, veți observa o diferență în datele care sunt ieșite. Un astfel de mecanism este constructul stânga.

    Utilizarea constructului MySQL Left Join are unele particularități și, la fel ca Inner, necesită o înțelegere clară a rezultatului care trebuie obținut.

    ÎN în acest caz,În primul rând, toate înregistrările din primul tabel vor fi selectate, iar apoi înregistrările din al doilea tabel de proprietăți vor fi atașate acestora. Mai mult decât atât, dacă primul tabel are o înregistrare, de exemplu, „scaun”, iar cel de-al doilea tabel nu are o singură proprietate pentru acesta, atunci operatorul Left va scoate în fața acestei înregistrări valoare nulă, care îi spune programatorului că nu există semne pentru acest tip de articol.

    Utilizarea acestui design vă va permite să determinați care câmpuri sau, de exemplu, produsele dintr-un magazin nu au preț și așa mai departe.

    Exemplu din stânga

    Pentru a lua în considerare operatorul de construcție Left Join MySQL în practică, folosim tabelele descrise anterior. Să presupunem că trebuie să selectați întreaga listă de produse care se află în magazin și să verificați care dintre ele nu au semne sau proprietăți. În acest caz, selecția va afișa toate produsele, iar cele care nu au o proprietate vor avea valori goale.

    Utilizarea Where într-o clauză Join

    Ca parametru, o îmbinare poate include nu numai indicații ale câmpurilor prin care tabelele trebuie conectate, ci poate include și un operator de condiție Where.

    De exemplu, luați în considerare un script care ar trebui să ne returneze numai acele înregistrări pentru care nu este specificat atributul. În acest caz, trebuie să adăugați un operator de condiție la constructul Join și să indicați exact ce trebuie returnat ca rezultat.

    Când utilizați Join - Where in MySQL, trebuie să înțelegeți clar că numai acele înregistrări pentru care se aplică condiția specificată vor fi afișate, iar selecția va arăta astfel:

    Astfel de interogări vă permit să faceți selecții bazate pe date specifice care se referă la condiția selectată de programator. Puteți specifica mai multe astfel de condiții, maximizând în același timp parametrii pentru selectarea datelor din tabelele îmbinate.

    Utilizarea Join pentru a modifica datele din tabele

    Construcția Join este în esență universală. Vă permite nu numai să faceți diverse selecții, ci și să conectați de la unul la mai multe tabele la interogări, introduceți conditii suplimentare la proba. Construcția poate fi folosită și pentru alte operațiuni de date. Astfel, Join poate fi folosit pentru a modifica datele dintr-un tabel. Sau mai degrabă, pentru a clarifica condițiile din tabel sau în cazurile în care trebuie să actualizați datele din mai multe tabele conform acelorași condiții.

    De exemplu, luați în considerare următoarea problemă. Sunt date trei tabele care conțin unele date. Trebuie să modificați datele din ambele tabele folosind o singură interogare. Tocmai pentru a rezolva acest tip de sarcină puteți utiliza construcția Join în comanda Update. Tipul construcției Join în sine depinde, la fel ca și în cazul eșantionării datelor, de rezultatul pe care programatorul dorește să-l obțină.

    Să ne uităm la cel mai simplu exemplu. Trebuie să actualizați datele folosind aceleași condiții cu o singură solicitare. Aceste tipuri de interogări sunt create pentru a optimiza lucrul cu baza de date. De ce să scrieți interogări diferite pentru fiecare tabel dacă puteți efectua toate manipulările de date cu o singură interogare? Exemplul Join în cazul nostru va fi astfel:

    Constructie interogări complexe

    Destul de des, atunci când lucrați cu o bază de date, este necesar să construiți interogări nu numai prin unirea mai multor tabele, ci și folosind subinterogări. Astfel de sarcini sunt destul de dificil de înțeles pentru un programator de baze de date începător. Dificultatea este că trebuie să vă gândiți la fiecare pas, să determinați ce date trebuie obținute din care tabel sau interogare și cum va trebui să lucrați cu ele în viitor.

    Pentru o înțelegere mai specifică, puteți lua în considerare (în MySQL Join) exemple de interogări complexe. Dacă sunteți începător și abia începeți să lucrați cu baze de date, atunci o astfel de pregătire va fi doar benefică. Opțiunea ideală ar fi

    Această interogare va returna 58 de înregistrări ale contractelor de vânzare pentru care este completat sau există un sold Bani la data selectată. În acest caz este Data curentă. La selecție a fost adăugată și o condiție ca numele contractului să conțină simbolurile „123”. Informațiile (datele) afișate pe ecran vor fi sortate - ordonate după numărul de contract.

    Următorul exemplu va afișa date despre toate plățile, care vor indica numărul contractului.

    Utilizarea subinterogărilor

    După cum am menționat mai devreme, atunci când lucrați cu baze de date, vă puteți alătura nu numai tabelelor, ci și unui tabel cu o interogare. Acest design este folosit în principal pentru a accelera interogarea și pentru a o optimiza.

    De exemplu, dacă trebuie să selectați doar două câmpuri dintr-un tabel care are câteva sute de câmpuri și, de exemplu, o mie de înregistrări, atunci ar trebui să utilizați o interogare care va returna doar câmpurile necesare și o va combina cu selecția principală a datelor. Cum Exemplu MySQL Join Select puteți lua în considerare o interogare de acest tip:

    Acestea nu sunt toate modalitățile de a folosi constructele MySQL standard, ci doar cele standard. Cum să utilizați constructul Join și în ce tipuri este la latitudinea programatorului să decidă, dar merită să ne amintim și să luați în considerare ce fel de rezultat ar trebui obținut la executarea interogării.

    Ultima actualizare: 1/11/2015

    Una dintre principalele moduri prin care un site web transmite date este prin procesarea formularelor. Formularele reprezintă elemente de markup HTML speciale care conțin diverse elemente de intrare - câmpuri de text, butoane etc. Și cu ajutorul acestor formulare putem introduce niște date și le trimitem la server. Și serverul procesează deja aceste date.

    Crearea formularelor constă din următoarele aspecte:

      Crearea unui element în markup HTML

      Adăugați unul sau mai multe câmpuri de intrare la acest element

      Setarea metodei de transfer de date: GET sau POST

      Setarea adresei la care vor fi trimise datele introduse

    Deci haideți să creăm uniforma noua. Pentru a face acest lucru, definim fișier nou form.php , în care vom plasa următorul conținut:

    Autentificare pe site Logare:

    Parola:

    Atributul action="login.php" al elementului de formular indică faptul că datele din formular vor fi procesate de script login.php, care va fi localizat împreună cu fișierul formular.phpîntr-un singur folder. Iar atributul method="POST" indică faptul că metoda POST va fi utilizată ca metodă de transfer de date.

    Acum să creăm un fișier login.php, care va avea următorul conținut:

    Pentru a obține datele formularului, se folosește variabila globală $_POST. Ea reprezintă matrice asociativă datele transferate prin metoda POST. Folosind cheile putem obține valorile trimise. Cheile din această matrice sunt valorile atributelor de nume ale câmpurilor de introducere a formularului.

    Deoarece atributul numelui câmpul de intrare pentru autentificare are valoarea login(), apoi în matricea $_POST valoarea acestui câmp va reprezenta cheia "login": $_POST["login"]

    Și deoarece pot exista situații în care câmpul de intrare nu va fi setat, de exemplu, când mergeți direct la script: http://localhost:8080/login.php. În acest caz, este recomandabil să verificați disponibilitatea datelor folosind funcția isset() înainte de procesarea datelor. Și dacă variabila este setată, atunci funcția isset() va returna true .

    Acum putem accesa formularul:

    Și la un clic pe un buton, datele introduse metoda POST va fi trimis la scenariu login.php:

    Nu este necesar să trimiteți datele formularului către alt script; puteți procesa datele formularului în același fișier de formular. Pentru a face acest lucru, să schimbăm fișierul formular.php in felul urmator:

    Autentificare pe site Logare:

    Parola:

    Securitatea datelor

    Securitatea datelor este de mare importanță în PHP. Să ne uităm la câteva mecanisme simple care pot îmbunătăți securitatea site-ului nostru.

    Dar mai întâi, să luăm forma din subiectul anterior și să încercăm să introducem câteva date în ea. De exemplu, să introducem „alert(hi);” în câmpul de conectare și „parolă” în câmpul pentru parolă:

    După trimiterea datelor către marcaj html va fi implementat cod javascript, care afișează o casetă de mesaj.

    A evita probleme similare Pentru a fi în siguranță, ar trebui să utilizați funcția htmlentities():

    If(isset($_POST["login"]) && isset($_POST["parolă"]))( $login=htmlentities($_POST["login"]); $parolă = htmlentities($_POST["parolă" ]); echo „Autentificarea dvs.: $login
    Parola dvs.: $parola"; )

    Și chiar și după ce a intrat cod html sau javascript toate etichetele vor fi eliminate și vom obține următoarea ieșire:

    O altă funcție - funcția strip_tags() vă permite să excludeți complet etichetele html:

    If(isset($_POST["login"]) && isset($_POST["parolă"]))( $login=strip_tags($_POST["login"]); $parolă = strip_tags($_POST["parolă" ]); echo „Autentificarea dvs.: $login
    Parola dvs.: $parola"; )

    Rezultatul funcționării sale cu aceeași intrare va fi următoarea ieșire.