|
Metoder etc. | CRUD | Kort besk. | |||
---|---|---|---|---|---|
select felter | insert | update | delete | ||
sql | x | x | x | x | Opbygning af SQL-sætning med ? som 'placeholdere'. |
prepare() | x | x | x | x | Forbereder SQL-sætningen til udførelse . |
bind_param() | x | x | x | x | Datatype og felter bag placeholdere for tilknytning til SQL-sætningen. |
Feltliste | x | x | Tilknytning af eksterne kildedata til bind_param()-felterne i insert- eller update-felter. | ||
execute() | x | x | x | x | Udfører databasejobbet |
store_result() | x | Overfører udtrukne data til memory ('result'). | |||
bind_result() | x | Tilknytter brugerdefinerede variabelnavne til dataene i 'result'. | |||
$num_rows | x | Optæller antal records i 'result'. Kan udelades. | |||
while($query_fetch){} | x | Brug af uddata fra 'result'. Kan udelades. | |||
close() | x | x | x | x | Lukker prepared statement og sletter result. - Skal ved 'select' placeres efter 'fetch'. Det er væsentligt at lukke, da kun et prepared statement kan være aktivt ad gangen. |
Forrest i parameterfeltet i 'bind_param' indsættes en kode med et bogstav pr felt med datatypen for de substituerede felters '?'-felter. Der skal være en kode pr substitution. Koderne skal anføres i samme rækkefølge som substitutionerne. Der kan vælges blandt 4 koder:
s | streng | Alle felttyper beregnet til tekst |
i | tal | Alle felttyper beregnet til tal. |
d | double | Tegn, der kræver 2 bytes. Kinesisk, japansk etc. |
b | blob |
Der skal i prepared statements kun anvendes gnyffer (anførselstegn) omkring SQL-sætningen og omkring strengen med datatypekoder.
Model for INSERT-query:
Eksterne data tilføres via value-delen af 'Feltliste'.
$sql = "INSERT INTO tabelnavn (feltnavn01, feltnavn02, feltnavn03) VALUES (?, ?, ?)"; $query = $db_link->prepare($sql); $query->bind_param('ssi', $feltnavn01, $feltnavn02, $feltnavn03); $feltnavn01 = $feltnavn01; $feltnavn02 = $feltnavn02; $feltnavn03 = time(); $query->execute(); $query->close(); header ( "Location: programnavn.php"); exit; |
I en mange / mange tabel er grundprincippet at alle records - baseret på den primære tabeldel - først slettes. Derefter indsættes alle nye records med INSERT. Der foretages aldrig UPDATE.
INSERT-delen vil være karakteriseret ved indsættelse af en eller flere records med samme struktur. Opbygningen af prepared statements muliggør, at SQL-sætningen kun opbygges en gang og genbruges efter behov.
Den samlede model for mange / mange kan se sådan ud:
DELETE: $sql = "DELETE FROM doktags WHERE dok_id = ?"; $query = $db_link->prepare($sql); $query->bind_param('i', $dok_id); $query->execute(); $query->close(); |
INSERT (Her baseret på array) $sql = "INSERT INTO doktags (dok_id, tag_id) VALUES (?, ?)"; foreach($tags as $tag_id) { $query = $db_link->prepare($sql); $query->bind_param('ii', $dok_id, $tag_id); $dok_id = $dok_id; $tag_id = $tag_id; $query->execute(); $query->close(); } |
Model for UPDATE-query:
Eksterne data tilføres via value-delen af 'Feltliste'.
$sql = "UPDATE tabelnavn SET feltnavn01=?, feltnavn02=?, feltnavn03=? WHERE xx_id=?"; $query = $db_link->prepare($sql); $query->bind_param('sssi', $feltnavn01, $feltnavn02, $feltnavn03, $xx_id); $feltnavn01 = $feltnavn01; $feltnavn02 = $feltnavn02; $feltnavn03 = $feltnavn03; $xx_id = $xx_id; $query->execute(); $query->close(); |
Model for DELETE-query:
$sql = "DELETE FROM tabelnavn WHERE xx_id = ?"; $query = $db_link->prepare($sql); $query->bind_param('i', $xx_id); $query->execute(); $query->close(); |
Alt efter opgaven kan et prepared statement for SELECT opbygges på 3 måder:
('$antal' er optionel i dem alle)
I alle situationer kan '$query->bind_result'-variablerne generelt resp. i while-løkken bruges som almindelige variabler.
Modeller for SELECT-query:
Ved udtræk af alle records fra tabel: $sql = "SELECT feltnavn01, feltnavn02, feltnavn03 FROM tabel order by feltnavnx asc"; $query = $db_link->prepare($sql); $query->execute(); $query->store_result(); $query->bind_result($feltnavn01, $feltnavn02); $antal = $query->num_rows; while($query->fetch()) { ... Anvendelse af de selekterede data. Identerne fra $query->bind_result(xxx) anvendes til at angive uddata. ... } $query->close(); |
Ved udtræk af flere records fra tabel: $sql = "SELECT feltnavn01, feltnavn02, feltnavn03 FROM tabel WHERE feltnavn0x x ? and feltnavn0y x ?"; $query = $db_link->prepare($sql); $query->bind_param('xx', $valuevariabel0x, $valuevariabel0y ); $query->execute(); $query->store_result(); $query->bind_result($feltnavn01, $feltnavn02); $antal = $query->num_rows; while($query->fetch()) { ... Anvendelse af de selekterede data. Identerne fra $query->bind_result(xxx) anvendes til at angive uddata. ... } $query->close(); |
Ved udtræk af enkelt record fra tabel: $sql = "SELECT feltnavn01, feltnavn02, feltnavn03 FROM tabel WHERE feltnavn0x = ? or feltnavn0y = ?"; $query = $db_link->prepare($sql); $query->bind_param('xx', $valuevariabel0x, $valuevariabel0y ); $query->execute(); $query->store_result(); $query->bind_result($feltnavn01, $feltnavn02); $antal = $query->num_rows; $query->fetch(); $query->close(); |
Udtrækket placeres inde i en 'foreach'-løkke. Derved udtrækkes record for sig og der kan ikke anvendes 'order by' eller mange andre parametre / metoder på udtrækket.
$tags = ($_POST['tags']); $sql = "SELECT dok_id FROM doktags WHERE tag_id = ?"; foreach($tags as $tag_id) { $query = $db_link->prepare($sql); $query->bind_param('i', $tag_id ); $query->execute(); $query->store_result(); $query->bind_result($dok_id); $antal = $query->num_rows; while($query->fetch()) { echo "<br />".$dok_id; } $query->close(); } |
Select anvendes ofte i forbindelse med validering til at kontrollere 'findes' / 'findes ikke'.
Den anvendes lidt forskelligt alt efter den primære CRUD-aktivitet det pågældende program udfører.
Der vil altid være knyttet en if-sætning til at styre om sand eller falsk.
MINIMUM SELECT: Så længe man alene vil tælle antal uden at give noget andet feedback end evt. antal, kan SELECT (også i eksemplerne nedenfor) begrænses til denne model: $sql = "SELECT felt_id FROM tabelnavn"; $query = $db_link->prepare($sql); $query->xecute(); $query->store_result(); $antal = $query->num_rows; if($antal x nn){ ..... } |
INSERT: Kontrol af at felt_navn er unikt før recorden indsættes i tabellen. $sql = "SELECT felt_navn FROM tabelnavn where felt_navn = ?"; $query = $db_link->prepare($sql); $query->bind_param('s', $felt_navn); $query->execute(); $query->store_result(); $query->bind_result($felt_navn); $antal = $query->num_rows; $query->close(); if ($antal > 0) { $fejlbeskeder .= "Feltnavnet $felt_navn er allerede brugt.<br />"; } |
UPDATE: Kontrol af at felt_navn er unikt før recorden opdateres i tabellen. Der skal her tages højde for at den kontrollerede ident måske allerede - korrekt - er til stede i den aktuelle record. Recorden skal derfor ikke indgå i valireringen. $sql = "SELECT felt_navn FROM tabelnavn where felt_navn = ? and felt_id != ?"; $query = $db_link->prepare($sql); $query->bind_param('si', $felt_navn, $felt_id); $query->execute(); $query->store_result(); $query->bind_result($felt_navn); $antal = $query->num_rows; $query->close(); if ($antal > 0) { $fejlbeskeder .= "Feltnavnet $felt_navn er allerede brugt.<br />"; } |
DELETE: Kontrol af om identen stadig bruges i anden (primær) tabel. $sql = "SELECT felt_id FROM tabelnavn WHERE felt_id = ?"; $query = $db_link->prepare($sql); $query->bind_param('i', $felt_id ); $query->execute(); $query->store_result(); $query->bind_result($ret_id); v $antal = $query->num_rows; if($antal > 0){ $fejlbeskeder .= "xxx er stadig knyttet til en eller flere yyy.<br />"; } |
I drop down menuer anvendes prepared statements (SELECT) på helt samme måde som andetsteds.
Eksempler senere.