Optimaal gebruik van MySQL. MySQL-functies en -toepassingen

Van de auteur: Ben je een theepot genoemd? Nou, dit is op te lossen! Elke samovar was ooit een theepot! Of was elke professional ooit een samovar? Nee, er is weer iets mis! Al met al is MySQL voor beginners.

Waarom dummies MySQL nodig hebben

Als je serieus je leven gaat verbinden met internet, dan kom je bij de allereerste stappen in het "web" dit DBMS tegen. MySQL kan gerust het "all Internet" databasebeheersysteem worden genoemd. Geen enkele min of meer serieuze bron kan zonder, het is aanwezig in het beheerderspaneel van elke hosting. En vooral populaire CMS en zelfs zelfgemaakte engines worden met haar deelname gebouwd.

Over het algemeen kun je niet zonder dit platform. Maar om het te bestuderen, heb je ook de juiste aanpak, de juiste tools en vooral verlangen en geduld nodig. Ik hoop dat je veel van de laatste hebt. En wees voorbereid op het feit dat je hersenen gaan koken, en stoom uit je hoofd zal tuimelen, zoals uit een echte theepot

Maar MySQL is alleen zo moeilijk voor dummies als je het verkeerd begint te leren. We zullen zo'n fout niet maken en we zullen vanaf het begin kennis maken met deze technologie.

Basisconcepten

Laten we eerst de basisconcepten doornemen die we in dit bericht zullen noemen:

Database (DB) is de belangrijkste samenstellende eenheid van het DBMS. De database bevat tabellen die bestaan ​​uit kolommen en records (rijen). De cellen die op de kruising worden gevormd, bevatten gestructureerde gegevens van een bepaald type.

DBMS (databasebeheersysteem) - een set van alle softwaremodules voor databasebeheer.

SQL is een gestructureerde querytaal, met behulp waarvan de ontwikkelaar "communiceert" met de kern (server) van het DBMS. Zoals elke programmeertaal heeft SQL zijn eigen syntaxis, een reeks opdrachten en operators, ondersteunde gegevenstypen.

Ik denk dat we voldoende theoretische kennis hebben om mee te beginnen. We zullen de ontbrekende gaten in theorie met de praktijk "schilderen". Nu hoeft u alleen nog de juiste softwaretool te kiezen.

Het juiste gereedschap vinden

Na vrij veel te hebben "gerommeld" in het hele assortiment MySQL-shells voor beginners, realiseerde ik me dat deze gewoon niet bestaan. Alle softwareproducten voor DBMS-beheer vereisen een reeds geïnstalleerde databaseserver. Over het algemeen besloot ik nogmaals om de "scooter" niet opnieuw uit te vinden en koos ik voor het binnenlandse Denwer-pakket. Je kunt het downloaden op de officiële website.

Het bevat al alle componenten van het DBMS, waardoor een beginner onmiddellijk na een eenvoudige en begrijpelijke installatie praktische kennis kan maken met MySQL. Daarnaast bevat Denwer verschillende andere tools die nodig zijn voor een beginnende ontwikkelaar: lokale server, PHP.

Eerste stappen

Ik zal het installatieproces van de "gentlemen's" -set niet beschrijven, omdat daar alles automatisch gebeurt. Na het starten van de instalah, heb je alleen tijd om op de benodigde toetsen te drukken. Precies wat je nodig hebt in de dummy-versie van MySQL.

Wanneer het installatieproces voorbij is, start u de lokale server, wacht een paar seconden. Typ daarna localhost in de adresbalk van uw browser.

Op de pagina "Hoera, het werkt!" volg een van de links in de afbeelding. Vervolgens wordt u naar phpMyAdmin geleid - een shell voor databasebeheer.

Als u op de link http://downloads.mysql.com/docs/world.sql.zip klikt, downloadt u een voorbeeldtestdatabase van de officiële MySQL-website. Ga opnieuw naar phpMyAdmin, ga in het hoofdmenu bovenaan naar het tabblad "Importeren". Stel in het venster "Importeren naar huidig" in het eerste gedeelte ("Bestand om te importeren") de waarde "Bladeren op uw computer" in.

Selecteer in het verkennervenster het archief met de gedownloade voorbeelddatabase. Vergeet niet op "Ok" te klikken onderaan het hoofdvenster.

Ik raad je aan om de opgegeven parameterwaarden voorlopig niet te wijzigen. Dit kan leiden tot een onjuiste weergave van de gegevens van de geïmporteerde bron. Als phpMyAdmin een foutmelding geeft dat het het databasecompressiealgoritme niet kan herkennen, pak het dan uit en herhaal het hele importproces vanaf het begin.

Als alles goed is gegaan, dan verschijnt bovenaan de programmamelding dat de import is gelukt, en links in de DB-lijst staat er nog een (woord).

Laten we de structuur van binnenuit bekijken, zodat u zich beter kunt voorstellen waar u mee te maken krijgt.

Klik op de naam van MySQL Database for Beginners. Een lijst met tabellen waaruit het bestaat, wordt eronder weergegeven. Klik op een van hen. Ga dan naar het bovenste menu-item "Structuur". Het hoofdwerkgebied toont de structuur van de tabel: alle kolomnamen, gegevenstypen en alle attributen.

Databasebewerkingen worden vaak een knelpunt bij de implementatie van een webproject. Optimalisatieproblemen zijn in dergelijke gevallen niet beperkt tot de databasebeheerder. Programmeurs moeten tabellen goed structureren, betere query's schrijven en beter presterende code schrijven. Dit artikel geeft een korte lijst van MySQL-optimalisatietechnieken voor programmeurs.

1. Optimaliseer uw zoekopdrachten voor de querycache.

De meeste MySQL-servers gebruiken querycaching. Het is een van de meest effectieve prestatieverhogende technieken die de database-engine op de achtergrond draait. Als de query vele malen wordt uitgevoerd, begint de cache te worden gebruikt om het resultaat te verkrijgen en is de bewerking veel sneller.

Het probleem is dat het zo eenvoudig is en toch verborgen voor de ontwikkelaar, en de meeste programmeurs negeren deze geweldige kans om de projectprestaties te verbeteren. Bepaalde activiteiten kunnen tijdens runtime belemmeringen vormen voor het gebruik van de querycache.

// De querycache WERKT NIET $ r = mysql_query ("SELECT gebruikersnaam FROM gebruiker WHERE signup_date> = CURDATE ()"); // Cache aanvragen WERKT! $ vandaag = datum ("J-m-d"); $ r = mysql_query ("SELECT gebruikersnaam FROM gebruiker WHERE signup_date> =" $ vandaag "");

De reden waarom de querycache in het eerste geval niet werkt, is vanwege het gebruik van de functie CURDAAT ()... Deze benadering wordt gebruikt voor alle niet-deterministische functies zoals NOW (), RAND (), enz. Aangezien het resultaat van de functie kan veranderen, besluit MySQL deze query niet in de cache op te slaan. Het enige dat nodig is om de situatie op te lossen, is door vóór het verzoek een extra regel PHP-code toe te voegen.

2. Gebruik EXPLAIN voor uw SELECT-query's

Het gebruik van het trefwoord EXPLAIN kan u helpen een beeld te krijgen van wat MySQL doet om aan uw vraag te voldoen. Deze afbeelding maakt het gemakkelijk om knelpunten en andere problemen in query's of tabelstructuur te identificeren.

Het resultaat van een EXPLAIN-query laat zien welke indexen in gebruik zijn, hoe de tabel wordt gescand en gesorteerd, enzovoort.

Neem een ​​SELECT-query (bij voorkeur complex, met een JOIN), voeg het EXPLAIN-sleutelwoord ervoor toe. U kunt hiervoor gebruik maken van PhpMyAdmin. Zo'n query zal het resultaat naar een mooie tabel sturen. Laten we zeggen dat we zijn vergeten een index toe te voegen aan de kolom die wordt gebruikt voor de JOIN:

Na het toevoegen van de index voor het group_id veld:

In plaats van 7883 rijen te scannen, worden nu alleen 9 en 16 rijen van twee tabellen gescand. Een goede methode om de prestaties te evalueren, is door alle getallen in de kolom 'rijen' te vermenigvuldigen. Het resultaat is ongeveer evenredig met de hoeveelheid gegevens die wordt verwerkt.

3. Gebruik LIMIT 1 als je een unieke string nodig hebt

Soms weet u tijdens het gebruik van een zoekopdracht al dat u naar slechts één rij zoekt. U kunt een uniek record krijgen, of u kunt eenvoudig controleren op het bestaan ​​van een willekeurig aantal records dat voldoet aan de WHERE-clausule.

In een dergelijk geval kan het toevoegen van LIMIT 1 aan uw zoekopdracht de prestaties verbeteren. Onder deze voorwaarde stopt de database-engine met het scannen van records zodra hij er een vindt en doorloopt hij niet de hele tabel of index.

// Is er een gebruiker uit Alabama? // Doe dit niet: $ r = mysql_query ("SELECT * FROM user WHERE state =" Alabama ""); if (mysql_num_rows ($ r)> 0) (// ...) // Dit is veel beter: $ r = mysql_query ("SELECT 1 FROM user WHERE state =" Alabama "LIMIT 1"); if (mysql_num_rows ($ r)> 0) (// ...)

4. Index zoekvelden

Indexeer meer dan primaire en unieke sleutels. Als er kolommen in uw tabel worden gebruikt voor zoekopdrachten, moeten deze worden geïndexeerd.

Zoals u kunt zien, is deze regel ook van toepassing op zoekopdrachten binnen een deel van een tekenreeks, bijvoorbeeld "achternaam LIKE' a% '". Wanneer het begin van een string wordt gebruikt voor zoekopdrachten, kan MySQL de index gebruiken van de kolom die wordt doorzocht.

U moet ook uitzoeken voor welke soorten zoekopdrachten u geen reguliere indexering kunt gebruiken. Als u bijvoorbeeld zoekt op het woord (“WHERE post_content LIKE‘% apple% ’’ ”), zijn de voordelen van indexering niet beschikbaar. In dergelijke gevallen is het beter om mysql full text search te gebruiken of uw eigen op indexering gebaseerde oplossingen te bouwen.

5. Indexeren en dezelfde typen gebruiken voor gekoppelde kolommen

Als uw toepassing veel JOIN-query's bevat, moet u de kolommen indexeren die in beide tabellen zijn gekoppeld. Dit heeft effect op de interne optimalisaties van MySQL-bindingen.

Ook moeten de te binden kolommen van hetzelfde type zijn. Als u bijvoorbeeld een DECIMAL-kolom koppelt aan een INT-kolom uit een andere tabel, kan MySQL de index niet gebruiken op ten minste één van de twee tabellen. Zelfs de tekencodering moet hetzelfde zijn voor kolommen van hetzelfde tekenreekstype.

// Zoek naar een bedrijf uit een specifieke staat $ r = mysql_query ("SELECT company_name FROM users LEFT JOIN companies ON (users.state = companies.state) WHERE users.id = $ user_id"); // beide statuskolommen moeten geïndexeerd zijn // en beide moeten van hetzelfde type en tekencodering zijn // of MySQL zal een volledige tabelscan uitvoeren

6. Gebruik geen ORDER BY RAND ()

Dit is een van die coole trucs en veel beginnende programmeurs lopen in de val. Ze kunnen zich niet eens voorstellen wat een verschrikkelijk probleem ze voor zichzelf creëren door deze uitdrukking in hun vragen te gebruiken.

Als u rijen echt willekeurig wilt verdelen als resultaat van uw zoekopdracht, zijn er veel betere manieren om dit te doen. Dit gebeurt natuurlijk met extra code, maar u wordt gered van een probleem dat exponentieel groeit met de groei van gegevens. Dit komt omdat MySQL een RAND ()-bewerking uitvoert (wat CPU-tijd kost) op elke afzonderlijke rij in de tabel voordat deze wordt gesorteerd en u slechts één rij krijgt.

// Dit is NIET NOODZAKELIJK: $ r = mysql_query ("SELECTEER gebruikersnaam UIT gebruiker BESTELLEN OP RAND () LIMIET 1"); // Dit werkt beter: $ r = mysql_query ("SELECT count (*) FROM user"); $ d = mysql_fetch_row ($ r); $ rand = mt_rand (0, $ d - 1); $ r = mysql_query ("SELECT gebruikersnaam FROM gebruiker LIMIT $ rand, 1");

Dit geeft u een willekeurig getal dat kleiner is dan het aantal rijen in de query en gebruikt dat als een offset in de LIMIT-component.

7. Probeer SELECT * niet te gebruiken

Hoe meer gegevens uit de tabel worden gelezen, hoe langzamer de query wordt uitgevoerd. Dergelijke bewerkingen nemen ook tijd in beslag om schijfbewerkingen te voltooien. En als de databaseserver gescheiden is van de webserver, dan wordt ook latentie veroorzaakt door de overdracht van gegevens over het netwerk tussen de servers.

Het is een goede gewoonte om bij SELECT een kolom op te geven.

// Slecht: $ r = mysql_query ("SELECT * FROM gebruiker WHERE user_id = 1"); $ d = mysql_fetch_assoc ($ r); echo "Welkom ($ d [" gebruikersnaam "])"; // Dit is beter: $ r = mysql_query ("SELECT gebruikersnaam FROM gebruiker WHERE user_id = 1"); $ d = mysql_fetch_assoc ($ r); echo "Welkom ($ d [" gebruikersnaam "])"; // Het verschil wordt significant bij grote hoeveelheden gegevens

8. Probeer het id-veld overal te gebruiken

Het is een goede gewoonte om in elke tabel een id-veld te gebruiken dat is ingesteld op PRIMARY KEY, AUTO_INCREMENT en van het type INT. Bij voorkeur NIET ONDERTEKEND, aangezien de waarde in dit geval niet negatief kan zijn.

Zelfs als uw tabel een veld heeft met een unieke gebruikersnaam, moet u dit niet de primaire sleutel maken. VARCHAR-velden werken traag als primaire sleutels. Ook zal de structuur van uw database beter zijn als u verwijzingen naar records gebruikt op basis van de id erin.

Bovendien gebruikt de MySQL-engine primaire sleutels voor zijn interne taken, en het gebruik van het id-veld schept optimale voorwaarden voor hun oplossing.

Een mogelijke uitzondering op deze regel zijn 'associatieve tabellen', die worden gebruikt voor veel-op-veel-relaties tussen twee andere tabellen. De tabel "posts_tags" bevat bijvoorbeeld 2 kolommen: post_id, tag_id. Ze worden gebruikt om de relatie tussen twee tabellen "post" en "tags" te beschrijven. De beschreven tabel kan een primaire sleutel hebben die beide id-velden bevat.

9. Gebruik ENUM in plaats van VARCHAR

// Maak een voorbereid statement if ($ stmt = $ mysqli-> prepare ("SELECT gebruikersnaam FROM gebruiker WHERE state =?")) (// Bind parameters $ stmt-> bind_param ("s", $ state); // Execute $ stmt-> execute (); // Bind de resultaatvariabelen $ stmt-> bind_result ($ gebruikersnaam); // Haal de waarden $ stmt-> fetch (); printf ("% s is from% s \ n", $ gebruikersnaam , $ staat); $ stmt-> sluiten ();)

13. Niet-gebufferde verzoeken

Wanneer u een verzoek van een script uitvoert, wordt het script doorgaans onderbroken totdat het verzoek is voltooid. Deze volgorde kan worden gewijzigd met behulp van niet-gebufferde verzoeken.

Geweldige uitleg van de functie mysql_unbuffered_query () uit PHP-documentatie:

“Mysql_unbuffered_query () stuurt een SQL-query naar de MySQL-server zonder automatisch resultaatrijen op te halen en te bufferen, zoals de functie mysql_query () doet. Dit bespaart een bepaalde hoeveelheid geheugen bij SQL-query's die een grote set resultaten opleveren, en je kunt aan de resultatenset gaan werken zodra de eerste rij is ontvangen, zonder te wachten tot de SQL-query is voltooid. ”

Er zijn echter verschillende beperkingen. U moet ofwel alle regels lezen of mysql_free_result () aanroepen voordat u de volgende query uitvoert. Ook kunt u mysql_num_rows () of mysql_data_seek () niet gebruiken voor een resultatenset.

14. Sla het IP-adres op als UNSIGNED INT

Veel programmeurs maken een VARCHAR (15)-veld om een ​​IP-adres op te slaan, zonder zelfs maar na te denken over wat ze een geheel getal in dit veld zullen opslaan. Als u INT gebruikt, wordt het veld verkleind tot 4 bytes en heeft het een vaste lengte.

U moet het UNSIGNED INT-type gebruiken, aangezien het IP-adres alle 32 bits van een niet-ondertekend geheel getal gebruikt.

$ r = "UPDATE gebruikers SET ip = INET_ATON (" ($ _ SERVER ["REMOTE_ADDR"]) ") WAAR user_id = $ user_id";

15. Tabellen met vaste recordlengte (Statisch) zijn sneller

Wanneer elke afzonderlijke kolom in een tabel een vaste lengte heeft, wordt de hele tabel als geheel als "statisch" of "vaste lengte" beschouwd. Voorbeelden van kolomtypen die geen vaste lengte hebben: VARCHAR, TEXT, BLOB. Als u ten minste één kolom van dit type opneemt, wordt de tabel niet langer als "statisch" beschouwd en wordt deze anders behandeld door de MySQL-engine.

"Statische" tabellen worden sneller verwerkt door de MySQL-engine bij het opzoeken van records. Wanneer u een specifiek record in de tabel moet lezen, wordt de positie snel berekend. Als de grootte van de string niet vaststaat, kost het tijd om de positie van het record te vinden en te matchen met de index van de primaire sleutel.

Dergelijke tabellen zijn ook gemakkelijker te cachen en gemakkelijker te herstellen van fouten. Maar ze kunnen meer ruimte innemen. Als u bijvoorbeeld een VARCHAR (20)-veld converteert naar een CHAR (20)-veld, dan zullen altijd 20 bytes bezet zijn, ongeacht of ze worden gebruikt of niet.

Met de Vertical Split-techniek kunt u kolommen met variabele lengte in een aparte tabel splitsen.

16. Verticale scheiding

Verticaal splitsen is het verticaal splitsen van een tabelstructuur voor optimalisatiedoeleinden.

voorbeeld 1: U hebt een tabel met thuisadressen die zelden in een toepassing worden gebruikt. U kunt uw tafel splitsen en de adressen in een aparte tabel opslaan. Hierdoor wordt de hoofdgebruikerstabel kleiner. Zoals u weet, wordt een kleinere tabel sneller verwerkt.

Voorbeeld 2: U hebt een veld "last_login" in uw tabel. Het wordt elke keer dat een gebruiker zich op de site registreert bijgewerkt. Maar elke update van de tabel zorgt ervoor dat de query in de cache wordt opgeslagen, wat een systeemoverbelasting kan veroorzaken. U kunt dit veld naar een andere tabel markeren om updates voor de gebruikerstabel minder frequent te maken.

Maar u moet ervoor zorgen dat u de twee tabellen die u zojuist hebt gesplitst niet permanent hoeft te koppelen, omdat dit tot prestatievermindering kan leiden.

17. Scheid grote DELETE- of INSERT-instructies

Als u een grote DELETE- of INSERT-opdracht op een live site moet uitvoeren, moet u oppassen dat u het verkeer niet verstoort. Wanneer een grote query wordt uitgevoerd, kan deze uw tabellen vergrendelen en ervoor zorgen dat de toepassing stopt.

Apache voert veel gelijktijdige processen/threads uit. om deze reden werkt het efficiënter wanneer het script zo snel mogelijk wordt uitgevoerd, zodat de server niet te veel open verbindingen en processen gebruikt die bronnen, met name geheugen, verbruiken.

Als u tabellen voor een langere periode (bijvoorbeeld 30 seconden of meer) vergrendelt op een zwaarbelaste webserver, kunt u een opeenstapeling van processen en verzoeken veroorzaken, wat een aanzienlijke hoeveelheid tijd kost om uw web Server.

Als je een script hebt dat een groot aantal records verwijdert, gebruik dan gewoon de LIMIT-clausule om het in kleine batches te splitsen om deze situatie te voorkomen.

While (1) (mysql_query ("DELETE FROM logs WHERE log_date<= "2009-10-01" LIMIT 10000"); if (mysql_affected_rows() == 0) { // выполняем удаление break; } // вы можете сделать небольшую паузу usleep(50000); }

18. Kleine kolommen worden sneller verwerkt

Voor de database-engine is schijf het belangrijkste knelpunt. Streven om dingen slanker en kleiner te houden, werkt meestal goed voor de prestaties door de hoeveelheid verplaatste gegevens te verminderen.

De MySQL-documentatie bevat een lijst met opslagstandaarden voor alle typen.

Als de tabel maar een paar rijen bevat, is er geen reden om de primaire sleutel van het type INT te maken en niet MEDIUMINT, SMALLINT of zelfs TINYINT. als je alleen een datum wilt, gebruik dan DATE in plaats van DATETIME.

U hoeft alleen maar te onthouden over de groeimogelijkheden.

19. Kies de juiste opslagengine

Er zijn twee belangrijke storage-engines voor MySQL: MyISAM en InnoDB. Elk heeft zijn eigen voor- en nadelen.

MyISAM is geweldig voor leeszware toepassingen, maar het schaalt niet goed met veel records. Zelfs als u één veld in één rij bijwerkt, is de hele tabel vergrendeld en kan geen enkel proces iets lezen totdat de query is voltooid. MyISAM voert snelle berekeningen uit voor zoekopdrachten zoals SELECT COUNT (*).

InnoDB is een complexere opslagengine en kan voor de meeste kleine toepassingen langzamer zijn dan MyISAM. Maar het ondersteunt rijvergrendeling, wat beter is voor het schalen van tabellen. Het ondersteunt ook enkele extra functies, zoals transacties.

20.Gebruik object-relationele mapping

Er zijn verschillende voordelen aan het gebruik van Object Relational Mapper (ORM). Alles wat in een ORM kan worden gedaan, kan handmatig worden gedaan, maar met meer inspanning en hogere vereisten voor ontwikkelaarsniveaus.

ORM is geweldig voor lui laden. Dit betekent dat u waarden kunt krijgen wanneer u ze nodig hebt. Maar je moet voorzichtig zijn, omdat je veel kleine query's kunt maken die de prestaties verminderen.

De ORM kan uw zoekopdrachten ook bundelen in transacties die aanzienlijk sneller zijn dan individuele databasequery's.

Voor PHP kun je ORM Doctrine gebruiken.

21. Wees voorzichtig met aanhoudende verbindingen

Permanente verbindingen zijn ontworpen om het verlies van het herstellen van verbindingen met MySQL te verminderen. Wanneer een permanente verbinding wordt gemaakt, blijft deze open, zelfs nadat het script is voltooid. Aangezien Apache onderliggende processen hergebruikt, wordt het proces uitgevoerd voor het nieuwe script en gebruikt het dezelfde MySQL-verbinding.

Dit klinkt in theorie geweldig. Maar in werkelijkheid is deze functie vanwege de problemen geen cent waard. Het kan ernstige problemen veroorzaken met verbindingslimieten, geheugenoverloop, enzovoort.

Apache werkt volgens het principe van gelijktijdigheid en creëert veel onderliggende processen. Dit is de reden waarom persistente verbindingen niet werken zoals verwacht op een bepaald systeem. Raadpleeg uw systeembeheerder voordat u de functie mysql_pconnect () gebruikt.

WERKEN MET EEN MySQL DATABASE MET PHP

Lezing. Bereid door VS Prokhorov


1. PHP-SCENARIO'S VERBINDEN MET MySQL-tabellen

Laten we eens kijken naar de meest gebruikte functies waarmee u met behulp van PHP met een MySQL-database kunt werken.

Wanneer PHP en MySQL op elkaar inwerken, werkt het programma samen met het DBMS via een reeks functies.

1.1 Verbinding maken met de server. Functie mysql_connect

Voordat u met de database gaat werken, moet u er een netwerkverbinding mee tot stand brengen en de gebruiker autoriseren. Dit wordt gedaan met behulp van de functie mysql_connect ().

bron mysql_connect (]])

Deze functie brengt een netwerkverbinding tot stand met de MySQL-database die zich op de $ serverhost bevindt (standaard is dit localhost, d.w.z. de huidige computer) en retourneert de identifier van de open verbinding. Alle verdere werkzaamheden worden met deze identifier uitgevoerd. Alle andere functies die deze identifier (descriptor) als argument gebruiken, zullen de geselecteerde database op unieke wijze identificeren. Bij het registreren worden de gebruikersnaam $ gebruikersnaam en wachtwoord $ wachtwoord opgegeven (standaard de gebruikersnaam van waaruit het huidige proces wordt gestart - bij het debuggen van scripts: root en een leeg wachtwoord):

$ dbpasswd = ""; //Wachtwoord

// Geef een waarschuwing weer

echo ("

");

De variabelen $ dblocation, $ dbuser en $ dbpasswd slaan de servernaam, gebruikersnaam en wachtwoord op.

1.2 Verbinding met de server verbreken. Functie mysql_close

De verbinding met de MySQL-server wordt automatisch gesloten wanneer het script eindigt, of wanneer de functie mysql_close wordt aangeroepen

bool mysql_close ()

Deze functie verbreekt de verbinding met de MySQL-server en retourneert waar als de bewerking is geslaagd en anders onwaar. De functie heeft als argument een ingang naar de databaseverbinding die wordt geretourneerd door de functie mysql_connect.

$ dblocation = "lokale host"; // Server naam

$ dbuser = "root"; //Gebruikersnaam

$ dbpasswd = ""; //Wachtwoord

// Maak verbinding met de databaseserver

// Onderdruk foutoutput met het @-symbool voordat u de functie oproept

$ dbcnx = @ mysql_connect ($ dblocation, $ dbuser, $ dbpasswd);

if (! $ dbcnx) // Als de descriptor 0 is, is de verbinding niet tot stand gebracht

// Geef een waarschuwing weer

echo ("

De databaseserver is momenteel niet beschikbaar, dus de pagina kan niet correct worden weergegeven.");

if (mysql_close ($ dbcnx)) // sluit de verbinding

echo ("Databaseverbinding verbroken");

echo ("Kan verbinding niet voltooien");

1.3 Aanmaken van een databank. CREATE DATABASE functie

Het commando - maak een database is alleen beschikbaar voor de serverbeheerder en kan op de meeste hostings niet worden uitgevoerd:

MAAK DATABASE Databasenaam

Maakt een nieuwe database met de naam DatabaseName.

Een voorbeeld van het werken met deze functie:

@mysql_query ("MAAK DATABASE $ dbname");

Het wordt aanbevolen om overal apostrofs ("SQL - commando") te gebruiken als scheidingstekens voor regels die SQL - commando's bevatten. Dit kan ervoor zorgen dat er geen $ - variabele per ongeluk wordt geïnterpoleerd (d.w.z. niet vervangen door zijn waarde), en de veiligheid van de scripts zal toenemen.

Het CREATE DATABASE-commando voor het maken van een database is alleen beschikbaar voor de supergebruiker en op de meeste hostingsites is het onmogelijk voor een gewone gebruiker om het uit te voeren. Het is alleen beschikbaar voor de serverbeheerder.

Laten we om te experimenteren een testbase-database maken door een SQL-query uit te voeren vanaf de opdrachtregel. Om dit te doen, moet u inloggen op MySQL en de MySQL-opdrachtregel typen:

mysql> database-testbase maken;

Daarna typt u:

mysql> gebruik testbase;

Database aangemaakt:



1.4 Databaseselectie. Functie mysql_select_db

Voordat je de eerste query naar de MySQL-server stuurt, moet je specificeren met welke database we gaan werken. De functie mysql_select_db is hiervoor bedoeld:

bool mysql_select_db (string $ database_name [, resource $ link_identifier])

Het meldt PHP dat verdere bewerkingen op de $ link_identifier-verbinding de $ database_name-database zullen gebruiken.

Het gebruik van deze functie komt overeen met het aanroepen van het use-commando in een SQL-query, dat wil zeggen, de functie mysql_select_db selecteert een database voor verder werk en alle volgende SQL-query's worden toegepast op de geselecteerde database. De functie neemt als argumenten de naam van de te selecteren database, databasenaam en de verbindingsdescriptorbron. De functie retourneert waar als de bewerking is geslaagd en anders onwaar:

// Database verbindingscode

if (! @mysql_select_db ($ dbname, $ dbcnx))

// Geef een waarschuwing weer

echo ("

De database is momenteel niet beschikbaar, dus de pagina kan niet correct worden weergegeven.");

1.5 Foutafhandeling

Als er tijdens het werken met MySQL fouten optreden (de haakjes zijn bijvoorbeeld niet gebalanceerd in de query of er zijn niet genoeg parameters), dan kunnen de foutmelding en het nummer ervan worden verkregen met behulp van de twee hieronder beschreven functies.

Het is belangrijk om deze functies zorgvuldig en tijdig te gebruiken, omdat het anders moeilijk kan zijn om uw scripts te debuggen.

● Functie:

int mysql_errno ()

retourneert het nummer van de laatste geregistreerde fout. De verbindingsidentificatie $ link_identifier kan worden weggelaten als er slechts één verbinding tot stand is gebracht tijdens de scriptbewerking.

● Functie:

tekenreeks mysql_error ()

retourneert geen getal, maar een tekenreeks die de tekst van het foutbericht bevat. Het is handig voor foutopsporingsdoeleinden. Gewoonlijk wordt mysql_error gebruikt in combinatie met de of die () constructie, bijvoorbeeld:

@mysql_connect ("localhost", "gebruiker", "wachtwoord")

of sterven ("Fout bij het verbinden met de database:" .mysql_error ());

De @-operator dient, zoals gebruikelijk, om de standaardwaarschuwing te onderdrukken die bij een fout zou kunnen optreden.

In recente versies van PHP worden MySQL-functiewaarschuwingen niet standaard vastgelegd.

1.6 De verbinding met MySQL automatiseren. Bestand ( config.php )

Meestal zijn er meerdere scripts op de site die toegang tot dezelfde database nodig hebben.

Het wordt aanbevolen om de code die verantwoordelijk is voor het verbinden met MySQL in een apart bestand te splitsen en dit vervolgens met de benodigde scripts op te nemen met behulp van de functie include.

Het is logisch om de functies voor het verbinden, selecteren en maken van een database in hetzelfde bestand (config.php) te plaatsen waar variabelen met de servernaam $ dblocation, gebruikersnaam $ dbuser, wachtwoord $ dbpasswd en databasenaam $ dbname worden gedeclareerd:

Lijst config.php:

//config.php code van het bestand met de parameters om verbinding te maken met de server en de database te selecteren

// drukt verbindingsfoutberichten af ​​naar de browser

$ dblocation = "lokale host"; // Server naam

$ dbname = "databasenaam invoegen" // Databasenaam: aangemaakt of reeds bestaand

$ dbuser = "root"; // Database gebruikersnaam

$ dbpasswd = ""; //Wachtwoord

// Maak verbinding met de databaseserver

// Onderdruk foutoutput met het @-symbool voordat u de functie oproept

[e-mail beveiligd] _connect ($ dblocation, $ dbuser, $ dbpasswd);

if (! $ dbcnx) // Als de handle 0 is, is de verbinding met de databaseserver niet tot stand gebracht

// Geef een waarschuwing weer

echo ("

De databaseserver is momenteel niet beschikbaar, dus de pagina kan niet correct worden weergegeven.

");

// Creëer database $ dbname - alleen superuser kan dit doen

// Als de database al bestaat, zal er een niet-fatale fout zijn

@mysql_query ("CREATE DATABASE indien niet bestaat $ dbname ');

// Code om verbinding te maken met de database: we selecteren ondubbelzinnig een nieuw gemaakte database of een bestaande database

// Onderdruk foutoutput met het @-symbool voordat u de functie oproept

als ( [e-mail beveiligd] _select_db ($ dbname, $ dbcnx)) // Als descriptor 0 is, is er geen databaseverbinding tot stand gebracht

// Geef een waarschuwing weer

echo ("

De database is momenteel niet beschikbaar, dus de pagina kan niet correct worden weergegeven.

");

// Een kleine hulpfunctie die een bericht afdrukt

// over een fout in het geval van een fout in de databasequery

functie puterror ($ bericht)

echo ("");



2. VERVULLING VAN VERZOEKEN AAN DE DATABANK

2.1 Een tabel maken. Functie MAAK TABEL:

MAAK TABEL Tabelnaam (Type veldnaam, type veldnaam)

Met deze opdracht wordt een nieuwe tabel in de database gemaakt met kolommen (velden) gedefinieerd door hun naam (FieldName) en de opgegeven typen. Nadat u een tabel hebt gemaakt, kunt u er records aan toevoegen, bestaande uit de velden die in deze opdracht worden vermeld.

Vermelding test_11.php. Het programma dat een nieuwe tabel in de database maakt:

include "config.php"; // Maak verbinding met de server en selecteer database

mysql_query ("CREATE TABLE indien niet bestaat mensen

id INT AUTO_INCREMENT PRIMAIRE SLEUTEL,

of sterven ("MySQL-fout:" .mysql_error ());



Dit script maakt een nieuwe tabel met personen met twee velden. Het eerste veld is van het type INT (integer) en de naam is id. De tweede is het TEXT-type (tekstreeks) en de naamnaam.

Als de tafel bestaat, zal of die () vuren.

De optionele clausule indien niet bestaat, indien opgegeven, vertelt de MySQL-server om geen foutbericht te genereren als er al een tabel met de opgegeven naam in de database bestaat.

Andrey Klochkov

Wat is MySQL

Voordat u beslist of u het MySQL-pakket als databaseserver wilt gebruiken, moet u eerst weten wat het is. MySQL is een relationeel databasebeheersysteem.

MySQL ondersteunt SQL (Structured Query Language) en kan als SQL-server worden gebruikt. Dit betekent dat je in SQL met de server kunt communiceren: de client stuurt een verzoek naar de server, de server verwerkt het en geeft de klant alleen de gegevens die naar aanleiding van dit verzoek zijn ontvangen. De klant hoeft dus geen gegevens te downloaden en berekeningen uit te voeren, zoals bijvoorbeeld in Microsoft Access.

Bovendien is MySQL open source software, d.w.z. het kan vrij worden bestudeerd en gewijzigd. Het pakket wordt gedistribueerd onder de voorwaarden van de GPL (General Public License) en kan gratis worden gedownload van internet (http://www.mysql.com) voor niet-commercieel gebruik.

Met de komst van internettechnologieën die het mogelijk maken om dynamische webpagina's te maken, is de vraag naar DBMS'en die hier qua snelheid, betrouwbaarheid en stabiliteit het meest geschikt voor zijn enorm toegenomen. En hier bleek het MySQL-pakket goed te zijn, dat snel, eenvoudig en betrouwbaar bleek te zijn, maar echter ten koste ging van de functionaliteit (laten we even een voorbehoud maken dat de MySQL-ontwikkelaars beloven de ontbrekende functies toe te voegen de volgende versies van het programma).

Over het algemeen levert het ontbreken van sommige functies die zijn opgeofferd voor snelheid en betrouwbaarheid niet veel problemen op voor gebruikers (hoewel er soms wat ongemak is). Voor het werken met een volwaardige bedrijfsdatabase schiet MySQL tekort, maar MySQL kan de dagelijkse taken redelijk goed aan.

Gebreken

Hier is een korte lijst van de belangrijkste functies die MySQL mist.

Transacties- u kunt meerdere SQL-query's combineren in één werkeenheid en, als een van de query's in deze unit mislukt, terugdraaien om de gegevens in de oorspronkelijke staat terug te brengen. Laten we het uitleggen met een voorbeeld.

Het is noodzakelijk om geld van de ene rekening op te nemen en op een andere te zetten. Om dit te doen, moet u twee SQL-query's uitvoeren: de eerste is om geld van de ene rekening op te nemen en de tweede is om ze op een andere rekening te crediteren. Als u geen transacties toepast, wordt het geld, als het tweede verzoek mislukt, van de rekening afgeschreven, maar niet op een andere rekening bijgeschreven. Door het gebruik van transacties kunt u terugdraaien, alsof het geld helemaal niet van de rekening is afgeschreven.

Merk op dat u een transactie kunt emuleren met de opdracht LOCK TABLES in MySQL. Deze opdracht vergrendelt de tabel terwijl de query's worden uitgevoerd, waardoor de gegevensintegriteit wordt gegarandeerd, maar kan nog steeds niet worden teruggedraaid.

Triggers- dienen om het toezicht op de status en werking van de database te automatiseren. De trigger wordt opgeslagen in de database en wordt geactiveerd wanneer een bepaalde gebeurtenis plaatsvindt. Laten we hetzelfde voorbeeld van geldoverdracht nemen: als het tweede verzoek mislukt, wordt een trigger geactiveerd en ofwel teruggedraaid ofwel een bericht naar de DBA gestuurd.

Opgeslagen procedures- Dit zijn meerdere SQL-commando's die onder een bepaalde naam in de database worden opgeslagen en samen een bepaalde functie vervullen. Opgeslagen procedures kunnen de SQL-syntaxis uitbreiden zodat deze lijkt op een algemene programmeertaal (zoals Oracle PL / SQL). In ons voorbeeld van geldoverdracht kunnen twee SQL-query's onder dezelfde naam worden opgeslagen en deze procedure vervolgens aanroepen, waarbij twee rekeningnummers en het geldbedrag als parameters worden doorgegeven. Dan zouden beide verzoeken in één transactie worden uitgevoerd.

Geneste zoekopdrachten- hiermee kunt u dynamisch waarden in de selectievoorwaarden vervangen op basis van de resultaten van een andere zoekopdracht. Volgens de auteur, als je op de een of andere manier zonder al het bovenstaande kunt, bederft de afwezigheid van geneste vragen het leven soms erg. Als u bijvoorbeeld wilt weten welke auto meer vracht heeft vervoerd dan het gemiddelde voor het wagenpark, moet u de volgende SQL-query uitvoeren:

KIES auto VAN autopark WAAR massa> Meer dan wat? Ik heb geen idee wat het gemiddelde is!

Hiervoor moet de gemiddelde waarde in het massaveld worden berekend:

SELECT AVG (massa) UIT autopark

Als geneste query's worden ondersteund, kunnen de twee query's worden genest:

SELECT auto FROM autopark WHERE massa> (SELECT AVG (massa) FROM autopark)

Maar in het geval van MySQL moet de gemiddelde waarde afzonderlijk worden gevonden en rechtstreeks in het CGI-script in een andere query worden vervangen, wat ongetwijfeld van invloed is op de prestaties.

UNION-verklaring- Simpel gezegd, het combineert de uitvoer van verschillende zoekopdrachten in één, met de mogelijkheid om dubbele rijen te elimineren.

Trapsgewijze gegevensvernieuwing- hiermee kunt u gerelateerde gegevens verwijderen en bijwerken. Als u bijvoorbeeld een klantrecord uit de database verwijdert, worden alle orderrecords voor die klant automatisch verwijderd uit de gerelateerde tabellen.

Voordelen:

Laten we nu de voordelen van MySQL opsommen.

Prestaties op hoge snelheid. Dankzij het interne multithreading-mechanisme zijn de MySQL-prestaties erg hoog.

Veiligheid. Een redelijk hoog beveiligingsniveau wordt geboden door de mysql-database, die wordt gemaakt wanneer het pakket wordt geïnstalleerd en vijf tabellen bevat. Aan de hand van deze tabellen kun je beschrijven welke gebruiker van welk domein met welke tabel kan werken en welke commando's hij kan gebruiken. Wachtwoorden die zijn opgeslagen in een database kunnen worden gecodeerd met behulp van de ingebouwde MySQL-wachtwoordfunctie ().

Vergunning. In het verleden was MySQL-licentieverlening een beetje verwarrend; dit programma wordt nu gratis verspreid voor niet-commerciële doeleinden.

Open source-code. Hierdoor kunt u zelf de gewenste functies aan het pakket toevoegen en de functionaliteit naar behoefte uitbreiden. Overigens kunnen de MySQL-auteurs dit tegen betaling zelf voor je doen. Om een ​​MySQL-extensie te bestellen bij de pakketmakers, gaat u gewoon naar http://www.mysql.com en vult u het juiste formulier in.

Betrouwbaarheid. De makers van MySQL hebben geweldig werk geleverd: voor zover ik weet is dit pakket vrij stabiel en moeilijk te breken. Ik volg niet specifiek de samenvatting van de resultaten van hackeraanvallen op MySQL, maar ik ben nooit (in tegenstelling tot dezelfde webservers) een bericht tegengekomen dat MySQL is beschadigd als gevolg van iemands kwade bedoelingen.

Bronnen. Dit kan van verschillende factoren afhangen, maar een supercomputer heb je sowieso niet nodig.

Gemeenschap. Als gevolg van de openheid van de code, het gratis programma, het stabiele en betrouwbare werk ervan, heeft zich een gemeenschap van mensen gevormd die niet alleen loyaal zijn aan MySQL, maar ook op alle mogelijke manieren deelnemen aan de ontwikkeling van het pakket zelf en om minder ervaren mensen ermee te leren werken. Er is een enorm aantal mailinglijsten en conferenties waar u op elk moment van de dag gratis hulp kunt krijgen.

Draagbaarheid. Momenteel zijn er versies van het programma voor de meest voorkomende computerplatforms. Dit betekent dat u niet wordt gedwongen in een specifiek besturingssysteem. Je kunt zelf kiezen waar je mee wilt werken, bijvoorbeeld met Linux of Windows, maar ook als je het besturingssysteem vervangt, raak je je data niet kwijt en heb je zelfs geen extra tools nodig om het over te zetten.

Ik weet niet of het een nadeel of een voordeel is, het feit dat MySQL geen grafische gebruikersinterface (GUI) heeft. Ik vind het bijvoorbeeld handiger om een ​​SQL-query handmatig te schrijven (de resultaten van de uitvoering ervan kunnen trouwens worden omgeleid naar een bestand) dan om de query-wizard te gebruiken, zoals in Microsoft SQL Server.

Er zijn verschillende GUI-clientprogramma's voor MySQL, maar ze zijn verre van perfect en vertragen meestal alleen maar. Als je de voorkeur geeft aan een GUI, raad ik aan deze programma's te downloaden en uit te proberen om hun makers aan te moedigen hun producten verder te verbeteren. Hier is een verre van volledige lijst van GUI-programma's:

  • Winmysqladmin - opgenomen in de Windows-distributie van MySQL, heeft een standaard grafische interface en stelt u in staat MySQL te beheren;
  • MySqlManager - opgenomen in de Windows-distributie van MySQL, heeft clientfuncties (maar de auteur was niet in staat om er iets serieus mee te doen);
  • MySQL Administrator voor Windows is een meer "geavanceerd" hulpprogramma van derden. Hiermee kunt u zich registreren en verbinding maken met meerdere MySQL-servers tegelijk, de structuur van databases en tabellen maken, verwijderen en wijzigen, sleutels in tabellen maken, SQL-query's schrijven en deze in een bestand opslaan:
  • XMySQL is een MySQL-client voor X Window-achtige systemen. Biedt volledige toegang tot tabellen, laat bulksgewijs invoegen en verwijderen toe, en heeft een queryontwerper en pakketbeheerfunctionaliteit. Het programma is te vinden op http://web.wt.net/~dblhack/.

Een meer complete lijst van allerlei hulpprogramma's voor MySQL (en het is erg groot) is te vinden op http://www.mysql.com/downloads/. Daar vind je heel wat interessante en nuttige dingen: data-export van MySQL naar Microsoft Access en vice versa, ODBC-stuurprogramma's, enz.

Ondanks het ontbreken van een grafische interface, wordt MySQL geleverd met een aantal behoorlijk krachtige beheertools voor de opdrachtregel. Hieronder vindt u een lijst met korte beschrijvingen van de hulpprogramma's.

  • MySQLAdmin is de belangrijkste MySQL-beheertool. Hiermee kunt u databases maken, vernietigen, wijzigen en heeft u volledige controle over uw server.
  • MySQLDump is een hulpprogramma voor gegevensback-up.
  • MySQLAccess - Hiermee kunt u tabellen met toegangsrechten wijzigen en hun inhoud in een gemakkelijk leesbare vorm weergeven.
  • MySQLBug - In het geval van een bug in MySQL, genereert dit hulpprogramma een bugrapport voor programmaontwikkelaars, en stuurt dit ook naar de MySQL-mailinglijst zodat specialisten kunnen helpen bij het oplossen van uw probleem.
  • MySQLImport - Importeert gegevens uit een gescheiden bestand in de database.
  • MySQLShow - toont de structuur van databases en tabellen waaruit ze zijn samengesteld.

Ik wil de aandacht van de lezer vestigen op het volgende: nu zijn er programma's die werken via de CGI-interface, die een bijna compleet pakket aan databasebeheerdiensten bieden. Deze programma's worden gehost op webservers en zijn gewoon CGI-scripts. Heel vaak bevinden deze scripts zich in openbaar toegankelijke mappen. Het gevaar is dat iedereen met behulp van zoekmachines dergelijke programma's op bestandsnaam kan vinden en vervolgens met uw database kan doen wat hun hartje begeert. Dit probleem kan eenvoudig worden omzeild door deze scripts in met een wachtwoord beveiligde mappen op de server te plaatsen. Maar de beste oplossing is om helemaal te stoppen met het gebruik van dergelijke programma's op de server.

MySQL heeft ook zijn eigen SQL-taalextensie. Deze functies kunnen op twee manieren in een query worden gebruikt. Ten eerste als een opgehaalde waarde: de functie wordt opgenomen in de lijst met opgehaalde velden. De retourwaarde van de functie wordt berekend voor elk record in de tabel en weergegeven alsof het een tabelveld is. Laten we bijvoorbeeld de titel van het artikel en de lengte ervan weergeven:

SELECT titel, LENGTH (titel) UIT tabel

Als resultaat krijgen we twee kolommen, waarvan er één uit de tabel is gehaald en de tweede is berekend.

Ten tweede kan de functie worden gebruikt als onderdeel van de WHERE-component - in dit geval zal het de constante vervangen op het moment dat de query wordt uitgevoerd. Laat me het uitleggen met een voorbeeld: je moet gebeurtenissen vinden die meer dan een dag geleden hebben plaatsgevonden.

SELECT event FROM tabel WHERE time> (Unix_TIMESTAMP () - (60 * 60 * 24))

Hier berekent de functie Unix_TIMESTAMP () de huidige tijd, waarvan we één dag aftrekken.

Sollicitatie

Volgens de auteur is internet het meest geschikte toepassingsgebied voor MySQL, dankzij het goede beveiligingssysteem van dit pakket, de stabiele werking en de hoge prestaties. Als uw internetproject geen transacties meer heeft, kunt u Postgres gebruiken. Postgres is in veel opzichten vergelijkbaar met MySQL, praktisch niet onderdoen voor prestaties, maar het heeft meer functionaliteit. De ervaring leert echter dat MySQL voldoende mogelijkheden heeft voor eenvoudige internetprojecten.

Wat betreft het gebruik van MySQL als bedrijfsdatabase is de situatie hier niet erg gunstig. We zullen de vereisten voor de SQL-server van de bedrijfsdatabase formuleren, gebaseerd op de specifieke kenmerken van het werk van medewerkers, en vanuit het oogpunt van deze vereisten MySQL evalueren.

De mogelijkheid om met meerdere gebruikers te werken. Deze voor de hand liggende eis moet worden aangevuld met het feit dat de intensiteit van het databasegebruik in dit geval veel hoger zal zijn dan op de webserver. Inderdaad, voor een website wordt 20 bezoekers tegelijkertijd als een groot succes beschouwd, en in het geval van een zakelijke basis kan zelfs een klein bedrijf bogen op een dergelijke indicator. Er moet speciale aandacht worden besteed aan het feit dat de bedrijfsdatabase complexere gebruikersinterfaces gebruikt dan de pagina's op de site; met andere woorden, het stuurt verzoeken intensiever naar de server. In technische termen betekent dit dat je een slot nodig hebt op het niveau van het veranderlijke record. Dit is waar MySQL het niet goed doet: het vergrendelen gebeurt op tafelniveau. Dit betekent met name dat als iemand een bestelling invoert, alle vragen (statistieken analyseren, records selecteren voor een rapport, etc.) moeten wachten tot de bestelling is afgerond. In het geval van een bedrijfsdatabase doet dit zelfs het prestatievoordeel van MySQL teniet.

Controle van gegevensintegriteit op SQL-serverniveau. Een bedrijfsdatabase heeft een complex gegevensschema en het is erg moeilijk om de gegevensintegriteit te handhaven door middel van een clientprogramma: één relationeel kan vijf tot zeven tabellen samenvoegen en het aantal tabellen kan oplopen tot 30-40. En in dit geval wordt het gebrek aan vermogen van MySQL om updates en verwijderingen van records in gerelateerde tabellen trapsgewijs te laten verlopen, essentieel.

Bovendien hebben we al vermeld dat de bedrijfsdatabase een complexere interface gebruikt, en deze omstandigheid genereert nog twee vereisten: ondersteuning voor alle standaard SQL-instructies (en nuttige uitbreidingen), evenals het gebruik van opgeslagen procedures en triggers. Helaas maakt MySQL ons hier ook niet blij.

Als we al het bovenstaande samenvatten, kunnen we concluderen dat voor de meeste internetprojecten de mogelijkheden van het MySQL DBMS voldoende zijn. Ze zullen voldoende zijn om het adresboek op te slaan in het interne netwerk van de onderneming.

MySQL is een soort relationele database. MySQL is een server waarmee verschillende gebruikers verbinding kunnen maken.

Wanneer u verbinding maakt met internet, voert u uw gebruikersnaam en wachtwoord in, evenals de naam van de server waarmee u verbinding maakt? Hetzelfde systeem wordt gebruikt bij het werken met MySQL.

Nog een punt: wat is een relationele database? Relationeel betekent tafelgebaseerd. Microsoft's beroemde spreadsheet-editor Excel is eigenlijk een relationele database-editor.

Verbinding maken met MySQL-server

PHP gebruikt de functie mysqli_connect () om verbinding te maken met een MySQL-server. Deze functie heeft drie argumenten: servernaam, gebruikersnaam en wachtwoord.

De functie mysqli_connect () retourneert de verbindings-ID, deze wordt opgeslagen in een variabele en later gebruikt om met databases te werken.

MySQL-server verbindingscode:

$ link = mysqli_connect ("localhost", "root", "");

In dit geval werk ik op mijn lokale computer op Denwere, dus de hostnaam is localhost, de gebruikersnaam is root en er is geen wachtwoord.

U moet ook de verbinding verbreken nadat u klaar bent met werken met MySQL. De functie mysqli_close () wordt gebruikt om de verbinding te sluiten. Uitbreiding van het voorbeeld:

$ link = mysqli_connect ("localhost", "root", ""); if (! $ link) die ("Fout"); mysqli_close ($ link);

Hier hebben we de verbindingsidentificatie op waarheid gecontroleerd. Als er iets mis is met onze verbinding, wordt het programma niet uitgevoerd, stopt de functie die () de uitvoering ervan en geeft een foutmelding in de browser weer.

Verbindingsfouten

De volgende functies worden gebruikt om de verbinding te controleren:

  • mysqli_connect_errno () - Retourneert de foutcode van de laatste verbindingspoging. Retourneert nul als er geen fouten zijn.
  • mysqli_connect_error () - Retourneert een beschrijving van de laatste fout bij het verbinden met de MySQL-server.
definiëren ("HOST", "localhost"); definiëren ("DB_USER", "root"); definiëren ("DB_PASSWORD", ""); definiëren ("DB", "tester"); $ link = mysqli_connect (HOST, DB_USER, DB_PASSWORD, DB); / * controleer verbinding * / if (mysqli_connect_errno ()) (printf ("Kan geen verbinding maken:% s \ n", mysqli_connect_error ()); exit ();) else (printf ("Kan geen verbinding maken:% s \ n" , mysqli_get_host_info ($ link));)

Mysqli_get_host_info () retourneert een tekenreeks die het gebruikte type verbinding bevat.

Merk ook op dat ik met de opdracht definiëren alle verbindingsparameters in constanten heb opgeslagen. Wanneer u grote projecten schrijft en er zijn veel bestanden verbonden met de MySQL-server, is het handig om de verbindingsparameters in een apart bestand op te slaan en in te voegen met behulp van de functie include of required.

Database selectie

Er kunnen meerdere databases op een MySQL-server staan. Allereerst moeten we de basis kiezen die we nodig hebben voor werk. PHP heeft hiervoor nog een parameter in de functie mysqli_connect () - de naam van de database.

Ik heb het op mijn computer gemaakt via phpMyAdmin genaamd tester. Wij sluiten er op aan:

$ link = mysqli_connect ("localhost", "root", "", "tester"); if (! $ link) die ("Fout"); mysql_close ($ link);

We hebben dus een database gekozen om mee te werken. Maar zoals we weten, bestaat een relationele database uit tabellen, en onze database heeft nog geen tabellen. De database is leeg gemaakt, geen tabellen. Tabellen moeten er apart aan worden toegevoegd. Laten we er een tabel aan toevoegen met behulp van PHP.

Maak een tabel

In de naam van MySQL-databases staat het SQL-gedeelte voor Structured Query Language, wat zich vertaalt als gestructureerde querytaal. We zullen query's in SQL schrijven en deze vanuit het PHP-programma naar de MySQL-server sturen.

Om een ​​tabel te maken, hoeven we alleen de opdracht CREATE TABLE op te geven. Laten we een tabel maken met de naam gebruikers in de kolommen waarvan de logins (de login-kolom) en wachtwoorden (de wachtwoordkolom) van de gebruikers worden opgeslagen.

$ query = "CREATE TABLE-gebruikers (login VARCHAR (20), wachtwoord VARCHAR (20))";

In deze code hebben we de $ query-variabele een tekenreeks toegewezen die een SQL-query vertegenwoordigt. We maken een tabel met de naam gebruikers die twee kolommen login en wachtwoord bevat, die beide het gegevenstype VARCHAR (20) hebben. We zullen het later hebben over gegevenstypen, voor nu zal ik alleen opmerken dat VARCHAR (20) een tekenreeks is met een maximale lengte van 20 tekens.

Om onze query naar de MySQL-server te sturen, gebruiken we de PHP-functie mysqli_query (). Deze functie retourneert een positief getal als de bewerking succesvol was en onwaar als er een fout is opgetreden (de syntaxis van het verzoek is onjuist of het programma heeft geen toestemming om het verzoek uit te voeren).

$ link = mysqli_connect ("localhost", "root", "", "tester"); if (! $ link) die ("Fout"); $ query = "CREATE TABLE-gebruikers (login VARCHAR (20), wachtwoord VARCHAR (20))"; mysqli_query ($ zoekopdracht); mysqli_close ($ link);

De SQL-query hoeft niet naar een variabele te worden geschreven, deze kan rechtstreeks als argument naar de functie mysql_query () worden geschreven. Het is alleen dat de code er beter leesbaar uitziet.

Dit script heeft één nadeel: het voert niets uit naar de browser. Laten we een bericht toevoegen:

$ link = mysqli_connect ("localhost", "root", "", "tester"); if (! $ link) die ("Fout"); $ query = "CREATE TABLE-gebruikers (login VARCHAR (20), wachtwoord VARCHAR (20))"; if (mysqli_query ($ query)) echo "De tabel is gemaakt."; else echo "De tabel is niet gemaakt."; mysqli_close ($ link);

Als we dit script opnieuw uitvoeren voor uitvoering, zien we een bericht in de browser: "De tabel is niet gemaakt." Het feit is dat de tabel bij de eerste start is gemaakt en dat het onmogelijk is om de tabel met dezelfde naam opnieuw te maken. We worden geconfronteerd met een foutsituatie, dus het is tijd om te praten over foutafhandeling bij het werken met MySQL.

Foutverwerking

Bij het debuggen van een programma hebben we mogelijk nauwkeurige informatie over de fout nodig. Wanneer er een fout optreedt in MySQL, stelt de databaseserver het foutnummer in en een tekenreeks die de fout beschrijft. PHP heeft speciale functies om toegang te krijgen tot deze gegevens.

  • mysqli_errno () - Retourneert het foutnummer.
  • mysqli_error () - Retourneert een tekenreeks die de fout beschrijft.

Laten we nu de functie mysql_error () aan ons script toevoegen:

$ link = mysql_connect ("localhost", "root", "", "tester"); if (! $ link) die ("Fout"); $ query = "CREATE TABLE-gebruikers (login VARCHAR (20), wachtwoord VARCHAR (20))"; if (mysqli_query ($ query)) echo "De tabel is gemaakt."; else echo "Tabel niet gemaakt:" .mysqli_error (); mysqli_close ($ link);

Nu zal ons script de regel terugsturen naar de browser: "De tabel is niet gemaakt: Tabel" gebruikers "bestaat al".

Een tafel laten vallen

Dus nu hebben we een tafel die we niet nodig hebben. Het is tijd om te leren hoe u tabellen uit de database kunt verwijderen.

Om een ​​tabel te verwijderen, gebruikt u de opdracht DROP TABLE gevolgd door de tabelnaam.

$ link = mysqli_connect ("localhost", "root", "", "tester"); if (! $ link) die ("Fout"); $ query = "DROP TABLE gebruikers"; if (! mysqli_query ($ query)) echo "Fout bij het verwijderen van tabel:" .mysqli_error (); else echo "De tabel is verwijderd."; mysqli_close ($ link);

resultaten

We hebben dus de basis van MySQL onder de knie. Wat hebben we geleerd om te doen:

  • Maak verbinding met de MySQL-database met de functie mysqli_connect ().
  • Sluit de verbinding met de MySQL-server met de functie mysqli_close ().
  • Verzend SQL-query's naar de MySQL-server met behulp van de functie mysqli_query ().
  • We hebben de SQL-query geleerd voor het maken van een tabel: tabel maken.
  • We hebben de SQL-query geleerd om een ​​tabel te laten vallen: drop table.
  • We hebben geleerd hoe we fouten kunnen afhandelen met behulp van de functies mysqli_errno () en mysqli_error ().

Vervolgens gaan we MySQL-gegevenstypen nader bekijken.

We lezen de volgende les: