CodeIgniter Active Record: Sett inn, oppdater, slett spørring

⚡ Smart oppsummering

CodeIgniter Active Record er et designmønster som lar en modell lese og skrive databasen med enkle, sikre metodekjeder. Det støtter innsetting, select, oppdatering og sletting på tvers av forskjellige databasemotorer uten å skrive om kode, og det parameteriserer input for å forhindre SQL-injeksjon.

  • đź”— Kjerneide: Active Record pakker SQL inn i metodekall som insert, get, update og delete.
  • 🛡️ Sikre: Verdier sendes som parametere, noe som beskytter mot SQL-injeksjon.
  • 🔄 Bærbar: Den samme koden fungerer pĂĄ tvers MySQL, SQL Server og andre via databasedrivere.
  • ⚙️ Oppsett: Konfigurer database.php og last inn databasebiblioteket automatisk.
  • âž• Sett inn: $this->db->insert('table', $data) bygger og kjører en INSERT.
  • 🔍 Plukke ut: $this->db->get('table') returnerer radene som skal løkkes over.
  • ✏️ Oppdater og slett: En where-klausul pluss oppdatering eller sletting endrer eller fjerner rader.

CodeIgniter aktiv post CRUD

Data er selve kjernen i de fleste applikasjoner. De må lagres slik at de kan analyseres for å gi innsikt og legge til rette for forretningsbeslutninger. Dataene lagres vanligvis i en database. Blant de viktigste bekymringene når man samhandler med databasen er sikkerhet, enkel tilgang og leverandørspesifikke implementeringer av Structured Query Language (SQL) for databaseleverandører.

Active Record er et designmønster som gjør det enkelt å samhandle med databasen på en sikker og tydelig måte. Active Record har følgende fordeler:

  • Sett inn, oppdater og slett poster med enkle metodekjeder.
  • Sender inn brukerinndata sikkert ved hjelp av parametere.
  • Lar deg jobbe med flere databasemotorer som f.eks MySQL og SQL Server uten ĂĄ omskrive applikasjonskoden.
  • CodeIgniter bruker drivere som er spesifikke for hver databasemotor i bakgrunnen.

Slik bruker du aktiv post: Eksempel

I denne veiledningen skal vi bruke en eksempeldatabase med to tabeller, én med ordrer og den andre med detaljer. Denne veiledningen forutsetter at du har en MySQL databasen er installert og kjører. Kjør følgende skript for å opprette opplæringsdatabasen:

CREATE SCHEMA ci_active_record;

USE ci_active_record;

CREATE TABLE `order_details` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) DEFAULT NULL,
`item` varchar(245) DEFAULT NULL,
`quantity` int(11) DEFAULT '0',
`price` decimal(10,2) DEFAULT '0.00',
`sub_total` decimal(10,2) DEFAULT '0.00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT = 1;

CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` timestamp NULL DEFAULT NULL,
`customer_name` varchar(245) DEFAULT NULL,
`customer_address` varchar(245) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT = 1;

Koden ovenfor oppretter en database kalt ci_active_record og to tabeller, orders og order_details. Forholdet mellom de to tabellene er definert av kolonne-ID-en i orders og order_id i order_details.

CodeKonfigurasjon av Igniter-databasen

Vi skal nå konfigurere applikasjonen vår til å kommunisere med denne databasen. Åpne databasekonfigurasjonsfilen som ligger i application/config/database.php og finn følgende linjer:

'hostname' => 'localhost',
'username' => '',
'password' => '',
'database' => '',

Oppdater koden ovenfor til følgende:

'hostname' => 'localhost',
'username' => 'root',
'password' => 'letmein',
'database' => 'ci_active_record',

OBS: du mĂĄ erstatte brukernavnet og passordet med de som samsvarer med ditt MySQL konfigurasjon.

I tillegg til detaljene om databasekonfigurasjonen, mĂĄ vi ogsĂĄ fortelle CodeIgniter for ĂĄ laste inn databasebiblioteket nĂĄr det lastes inn.

Trinn 1) Åpne følgende fil: application/config/autoload.php.

Trinn 2) Finn $autoload array-nøkkelbibliotekene og last inn databasebiblioteket som vist nedenfor:

$autoload['libraries'] = array('database');

Her:

  • Koden ovenfor laster inn databasebiblioteket nĂĄr applikasjonen starter.

CodeIgniter Sett inn aktiv post

For testformål skal vi opprette en kontroller og definere ruter for å samhandle med applikasjonen vår via Active Record. Opprett en ny fil application/controllers/ActiveRecordController.php og legg til følgende kode:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class ActiveRecordController extends CI_Controller {
public function store_order(){
$data = [
'date' => '2018-12-19',
'customer_name' => 'Joe Thomas',
'customer_address' => 'US'
];

$this->db->insert('orders', $data);

echo 'order has successfully been created';
}
}

Her:

  • $data = […] definerer en arrayvariabel data som bruker kolonnenavn i databasetabeller som arraynøkler og tilordner verdier til dem.
  • `$this->db->insert('orders', $data);` kaller insert-metoden til databasebiblioteket, og sender inn tabellnavnet `orders` og arrayvariabelen $data. Denne linjen genererer SQL INSERT-setningen ved ĂĄ bruke arraynøklene som feltnavn og arrayverdiene som verdiene som skal settes inn.

Nå som vi har opprettet kontrollermetoden, må vi opprette en rute som vi kaller for å kjøre den. Åpne application/config/routes.php og legg til følgende linje:

$route['ar/insert'] = 'activerecordcontroller/store_order';

Her:

  • Vi definerer en rute ar/insert som kaller store_order-metoden til ActiveRecordController.

La oss nå starte webserveren for å teste metoden vår. Kjør følgende kommando for å starte den innebygde PHP-serveren:

cd C:\Sites\ci-app
php -S localhost:3000

Her:

  • Kommandoen ovenfor navigerer til prosjektkatalogen og starter den innebygde serveren pĂĄ port 3000.

Last inn følgende URL inn i nettleseren din: http://localhost:3000/ar/insert. Du vil få følgende resultat:

order has successfully been created

Ă…pne MySQL veiledningsdatabasen og sjekk ordretabellen. Du vil se den nyopprettede raden, som vist pĂĄ bildet nedenfor:

Ny ordrerad satt inn via aktiv post

CodeIgniter Velg aktiv oppføring

I denne delen skal vi se hvordan vi leser postene i databasen og viser dem i nettleseren som en uordnet liste. Legg til følgende metode i ActiveRecordController:

public function index() {
$query = $this->db->get('orders');

echo "<h3>Orders Listing</h3>";
echo "<ul>";

foreach ($query->result() as $row) {
echo "<li>$row->customer_name</li>";
}

echo "</ul>";
}

Her:

  • $query = $this->db->get('orders'); kjører utvalgsspørringen mot ordretabellen, og velger alle feltene.
  • ekko Ordreliste "; viser en HTML-overskrift.
  • ekko ”; skriver ut ĂĄpningstaggen for en uordnet HTML-liste.
  • foreach ($query->result() as $row) {…} gĂĄr gjennom resultatene som returneres fra databasen i løkker, og gjentar “ $rad->kundenavn ”; skriver ut kundenavnet.

Før du laster inn URL, kan du legge til et par poster til i databasen. La oss nå definere en rute for SELECT-spørringen. Åpne application/config/routes.php og legg til følgende rute:

$route['ar'] = 'activerecordcontroller';

Her:

  • Ruten ar peker til indeksmetoden i ActiveRecordController-klassen. Dette er standardinnstillingen, og det er derfor vi ikke spesifiserte indeksmetoden, slik vi gjorde for ruten som setter inn poster.

Forutsatt at webserveren allerede kjører, last inn følgende URL: http://localhost:3000/arDu bør se resultater som ligner på følgende i nettleseren din:

Ordreliste valgt via aktiv post

CodeAktiv oppføring for Igniter-oppdatering

I denne delen skal vi snakke om hvordan man bruker Active Record til å oppdatere databasen. Anta at vi vil oppdatere kundenavnet Joe Thomas til Joe. Legg til følgende metode i ActiveRecordController-klassen:

public function update_order() {
$data = [
'customer_name' => 'Joe',
];
$this->db->where('id', 1);
$this->db->update('orders', $data);
echo 'order has successfully been updated';
}

Her:

  • $data = […] definerer feltene og verdiene vi ønsker ĂĄ oppdatere i databasetabellen.
  • $this->db->where('id', 1); setter where-klausulen i oppdateringsspørringen.
  • $this->db->update('ordrer', $data); genererer SQL-oppdateringsspørringen og kjører den mot databasen vĂĄr.

Koden ovenfor produserer følgende SQL-setning:

UPDATE orders SET customer_name = 'Joe' WHERE id = 1;

La oss nå oppdatere application/config/routes.php og legge til følgende rute:

$route['ar/update'] = 'activerecordcontroller/update_order';

Lagre endringene og last inn følgende URL i nettleseren:

Bestillingen er oppdatert

La oss nĂĄ vise databasepostene og se om endringen har trĂĄdt i kraft.

Ordreliste som viser det oppdaterte navnet

Som du kan se av bildet ovenfor, har den første posten blitt oppdatert fra Joe Thomas til Joe.

CodeSlett aktiv oppføring ved å tende

Vi skal nå slette en post fra databasen. Vi skal slette posten med ID-en 3. Legg til følgende metode i ActiveRecordController:

public function delete_order() {
$this->db->where('id', 3);
$this->db->delete('orders');

echo 'order has successfully been deleted';
}

Her:

  • $this->db->where('id', 3); setter where-klausulen.
  • $this->db->delete('orders'); sletter databaseraden i ordrestabellen basert pĂĄ kriteriene som er satt med where-klausulen.

For å kjøre koden ovenfor, last inn følgende URL i nettleseren din: http://localhost:3000/ar/delete.

Spørsmål og svar

Aktiv post binder verdier som parametere i stedet for å sette dem sammen i SQL-strengen, slik at brukerinput ikke kan endre spørringsstrukturen. Denne eskaping skjer automatisk for innsetting, oppdatering og hvor.

Ja. Active Record genererer SQL gjennom en driver for hver motor, så å bytte fra MySQL til SQL Server betyr vanligvis å endre konfigurasjonen, ikke modellkoden, så lenge du unngår leverandørspesifikk SQL.

Where-klausulen begrenser hvilke rader setningen påvirker. Uten den kjøres en oppdatering eller sletting mot hver rad i tabellen, noe som er en vanlig og kostbar feil.

Ja. AI kan omskrive en SELECT-, INSERT-, UPDATE- eller DELETE-kjede som tilsvarende get-, insert-, update- eller delete-kjeder. Test resultatet, siden komplekse koblinger kan trenge spørrebyggeren i stedet for en enkel aktiv post.

Automatisk lasting av databasebiblioteket gjør $this->db tilgjengelig i alle kontrollere og modeller uten å laste den inn hver gang. Det er praktisk når mesteparten av applikasjonen kommuniserer med databasen.

Oppsummer dette innlegget med: