Complexe mysql-query's. PHP-verbinding met MySQL-database. Optimalisatie van MySQL-query's

DBMS MySQL is een van de vele databases die door PHP worden ondersteund. Het MySQL-systeem wordt gratis verspreid en heeft voldoende kracht om echte problemen op te lossen.

Een korte introductie tot MySQL

SQL is een afkorting voor de woorden Structured Query Language, wat betekent gestructureerde taal verzoeken. Deze taal is het standaardmiddel om toegang te krijgen tot verschillende databases.

Het MySQL-systeem is een server waarmee gebruikers van externe computers verbinding kunnen maken.

Om met databases te werken, is het handig om de tool te gebruiken die in de webontwikkelaarskit zit: Denwer phpMyAdmin. Hier kunt u een nieuwe database maken, een nieuwe tabel maken in de geselecteerde database, de tabel vullen met gegevens en gegevens toevoegen, verwijderen en bewerken.

MySQL definieert drie basisgegevenstypen: numeriek, datetime en string. Elk van deze categorieën is onderverdeeld in vele soorten. De belangrijkste zijn:


Elke kolom na het gegevenstype bevat andere specificaties:

TypeBeschrijving
NIET NULAlle tabelrijen moeten een waarde in dit kenmerk hebben. Indien niet opgegeven, kan het veld leeg zijn (NULL)
AUTO_INCREMENTEen speciale MySQL-functie die op numerieke kolommen kan worden gebruikt. Als u zo'n veld leeg laat bij het invoegen van rijen in een tabel, genereert MySQL automatisch unieke waarde identificatie. Deze waarde is één meer dan de maximale waarde die al in de kolom bestaat. Elke tabel kan maximaal één zo'n veld hebben. Kolommen met AUTO_INCREMENT moeten worden geïndexeerd
HOOFDSLEUTELDe kolom is de primaire sleutel voor de tabel. De gegevens in deze kolom moeten uniek zijn. MySQL indexeert deze kolom automatisch
NIET ONDERTEKENDNa integer type betekent dat de waarde positief of nul kan zijn
OPMERKINGNaam tabelkolom

creatie nieuwe basis MySQL-gegevens MAAK DATABASE.

MAAK DATABASE INDIEN NIET BESTAAT `base` STANDAARD KARAKTERSET cp1251 COLLATE cp1251_bin

creatie nieuwe tafel uitgevoerd met behulp van SQL-opdracht MAAK TAFEL. De boekentabel voor een boekhandel zou bijvoorbeeld vijf velden hebben: ISBN, auteur, titel, prijs en aantal exemplaren:

MAAK TAFELboeken (ISBN CHAR(13) NOT NULL, PRIMARY KEY (ISBN), auteur VARCHAR(30), titel VARCHAR(60), prijs FLOAT(4,2), hoeveelheid TINYINT UNSIGNED); Om een ​​foutmelding te voorkomen als de tabel al bestaat, moet u de eerste regel wijzigen door de zin "IF NOT EXISTS" toe te voegen: CREATE TABLE IF NOT EXISTS books ...

Voor het maken van veld voor automatisch bijwerken van huidige datum van het type TIMESTAMP of DATETIME gebruik de volgende constructie:

MAAK TABEL t1 (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP OP UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP OP UPDATE CURRENT_TIMESTAMP);

Aanvulling gegevens in deze tabel worden uitgevoerd met behulp van de SQL-opdracht INSERT. Bijvoorbeeld:

INSERT INTO boeken (ISBN, auteur, titel, prijs, aantal) WAARDEN ("5-8459-0184-7", "Zandstra Mat", "Teach Yourself PHP4 in 24 Hours", "129", "5");

De operator wordt gebruikt om gegevens uit een tabel op te halen. KIES. Het haalt gegevens op uit de database door rijen te selecteren die voldoen aan de opgegeven zoekcriteria. De SELECT-instructie wordt geleverd met een groot aantal opties en use-cases.

Het * symbool betekent dat alle velden verplicht zijn. Bijvoorbeeld:

KIES * UIT boeken;

Om alleen toegang te krijgen tot een bepaald veld, moet u de naam ervan specificeren in de SELECT-instructie. Bijvoorbeeld:

SELECTEER auteur, titel, prijs UIT boeken;

Om toegang te krijgen tot een subset van rijen in een tabel, moet u een selectiecriterium opgeven, dat wordt bepaald door de constructie WAAR. Als u bijvoorbeeld beschikbare goedkope boeken over PHP wilt selecteren, stelt u een vraag op:

KIES * UIT boeken WAAR prijs % Komt overeen met een willekeurig aantal tekens, zelfs nul
_ Komt overeen met precies één teken

Om ervoor te zorgen dat de door query opgehaalde rijen in een bepaalde volgorde worden weergegeven, wordt de constructie gebruikt BESTEL DOOR. Bijvoorbeeld:

SELECTEER * UIT boeken BESTEL OP prijs;

Standaard volgorde sorteren gaat in oplopende volgorde. U kunt de sorteervolgorde omdraaien met trefwoord DESC:

SELECTEER * UIT boeken BESTEL OP prijs DESC;

Soort U kunt ook meerdere kolommen gebruiken. In plaats van kolomnamen kunt u hun serienummers gebruiken:

KIES * UIT boeken BESTEL DOOR 4, 2, 3;

Gebruik de opdracht om de eerder in de tabel vastgelegde waarden te wijzigen BIJWERKEN. De prijs van alle boeken is bijvoorbeeld met 10% gestegen:

UPDATE boeken SET prijs = prijs * 1.1;

De WHERE-clausule beperkt de UPDATE tot bepaalde rijen. Bijvoorbeeld:

UPDATE boeken SET prijs = prijs * 1.05 WHERE prijs

Gebruik de instructie . om rijen uit een database te verwijderen VERWIJDEREN. Onnodige rijen worden opgegeven met behulp van de WHERE-component. Sommige boeken worden bijvoorbeeld verkocht:

VERWIJDER UIT boeken WAAR aantal = 0;

Als u alle vermeldingen wilt verwijderen

TRUNCATE TABLE tabelnaam

Gebruik om een ​​tabel volledig te verwijderen:

DROP TABLE tabelnaam

PHP-communicatie met MySQL-database

Nadat u met phpMyAdmin heeft gewerkt om een ​​database te maken, kunt u beginnen met het verbinden van deze database met de externe webinterface.

Om toegang te krijgen tot een database vanaf het web met behulp van PHP, moeten de volgende basisstappen worden genomen:

  • Verbinding met MySQL-server.
  • Database selectie.
  • Een databasequery uitvoeren:
    • toevoegen;
    • verwijdering;
    • verandering;
    • Zoekopdracht;
    • sorteren.
  • Het resultaat van een query ophalen.
  • Loskoppelen van de database.

Om verbinding te maken met een databaseserver in PHP is er een functie mysql_connect(). De argumenten zijn computernaam, gebruikersnaam en wachtwoord. Deze argumenten kunnen worden weggelaten. Standaard computernaam = localhost , dan zijn gebruikersnaam en wachtwoord niet vereist. Als PHP wordt gebruikt in combinatie met Apache-server, dan kunt u de functie gebruiken: mysql_pconnect(). In dit geval verdwijnt de verbinding met de server niet nadat het programma is beëindigd of de functie is aangeroepen. mysql_close(). Functies mysql_connect() En mysql_pconnect() retourneer de verbindings-ID als alles goed is gegaan. Bijvoorbeeld:

$link = mysql_pconnect(); if (!$link) sterft ("Kan geen verbinding maken met MySQL");

Nadat de verbinding met de MySQL-server tot stand is gebracht, moet u een database selecteren. Hiervoor wordt de functie gebruikt mysql_select_db(). Het argument is de naam van de database. De functie retourneert true als de opgegeven database bestaat en toegankelijk is. Bijvoorbeeld:

$db = "voorbeeld"; mysql_select_db($db) or die("Kan $db niet openen");

Voor het toevoegen, verwijderen, wijzigen en selecteren van gegevens moet een SQL-query worden gemaakt en uitgevoerd. voor dit in PHP-taal er is een functie mysql_query(). Het argument is een querystring. De functie retourneert de aanvraag-ID.

voorbeeld 1

Een item aan een tafel toevoegen

Elke keer dat u Voorbeeld 1 uitvoert, wordt er een nieuw record toegevoegd aan de tabel met dezelfde gegevens. Uiteraard is het zinvol om de door de gebruiker ingevoerde gegevens aan de database toe te voegen.

Voorbeeld 2-1 toont een HTML-formulier voor het toevoegen van nieuwe boeken aan de database.

Voorbeeld 2.1

HTML-formulier voor het toevoegen van nieuwe boeken
ISBN
schrijver
Naam
Prijs
Hoeveelheid


De resultaten van het invullen van dit formulier worden overgebracht naar insert_book.php.

Voorbeeld 2.2

Programma voor het toevoegen van nieuwe boeken (bestand insert_book.php) Ga terug en voltooi het typen"); ) $isbn = trim ($_POST["isbn"]); $author = trim ($_POST["author"]); $title = trim ($_POST["title" ] ); $isbn = voegt wimpers toe ($isbn); $author = voegt wimpers toe ($auteur); $title = voegt wimpers toe ($title) ; $db = "sample"; $link = mysql_connect(); als (!$link) sterft ("Kan geen verbinding maken met MySQL"); mysql_select_db ($db) of sterven ("Kan $db niet openen"); $query = "INSERT INTO books VALUES ("" .$isbn."", "".$author "", "".$title."", "" .floatval($_POST["prijs"])."", "".intval($_POST["hoeveelheid"])."")"; $ resultaat = mysql_query ($query); if ($result) echo "Het boek is toegevoegd aan de database."; mysql_close ($link); ?>

In voorbeeld 2.2 worden de ingevoerde stringgegevens verwerkt door de functie voegt wimpers(). Deze functie voegt backslashes toe voor enkele aanhalingstekens ("), dubbele aanhalingstekens ("), backslashes (\) en null-byte. Het is een feit dat volgens de vereisten van de syntaxis van de databasequery, dergelijke tekens tussen aanhalingstekens moeten worden geplaatst.

Om het aantal records in het queryresultaat te bepalen, gebruikt u de functie mysql_num_rows().

Alle records met queryresultaten kunnen in een lus worden bekeken. Daarvoor, met behulp van de functie mysql_fetch_ voor elke inzending krijg associatieve array.

Voorbeeld 3.1 is een HTML-formulier voor het zoeken naar specifieke boeken in een database.

Voorbeeld 3.1

HTML-formulier voor zoeken naar boeken
Zoeken naar:

Wat zoeken we:



De resultaten van dit formulier worden doorgegeven aan search_book.php.

Voorbeeld 3.2

Ga terug en voltooi het typen"); $searchterm = addlashes($searchterm); $link = mysql_pconnect(); if (!$link) die("Kan geen verbinding maken met MySQL"); $db = "sample"; mysql_select_db ($db) of sterven ("Kan $db niet openen"); $query = "SELECT * FROM books WHERE " .$_POST["searchtype"]." zoals "%".$searchterm."%""; $result = mysql_query ($query); $n = mysql_num_rows ($result); for ($i=0; $i<$n; $i++) { $row = mysql_fetch_array($result); echo "

".($i+1). $row["title"]. "



"; ) if ($n == 0) echo "We hebben niets te bieden. Sorry"; mysql_close($link); ?>

Alternatieve optie

Boekzoekprogramma (search_book.php bestand) Ga terug en voltooi met typen"); $searchterm = addlashes($searchterm); mysql_connect() or die ("Kan geen verbinding maken met MySQL"); mysql_select_db ("sample") of die ("Kan DB niet openen" ); $ result = mysql_query ("SELECT * FROM books WHERE ".$_POST["searchtype"]." zoals "%".$searchterm."%""); $i=1; while($row = mysql_fetch_array( $resultaat) ) ( echo "

".($i++) .$row["titel"]."
"; echo "Auteur: ".$row["auteur"]."
"; echo "ISBN: ".$row["ISBN"]."
"; echo "Prijs: ".$row["prijs"]."
"; echo "Aantal: ".$row["hoeveelheid"]."

"; ) if ($i == 1) echo "We hebben niets te bieden. Sorry"; mysql_close(); ?>

Dus hoe werkt de webdatabase-architectuur:

  1. De webbrowser van de gebruiker geeft een HTTP-verzoek voor een specifieke webpagina. Een gebruiker die bijvoorbeeld een HTML-formulier gebruikt, zoekt naar alle PHP-boeken. De formulierverwerkingspagina heet search_book.php.
  2. De webserver ontvangt een verzoek voor search_book.php, haalt dit bestand op en geeft het door aan de PHP-engine voor verwerking.
  3. PHP maakt verbinding met de MySQL-server en verzendt het verzoek.
  4. De server ontvangt een databaseverzoek, verwerkt het en stuurt het resultaat (een lijst met boeken) terug naar de PHP-engine.
  5. PHP-engine is voltooid script uitvoering, maakt het queryresultaat op in HTML. Het resultaat wordt dan als HTML teruggestuurd naar de webserver.
  6. De webserver stuurt de HTML naar de browser en de gebruiker kan de gevraagde lijst met boeken bekijken.

Het transactiemechanisme gebruiken

Het transactiemechanisme gebruiken als voorbeeld van hoe u geld van de ene persoon naar de andere kunt overboeken

If(mysql_query ("BEGIN") && mysql_query ("UPDATE money SET amt = amt - 6 WHERE name = "Eve"") && mysql_query ("UPDATE money SET amt = amt + 6 WHERE name = "Ida"") && mysql_query ("COMMIT"))( echo "Succes"; )else( mysql_query ("ROLLBACK"); echo "Niet succesvol"; )

KIES … VOOR UPDATE

Als u meerdere processen uitvoert die een selectiequery maken op dezelfde tabel, kunnen ze tegelijkertijd dezelfde record selecteren.

Om de bovengenoemde situatie te voorkomen, is het noodzakelijk om niet alleen een SELECT-query uit te voeren, maar ook de uitgebreide versie, die velen niet eens vermoeden: SELECT ... FOR UPDATE.

Bij het uitvoeren van deze query worden dus alle betrokken records in de database vergrendeld totdat de sessie met de database is voltooid of totdat deze records zijn bijgewerkt. Een ander script kan geen vergrendelde records selecteren totdat een van de genoemde voorwaarden zich voordoet.

Echter niet allemaal zo eenvoudig. U moet nog aan een aantal voorwaarden voldoen. Ten eerste moet uw tabel gebaseerd zijn op de InnoDB-architectuur. IN anders blokkeren werkt gewoon niet. Ten tweede moet u, voordat u de ophaalactie uitvoert, de automatische toewijzing van de query uitschakelen. Die. met andere woorden, automatische uitvoering van het verzoek. Nadat u een UPDATE-verzoek hebt opgegeven, moet u opnieuw contact opnemen met de database en de wijzigingen vastleggen met de opdracht COMMIT:

9 oktober 2008 om 23:37 uur

Optimalisatie MySQL-query's

  • MySQL

In het dagelijkse werk heb je te maken met redelijk vergelijkbare fouten bij het schrijven van query's.

In dit artikel wil ik voorbeelden geven van hoe je GEEN queries moet schrijven.

  • Alle velden selecteren
    SELECT * UIT tabel

    Selecteer bij het schrijven van query's niet alle velden - "*". Vermeld alleen de velden die u echt nodig heeft. Dit vermindert de hoeveelheid opgehaalde en verzonden gegevens. Vergeet ook niet om indexen te dekken. Zelfs als u alle velden in de tabel echt nodig heeft, kunt u ze het beste opsommen. Ten eerste verbetert het de leesbaarheid van de code. Bij gebruik van een asterisk is het onmogelijk om te achterhalen welke velden in de tabel staan ​​zonder ernaar te kijken. Ten tweede kan het aantal kolommen in uw tabel na verloop van tijd veranderen, en als het vandaag vijf INT-kolommen zijn, kunnen over een maand TEKST- en BLOB-velden worden toegevoegd, wat de selectie zal vertragen.

  • Verzoeken in een cyclus.
    U moet duidelijk begrijpen dat SQL een taal is die op sets werkt. Soms zijn programmeurs die gewend zijn in termen te denken proceduretalen, is het moeilijk om het denken in de taal van verzamelingen te herstructureren. Dit kan heel eenvoudig worden gedaan door een eenvoudige regel aan te nemen - "voer query's nooit in een lus uit." Voorbeelden van hoe dit kan:

    1. Voorbeelden:
    $news_ids = get_list("SELECT news_id FROM today_news ");
    while($news_id = get_next($news_ids))
    $news = get_row("SELECT title, body FROM news WHERE news_id = ". $news_id);

    De regel is heel eenvoudig: hoe minder verzoeken, hoe beter (hoewel er uitzonderingen zijn, zoals bij elke regel). Vergeet de IN() constructie niet. De bovenstaande code kan in één query worden geschreven:
    SELECT titel, tekst FROM today_news INNER JOIN nieuws USING(news_id)

    2. Tussenvoegsels
    $log = parse_log();
    while($record = volgende($log))
    query("INSERT INTO logs SET value = "(!LANG:. $log["value"]);!}

    Het is veel efficiënter om één enkele query te lijmen en uit te voeren:
    INSERT INTO logs (waarde) VALUES (...), (...)

    3. Updates
    Soms moet u meerdere rijen in dezelfde tabel bijwerken. Als de bijgewerkte waarde hetzelfde is, is alles eenvoudig:
    UPDATE nieuws SET title="(!LANG:test" WHERE id IN (1, 2, 3).!}

    Als veranderlijke waarde voor elk record anders is, dan kan dit met de volgende query:
    UPDATE nieuws SET
    titel = GEVAL
    WHEN news_id = 1 THEN "aa"
    WHEN news_id = 2 THEN "bb" END
    WHERE news_id IN (1, 2)

    Uit onze tests blijkt dat een dergelijke zoekopdracht 2-3 keer sneller is dan meerdere afzonderlijke zoekopdrachten.

  • Bewerkingen uitvoeren op geïndexeerde velden
    SELECT user_id FROM gebruikers WHERE blogs_count * 2 = $waarde

    Deze zoekopdracht gebruikt geen index, zelfs niet als de kolom blogs_count is geïndexeerd. Om een ​​index te kunnen gebruiken, moeten er geen transformaties worden uitgevoerd op het geïndexeerde veld in de query. Verplaats voor dergelijke verzoeken de conversiefuncties naar een ander deel:
    SELECT user_id FROM gebruikers WHERE blogs_count = $value / 2;

    Vergelijkbaar voorbeeld:
    SELECT user_id FROM gebruikers WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(geregistreerd)<= 10;

    Zal geen index gebruiken op het geregistreerde veld, terwijl
    SELECT user_id FROM gebruikers WAAR geregistreerd >= DATE_SUB (CURRENT_DATE, INTERVAL 10 DAY);
    zullen.

  • Rijen ophalen om hun aantal te tellen
    $result = mysql_query("SELECT * FROM table", $link);
    $num_rows = mysql_num_rows($resultaat);
    Als u het aantal rijen moet selecteren dat aan een bepaalde voorwaarde voldoet, gebruikt u de tabelquery SELECT COUNT(*) FROM in plaats van alle rijen te selecteren om ze te tellen.
  • Extra rijen ophalen
    $result = mysql_query("SELECT * FROM table1", $link);
    while($row = mysql_fetch_assoc($result) && $i< 20) {

    }
    Als u slechts n voorbeeldrijen wilt, gebruikt u LIMIT in plaats van extra rijen in uw toepassing weg te gooien.
  • ORDER BY RAND() gebruiken
    SELECTEER * UIT tabel ORDER BY RAND() LIMIT 1;

    Als de tabel meer dan 4-5 duizend rijen heeft, werkt ORDER BY RAND () erg langzaam. Het is veel efficiënter om twee query's uit te voeren:

    Als de tabel een primaire sleutel auto_increment" heeft en geen hiaten:
    $rnd = rand(1, query("SELECT MAX(id) FROM table"));
    $row = query("SELECT * FROM tabel WHERE id = ".$rnd);

    Of:
    $cnt = query("SELECT COUNT(*) FROM tabel");
    $row = query("SELECT * FROM table LIMIT ".$cnt.", 1");
    die echter ook traag kan zijn met een zeer groot aantal rijen in de tabel.

  • Een groot aantal JOINs gebruiken
    KIES
    v.video_id
    een naam,
    g.genre
    VAN
    video's AS v
    LINKS DOEN
    link_actors_videos AS la ON la.video_id = v.video_id
    LINKS DOEN
    acteurs AS a ON a.actor_id = la.actor_id
    LINKS DOEN
    link_genre_video AS lg ON lg.video_id = v.video_id
    LINKS DOEN
    genres AS g ON g.genre_id = lg.genre_id

    Houd er rekening mee dat wanneer tabellen een-op-veel worden gekoppeld, het aantal rijen in de selectie zal groeien met elke volgende JOIN "e. Voor soortgelijke gevallen het is sneller om zo'n verzoek op te splitsen in meerdere eenvoudige.

  • LIMIT . gebruiken
    SELECT... FROM tabel LIMIT $start, $per_page

    Veel mensen denken dat een dergelijke zoekopdracht $per_page-records zal opleveren (meestal 10-20) en daarom snel werken. Het zal snel werken voor de eerste paar pagina's. Maar als het aantal records groot is en u een SELECT ... FROM table LIMIT 1000000, 1000020 query moet uitvoeren, dan zal MySQL om een ​​dergelijke query uit te voeren eerst 1000020 records selecteren, het eerste miljoen weggooien en 20 retourneren. misschien helemaal niet snel. Er zijn geen triviale manieren om het probleem op te lossen. Velen beperken gewoon het bedrag beschikbare pagina's redelijk aantal. Je kunt ook versnellen soortgelijke verzoeken met behulp van dekkende indices, of oplossingen van derden(bijvoorbeeld sfinx).

  • Geen gebruik van ON DUBBELE KEY UPDATE
    $row = query("SELECT * FROM tabel WHERE id=1");

    Als($rij)
    query("UPDATE tabel SET kolom = kolom + 1 WHERE id=1")
    anders
    query ("INSERT INTO table SET column = 1, id=1");

    Een vergelijkbare constructie kan worden vervangen door een enkel verzoek, op voorwaarde dat er een primaire of unieke sleutel in het id-veld staat:
    INSERT INTO tabel SET kolom = 1, id=1 OP DUPLICATE KEY UPDATE kolom = kolom + 1

Lezen

In dit artikel zullen we leren databasequery's verzenden via PHP. Dit artikel is erg belangrijk en u moet het begrijpen. Ik zal u echter geruststellen - het materiaal is heel eenvoudig, dus er zouden geen problemen moeten zijn.

Voordat ik verder ga met het onderwerp van het artikel, waarschuw ik u van tevoren dat ik niet in detail zal analyseren SQL-taal . Alle benodigde informatie is gesorteerd in de categorie gewijd aan, en hier hebben we alleen werken met MySQL via PHP.

Laten we nu verder gaan met databasequery's verzenden in PHP:


}
$mysqli->query("INSERT INTO mytable (name, email) VALUES ("MijnNaam", " ")");
$mysqli->close();
?>

IN dit voorbeeld we hebben verbinding gemaakt met de database, hebben gecontroleerd of de verbinding is gelukt, hebben het verzoek verzonden met de methode vraag(), en verbrak vervolgens de verbinding. Zoals je kunt zien, is alles heel eenvoudig. Om iets te verzenden SQL-query's slechts één methode is genoeg - vraag(), dus in deze zaak alles is waanzinnig eenvoudig.

Laten we de taak nu een beetje ingewikkelder maken. Laten we eens kijken naar de zoekopdrachten die terugkeren resultaat_set- resultaat. Meest populair verzoek, die terugkeert resultaat_set is een selectie van gegevens uit een tabel. In het volgende voorbeeld zullen we een selectie van gegevens maken en vervolgens het resultaat weergeven:

$mysqli = @new mysqli("localhost", "Admin", "pass", "mybase");
if (mysqli_connect_errno()) (
echo "Verbinding mislukt: ".mysqli_connect_error();
}
$result_set = $mysqli->
while ($row = $result_set->fetch_assoc()) (
print_r($rij);
echo "
";
}
$result_set->close();
$mysqli->close();
?>

Laat me eerst een beetje uitleggen wat het is. resultaat_set. resultaat_set is een tabel met het resultaat. Deze tabel heeft een set records (tabelrijen). En om alle records weer te geven, moet u elke rij van de tabel herhalen en weergeven. En nu leg ik een voorbeeld uit: na het verzenden van een verzoek vormen we resultaat_set. Vervolgens wijzen we toe aan een variabele in een lus rij de waarde van de volgende regel, dat wil zeggen eendimensionale matrix welke methode retourneert fetch_assoc(). Wanneer alle regels zijn voltooid, wordt de methode fetch_assoc() zal terugkeren vals, en de lus wordt afgesloten. Binnen de lus terwijl we voeren de array gewoon uit met behulp van de debug-functie print_r(), hoewel het zeker kan worden afgeleid met behulp van foreach maar dat is nu niet nodig.

Laten we kort samenvatten hoe te werken met resultaat_set:

  1. Ontvangen resultaat_set door de juiste query naar de database te sturen.
  2. Wijs in de lus bij elke iteratie de volgende regel (record) toe van resultaat_set met behulp van methode fetch_assoc() een of andere variabele rij. Dan kun je met deze variabele werken als met een eendimensionale associatieve array, waarvan de sleutels de namen van de tabelvelden zijn, en de waarden corresponderen met het huidige record.
  3. Sluit zeker af resultaat_set methode dichtbij() bronnen te verkennen.

Zoals je kunt zien, is de methode: fetch_assoc() keert altijd terug volgende post. Dat wil zeggen, eerst de 1e, dan de 2e, dan de 3e enzovoort. Als je een goede programmeerervaring hebt, dan raad je meteen dat dit komt door de interne aanwijzer, die je natuurlijk kunt verplaatsen. Waar wordt het gebruikt? Dit kan bijvoorbeeld worden gebruikt wanneer u moet werken met resultaat_set niet 1 , maar 2 en vaker. Om hetzelfde verzoek niet opnieuw te vormen, kunt u de aanwijzer eenvoudig naar het begin verplaatsen. En dan kun je het weer doen resultaat_set met behulp van de fetch_assoc() methode.

Er is een methode om de positie van de aanwijzer te veranderen data_seek(), die een geheel getal neemt van 0 voordat " aantal inschrijvingen - 1", respectievelijk, de aanwijzer stijgt naar het item dat overeenkomt met de parameter:

$mysqli = @new mysqli("localhost", "Admin", "pass", "mybase");
if (mysqli_connect_errno()) (
echo "Verbinding mislukt: ".mysqli_connect_error();
}
$result_set = $mysqli->query("SELECT * FROM mytable");
$result_set->num_rows;
while ($row = $result_set->fetch_assoc()) (
print_r($rij);
echo "
";
}
$result_set->data_seek(0);
while ($row = $result_set->fetch_assoc()) (
print_r($rij);
echo "
";
}
$result_set->close();
$mysqli->close();
?>

In dit voorbeeld hebben we aantal vermeldingen in resultaat_set eigendom gebruiken aantal_rijen. Ook hebben we kennis gemaakt met de methode data_seek(). Dat wil zeggen, we herhalen het hele resultaat en retourneren vervolgens een aanwijzer naar 0e opnemen en het resultaat opnieuw uitzoeken.

In dit artikel hebben we de verbinding met de database herhaald en de verbinding verbroken. En ook ontdekt hoe databasequery's te verzenden via php. Geleerd, hoe resultaat_set te krijgen en hoe ermee te werken. Dat is alles wat u moet weten om succesvol te zijn werken met MySQL in PHP.

Syntaxis:

* waar velden1- velden voor selectie gescheiden door komma's, u kunt ook alle velden specificeren met *; tafel- de naam van de tabel waaruit we de gegevens halen; conditie— bemonsteringsvoorwaarden; velden2— veld of velden, gescheiden door komma's, waarop moet worden gesorteerd; Graaf— het aantal te downloaden rijen.
* aanvraag in vierkante haakjes is niet vereist voor gegevensbemonstering.

Eenvoudige gebruiksscenario's voor select

1. Normale gegevensbemonstering:

> KIES * VAN gebruikers

2. Gegevensselectie met het samenvoegen van twee tabellen (JOIN):

SELECT u.name, r.* FROM gebruikers u WORD LID van users_rights r ON r.user_id=u.id

* in dit voorbeeld zijn gegevens geselecteerd met samenvoegtabellen gebruikers En gebruikersrechten. Ze zijn gegroepeerd op velden. gebruikersnaam(in de user_rights tabel) en ID kaart(gebruikers). Het naamveld wordt opgehaald uit de eerste tabel en alle velden uit de tweede.

3. Bemonstering met een interval van tijd en/of datum

a) het startpunt en een bepaald tijdsinterval zijn bekend:

* gegevens worden geselecteerd voor laatste uur(veld datum).

b) de startdatum en einddatum zijn bekend:

25.10.2017 En 25.11.2017 .

c) begin- en einddatum + tijd zijn bekend:

* selecteer gegevens tussen 25-03-2018 0 uur 15 minuten En 25.04.2018 15 uur 33 minuten en 9 seconden.

d) gegevens ophalen voor een specifieke maand en jaar:

* extraheer gegevens waar in het veld datum er zijn waarden voor april 2018 van het jaar.

4. Steekproef van de maximale, minimale en gemiddelde waarde:

> SELECTEER max(gebied), min(gebied), gem(gebied) UIT land

* maxmaximale waarde; min- minimaal; gemiddeld- het gemiddelde.

5. Stringlengte gebruiken:

* gegeven verzoek moet alle gebruikers tonen wiens naam uit 5 tekens bestaat.

Voorbeelden van complexere of zelden gebruikte zoekopdrachten

1. Samenvoegen met het groeperen van de geselecteerde gegevens in één regel (GROUP_CONCAT):

* van tafel gebruikers gegevens ophalen per veld ID kaart, ze passen allemaal op één regel, de waarden zijn gescheiden komma's.

2. Gegevens groeperen op twee of meer velden:

> KIES * UIT gebruikers GROEP OP CONCAT (titel, "::", geboorte)

* totaal, in dit voorbeeld zullen we gegevens uit de gebruikerstabel verwijderen en ze groeperen op velden titel En geboorte. Voordat we gaan groeperen, voegen we de velden samen tot één regel met een scheidingsteken :: .

3. Resultaten uit twee tabellen combineren (UNION):

> (SELECT id, fio, adres, "Gebruikers" als type FROM gebruikers)
UNIE
(SELECTEER id, fio, adres, "Klanten" als type FROM klanten)

* in dit voorbeeld worden gegevens opgehaald uit tabellen gebruikers En klanten.

4. Een steekproef van gemiddelden gegroepeerd voor elk uur:

SELECT avg(temperatuur), DATE_FORMAT(datetimeupdate, "%Y-%m-%d %H") as hour_datetime FROM archief GROUP BY DATE_FORMAT(datetimeupdate, "%Y-%m-%d %H")

* hier extraheren we de gemiddelde waarde van het veld temperatuur- van de tafel archief en groeperen op veld datum/tijd-update(met tijdverdeling voor elk uur).

Invoegen (INSERT)

Syntaxis 1:

> INVOEREN IN

() WAARDEN ( )

Syntaxis 2:

> INVOEREN IN

WAARDEN ( )

* waar tafel- de naam van de tabel waarin we de gegevens invoeren; velden- opsomming van velden gescheiden door komma's;waarden— opsomming van waarden gescheiden door komma's.
* met de eerste optie kunt u alleen invoegen in de vermelde velden - de rest krijgt standaardwaarden. De tweede optie vereist invoeging voor alle velden.

voorbeelden invoegen

1. Voeg meerdere rijen in met één query:

> INSERT INTO steden ("naam", "land") WAARDEN ("Moskou", "Rusland"), ("Parijs", "Frankrijk"), ("Funafuti", "Tuvalu");

* In dit voorbeeld voegen we 3 records toe met één SQL-query.

2. Invoegen vanuit een andere tabel (rijen kopiëren, INSERT + SELECT):

* extraheer alle records uit de tabel steden, waarvan de namen beginnen met "M" en invoeren in de tabel steden-nieuw.

Bijwerken (UPDATE)

Syntaxis:

* waar tafel- tafel naam; veld- het veld waarvoor we de waarde gaan wijzigen; waarde- nieuwe waarde; conditie- een voorwaarde (het is gevaarlijk om een ​​update uit te voeren zonder deze - u kunt alle gegevens in de hele tabel vervangen).

Update met vervanging (VERVANG):

BIJWERKEN

SET = VERVANG( , "<что меняем>", "<на что>");

UPDATE steden SET naam = REPLACE (naam, "Maskva", "Moskou");

Als we op veilig willen spelen, kan het resultaat van de vervanging eerst worden gecontroleerd met met SELECT:

Verwijderen (VERWIJDEREN)

Syntaxis:

* waar tafel- tafel naam; conditie- een voorwaarde (zoals in het geval van UPDATE, is het gevaarlijk om DELETE te gebruiken zonder een voorwaarde - de DBMS zal niet om bevestiging vragen, maar gewoon alle gegevens verwijderen).

Maak een tabel

Syntaxis:

> MAAK TAFEL

( , )

> MAAK TABEL INDIEN NIET BESTAAT `users_rights` (
`id` int(10) unsigned NIET NULL,
`user_id` int(10) unsigned NIET NULL,
`rights` int(10) unsigned NOT NULL
) MOTOR=InnoDB STANDAARD CHARSET=utf8;

* waar tafel- tabelnaam (in het voorbeeld gebruikersrechten); veld1, veld2— de naam van de velden (in het voorbeeld worden er 3 velden aangemaakt — id, user_id, rechten); opties1, opties2— veldparameters (in het voorbeeld int(10) unsigned NIET NULL); tafel opties— algemene parameters van de tabel (in het voorbeeld MOTOR=InnoDB STANDAARD CHARSET=utf8).

Verzoeken gebruiken in PHP

Verbinding maken met de database:

mysql_connect ("localhost", "login", "wachtwoord") of die ("MySQL-verbindingsfout");
mysql_select_db("db_name");
mysql_query("NAMEN INSTELLEN "utf8"");

* waar de verbinding met de basis tot stand is gebracht lokale server (localhost); verbindingsgegevens - Log in En wachtwoord(respectievelijk login en wachtwoord); gebruikt als basis db_name; gebruikte codering UTF-8.

U kunt ook een permanente verbinding maken:

mysql_pconnect("localhost", "login", "wachtwoord") of die ("MySQL-verbindingsfout");

*het is echter mogelijk om de maximaal toegestane hostinglimiet te bereiken. Deze methode moet worden gebruikt voor: eigen servers waar we zelf de situatie kunnen beheersen.

Einde verbinding:

* in PHP gebeurt automatisch, behalve permanente verbindingen(mysql_pconnect).

Een query naar MySQL (Mariadb) in PHP wordt gedaan door de functie mysql_query() en het ophalen van gegevens uit een query wordt gedaan door mysql_fetch_array():

$result = mysql_query("SELECT * FROM gebruikers");
while ($massa = mysql_fetch_array($result)) (
echo $massa . "
";
}

* in dit voorbeeld is er een vraag naar de tabel gemaakt gebruikers. Het zoekresultaat wordt in een variabele geplaatst $resultaat. De volgende cyclus wordt gebruikt: terwijl, waarvan elke iteratie een reeks gegevens extraheert en in een variabele plaatst $massa- in elke iteratie werken we met één rij van de database.

De gebruikte functie mysql_fetch_array() retourneert een associatieve array, wat handig is om mee te werken, maar er is een ander alternatief - mysql_fetch_row(), die een regulier genummerde array retourneert.

Afscherming

Als u een speciaal teken in de queryreeks moet opnemen, bijvoorbeeld %, moet u escaping gebruiken met de backslash - \

Bijvoorbeeld:

* als een dergelijke query wordt uitgevoerd zonder escapetekens, wordt het %-teken geïnterpreteerd als een willekeurig aantal tekens na 100.

Dat is alles. Als je hulp nodig hebt bij een verzoek, stuur me dan een e-mail.

In dit artikel zullen we manieren bekijken om toegang te krijgen tot MySQL-databasetabellen met behulp van de SQL-querytaal. SQL is een afkorting die "geopenbaard" is - een gestructureerde zoektaal.
In PHP is voor dit doel: hele regel functies voorafgegaan door "mysql". We hebben er niet veel nodig om aanvragen te verwerken. De functie zonder welke in de taal PHP-uitvoering SQL-query's zouden gewoon onmogelijk zijn:

Bron mysql_query(query)

Deze functie stuurt een query naar de database en retourneert de resource-ID in het geval van een succesvolle aanroep.
Volg de onderstaande stappen om verbinding te maken met een MySQL-database:

$host="lokale host"; // hostnaam (opgegeven door de provider) $database="db_name"; // naam van de database die je nodig hebt om $user="user_name" aan te maken; // gebruikersnaam die u opgeeft, of gedefinieerd door een ISP $pswd="your_pass"; // het wachtwoord dat je hebt opgegeven $dbh = mysql_connect($host, $user, $pswd) or die("Kan geen verbinding maken met MySQL."); mysql_select_db($database) or die("Kan geen verbinding maken met database.");

dus mysql_connect()- een functie om verbinding te maken met de MySQL-server op uw hosting.
MAAR mysql_select_db() selecteert een database op de server om verbinding mee te maken.
Met andere woorden, we maken verbinding met de server, selecteren de database en gaan aan de slag.
De functie die() wordt bij een fout aangeroepen en drukt het bericht af dat u hebt opgegeven in het browservenster.
Gebruik de functie om het werken met databases te beëindigen:

mysql_close($dbh);

Hier $dbh- de descriptor die wordt geretourneerd door de functie bij verbinding mysql_connect.
Nadat we de eerste beoordeling hebben afgerond, gaan we beginnen met de overweging van de daadwerkelijke SQL-query's.
Om dit te doen, moet u eerst een database met een specifieke naam maken. En daarin om de tabel te maken, ook met een specifieke naam. In onze voorbeelden verwijzen we naar de tabel mijn_sql_table. Om deze tabel te maken, laten we de volgende query uitvoeren in de phpmyadmin van onze localhost:

CREATE TABLE `my_sql_table` (`id` INT NOT NULL , // id van toekomstige tabelrecords `firstname` VARCHAR(50) NOT NULL , // tekstveld VARCHAR `achternaam` VARCHAR(50) NOT NULL , // max lengte 50 tekens PRIMAIRE SLEUTEL (`id`) // primaire sleutel - identificatie-ID);

Dus de tabel is gemaakt. Laten we het eerste verzoek uitvoeren, dat we onmiddellijk zullen uitgeven in de vorm van PHP-code:

\n"; echo "Naam: ".$row["voornaam"]."
\n"; echo "Achternaam: ".$row["achternaam"]."


\n"; ) ?>

Laten we de PHP-code van het bestand analyseren firstsql.php. Laten we beginnen met de eigenlijke query naar de databasetabellen (DB).

$query = "SELECT * FROM `my_sql_table`";

Deze query kan als volgt worden gedecodeerd: selecteer uit de tabel mijn_sql_table DB alle records uit alle velden. weg teken * na SELECTEER woorden betekent "alles selecteren". Zo, het verzoek wordt gevormd. Nu moet het gebeuren:

$res = mysql_query($query);

Als het verzoek succesvol is, wordt de functie mysql_query() zal ons de bron-ID teruggeven $res.
We moeten het als parameter doorgeven aan de functie mysql_fetch_array(). De naam van deze functie spreekt voor zich. Die. het vormt en retourneert een array op basis van een selectie uit een databasetabel. In het geval van onze tabel zal de array bestaan ​​uit het aantal elementen gelijk aan het aantal records (rijen) in de tabel en de waarden bevatten id, voornaam, achternaam voor elke tabelrij. Vandaar de volgende code:

While($row = mysql_fetch_array($res)) ( echo "Nummer: ".$row["id"]."
\n"; echo "Naam:".$row["voornaam"]."
\n"; echo "Achternaam:".$row["achternaam"]."


\N"; )

kan als volgt worden becommentarieerd: terwijl de door ons geïntroduceerde variabele $row niet-nulresultaten van de functie ontvangt mysql_fetch_row zou de browser de waarde van de velden moeten geven $row["id"], $row["voornaam"], $row["achternaam"] via echo.
Als de query als volgt wordt uitgevoerd:

$query = "SELECTEER voornaam FROM `my_sql_table`";

dan betekent dit dat uit alle rijen alleen de waarden van het veld voornaam worden geselecteerd.
Daarom moet de vorige code worden herschreven als:

$res = mysql_query($query); while($row = mysql_fetch_array($res)) ( echo "Naam:".$row["voornaam"]."
\N"; )

Als u tabelrijen met een specifieke waarde wilt selecteren ID kaart waar achternaam zal zijn Petrov, dan wordt de query als volgt herschreven:

$query = "SELECT id FROM `my_sql_table` waar achternaam = "Petrov"";

Maar als u de achternaam wilt weten van de persoon die onder het nummer staat, bijvoorbeeld 5, dan is het verzoek als volgt:

$query = "SELECTEER achternaam FROM `my_sql_table` waar id=5";

In dit geval weet u dat het resultaat van de query slechts één rij van de tabel zal zijn. Die. het heeft geen zin om een ​​lus te organiseren met terwijl. En de verwerking van het verzoek zal als volgt zijn:

$res = mysql_query($query); $row = mysql_fetch_row($res); echo "Achternaam van de vijfde persoon in de lijst: ".$row."\n";

Hier in plaats van mysql_fetch_array() die we gebruikten mysql_fetch_row(). Die. de waarde van een veld (of velden) van een bepaalde rij ophalen. Omdat we één veld hadden - achternaam - kunnen we naar het enige element van de $row-array verwijzen als $rij;.

Dus laten we eens kijken naar de meesten typische voorbeelden MySQL-query's. Afweging vindt plaats op basis van de tabel mijn_sql_table:
1. Voeg het veld middle_name (middle name) toe aan de my_sql_table tabel na achternaam:

$query = "ALTER TABLE `my_sql_table` ADD `middle_name`
VARCHAR(50) NIET NULL NA `achternaam`";

2. Laten we nu het achternaamveld uit de my_sql_table verwijderen:

$query = "ALTER TABLE `my_sql_table` DROP `achternaam`";

3. Verwijder records uit de my_sql_table tabel met de achternaam Sidorov:

$query = "VERWIJDEREN UIT `my_sql_table` waar achternaam = "Sidorov"";

4. Naast gelijktekens, ook "groter dan" of "kleiner dan", is er in de MySQL-querytaal het concept van " gelijkwaardig aan". Laten we de records uit de tabel my_sql_table selecteren, waar de achternaam " doro" :

$query = "SELECT * FROM `my_sql_table` waar achternaam zoals "%dor%"";

Hier de aanwezigheid % " aan het begin en einde van "dor" en betekent dat de zoekopdracht precies naar "dor" zal zoeken, en het maakt niet uit aan het begin, het einde of het midden van de achternaam. Beschouw het volgende voorbeeld
5. Selecteer records uit de tabel my_sql_table met een achternaam die begint met P. Let op de locatie % ":

$query = "SELECT * FROM `my_sql_table` waar achternaam zoals "P%"";

6. Bereken de maximale waarde ID kaart:

$query = "SELECTEER MAX(id) FROM `my_sql_table`";

7. Bereken het aantal velden in my_sql_table met een achternaam die begint met P.

$query = "SELECT COUNT(*) FROM `my_sql_table` waar achternaam zoals "P%"";

8. De tabel my_sql_table verwijderen:

$query = "DROP TABLE `my_sql_table`";

Voer voor verzoeken 1-3 in PHP gewoon het verzoek uit:

mysql_query($query);

We hebben de meest typische voorbeelden van verzoeken bekeken. Ik geloof dat je met hun hulp, volgens elementaire logica, in staat zult zijn om complexere zoekopdrachten uit te voeren op de MySQL-databasetabellen die je hebt gemaakt.




Als je meer vragen hebt of iets niet duidelijk is - welkom op onze