CodeIgniter Active Record: Indsæt, opdater, slet forespørgsel

⚡ Smart opsummering

CodeIgniter Active Record er et designmønster, der lader en model læse og skrive til databasen med enkle, sikre metodekæder. Det understøtter indsættelse, vælg, opdatering og sletning på tværs af forskellige databasemotorer uden at omskrive kode, og det parametriserer input for at forhindre SQL-injektion.

  • 🔗 Kerneidé: Active Record indkapsler SQL i metodekald som insert, get, update og delete.
  • 🛡️ Sikker: Værdier sendes som parametre, hvilket beskytter mod SQL-injektion.
  • 🔄 Transportabel: Den samme kode fungerer på tværs MySQL, SQL Server og andre via databasedrivere.
  • 🇧🇷 Opsætning: Konfigurer database.php og indlæs databasebiblioteket automatisk.
  • Indsæt: $this->db->insert('table', $data) opbygger og kører en INSERT.
  • 🔍 Vælg: $this->db->get('table') returnerer de rækker, der skal loopes over.
  • ✏️ Opdater og slet: En where-klausul plus opdatering eller sletning ændrer eller fjerner rækker.

CodeIgniter aktiv optagelse CRUD

Data er selve blodlinjen i de fleste applikationer. De skal lagres, så de kan analyseres for at give indsigt og lette forretningsbeslutninger. Dataene lagres normalt i en database. Blandt de vigtigste bekymringer ved interaktion med databasen er sikkerhed, nem adgang og leverandørspecifikke implementeringer af Structured Query Language (SQL) fra databaseleverandører.

Active Record er et designmønster, der gør det nemt at interagere med databasen på en sikker og overskuelig måde. Active Record har følgende fordele:

  • Indsæt, opdater og slet poster med simple metodekæder.
  • Sender brugerinput sikkert ved hjælp af parametre.
  • Giver dig mulighed for at arbejde med flere databasemotorer som f.eks MySQL og SQL Server uden at omskrive programkoden.
  • CodeIgniter bruger drivere, der er specifikke for hver databasemotor, i baggrunden.

Sådan bruger du Active Record: Eksempel

I denne vejledning bruger vi en eksempeldatabase med to tabeller, én med ordrer og én med detaljer. Denne vejledning forudsætter, at du har en MySQL database installeret og kører. Kør følgende scripts for at oprette vejledningsdatabasen:

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;

Ovenstående kode opretter en database med navnet ci_active_record og to tabeller, orders og order_details. Forholdet mellem de to tabeller er defineret af kolonne-id'et i orders og order_id i order_details.

CodeKonfiguration af Igniter-database

Vi vil nu konfigurere vores applikation til at kommunikere med denne database. Åbn databasekonfigurationsfilen, der findes i application/config/database.php, og find følgende linjer:

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

Opdater ovenstående kode til følgende:

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

Bemærk: Du skal erstatte brugernavn og adgangskode med dem, der matcher din MySQL konfiguration.

Ud over detaljerne om databasekonfigurationen skal vi også fortælle CodeIgniter for at indlæse databasebiblioteket, når det indlæses.

Trin 1) Åbn følgende fil: application/config/autoload.php.

Trin 2) Find $autoload array-nøglebibliotekerne, og indlæs databasebiblioteket som vist nedenfor:

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

Her:

  • Koden ovenfor indlæser databasebiblioteket, når applikationen starter.

CodeTænder Indsæt aktiv post

Til testformål opretter vi en controller og definerer ruter til at interagere med vores applikation via Active Record. Opret en ny fil application/controllers/ActiveRecordController.php og tilføj 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, der bruger databasetabelkolonnenavne som arraynøgler og tildeler værdier til dem.
  • `$this->db->insert('orders', $data);` kalder `insert`-metoden i databasebiblioteket og sender tabelnavnet `orders` og arrayvariablen `$data` ind. Denne linje genererer SQL INSERT-sætningen ved hjælp af `array-nøgler` som feltnavne og `array-værdier` som de værdier, der skal indsættes.

Nu hvor vi har oprettet controller-metoden, skal vi oprette en rute, som vi kalder for at udføre den. Åbn application/config/routes.php og tilføj følgende linje:

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

Her:

  • Vi definerer en rute ar/insert, der kalder store_order-metoden i ActiveRecordController.

Lad os nu starte webserveren for at teste vores metode. Kør følgende kommando for at starte den indbyggede PHP-server:

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

Her:

  • Kommandoen ovenfor navigerer til projektmappen og starter den indbyggede server på port 3000.

Indlæs følgende URL ind i din browser: http://localhost:3000/ar/insert. Du får følgende resultat:

order has successfully been created

Åbne MySQL vejledningsdatabasen og tjek ordretabellen. Du vil se den nyoprettede række, som vist på billedet nedenfor:

Ny ordrerække indsat via Active Record

CodeIgniter Vælg aktiv optagelse

I dette afsnit vil vi se på, hvordan man læser posterne i databasen og viser dem i webbrowseren som en uordnet liste. Tilføj følgende metode til 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'); kører select-forespørgslen mod orders-tabellen og vælger alle felterne.
  • ekko Ordrer liste "; viser en HTML-overskrift.
  • ekko "; udskriver åbningstagget for en uordnet HTML-liste.
  • foreach ($query->result() as $row) {…} gennemgår resultaterne fra databasen og gentager “ $række->kundenavn "; udskriver kundenavnet.

Før du indlæser URL, kan du tilføje et par poster mere til databasen. Lad os nu definere en rute til SELECT-forespørgslen. Åbn application/config/routes.php og tilføj følgende rute:

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

Her:

  • Ruten ar peger på indeksmetoden i ActiveRecordController-klassen. Dette er standardindstillingen, hvilket er grunden til, at vi ikke specificerede indeksmetoden, som vi gjorde for den rute, der indsætter poster.

Hvis webserveren allerede kører, skal du indlæse følgende URL: http://localhost:3000/arDu burde se resultater svarende til følgende i din webbrowser:

Ordreliste valgt via Aktiv post

CodeAktiv post for tændingsopdatering

I dette afsnit vil vi tale om, hvordan man bruger Active Record til at opdatere databasen. Antag, at vi vil opdatere kundenavnet Joe Thomas til Joe. Tilføj følgende metode til 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 de felter og værdier, vi ønsker at opdatere i databasetabellen.
  • $this->db->where('id', 1); angiver where-klausulen i opdateringsforespørgslen.
  • $this->db->update('ordrer', $data); genererer SQL-opdateringsforespørgslen og udfører den mod vores database.

Ovenstående kode producerer følgende SQL-sætning:

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

Lad os nu opdatere application/config/routes.php og tilføje følgende rute:

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

Gem ændringerne og indlæs følgende URL i webbrowseren:

Ordren er blevet opdateret

Lad os nu vise databaseposterne og se, om ændringen er trådt i kraft.

Ordreliste med det opdaterede navn

Som du kan se på billedet ovenfor, er den første post blevet opdateret fra Joe Thomas til Joe.

CodeSlet aktiv post ved tænding

Vi vil nu slette en post fra databasen. Vi sletter posten med id'et 3. Tilføj følgende metode til 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); sætter where-klausulen.
  • $this->db->delete('orders'); sletter databaserækken i ordretabellen baseret på de kriterier, der er angivet ved hjælp af where-klausulen.

For at udføre ovenstående kode, indlæs følgende URL i din webbrowser: http://localhost:3000/ar/delete.

Ofte Stillede Spørgsmål

Active Record binder værdier som parametre i stedet for at sammenkæde dem i SQL-strengen, så brugerinput ikke kan ændre forespørgselsstrukturen. Denne escaping sker automatisk for indsættelse, opdatering og hvor.

Ja. Active Record genererer SQL via en driver for hver motor, så det at skifte fra MySQL til SQL Server betyder normalt at ændre konfigurationen, ikke modelkoden, så længe du undgår leverandørspecifik SQL.

Where-klausulen begrænser, hvilke rækker sætningen påvirker. Uden den kører en opdatering eller sletning mod hver række i tabellen, hvilket er en almindelig og dyr fejl.

Ja. AI kan omskrive en SELECT, INSERT, UPDATE eller DELETE som den tilsvarende get-, insert-, update- eller delete-kæde. Test resultatet, da komplekse joins muligvis kræver forespørgselsbyggeren i stedet for en simpel Active Record.

Automatisk indlæsning af databasebiblioteket gør $this->db tilgængelig i alle controllere og modeller uden at skulle indlæses hver gang. Det er praktisk, når det meste af applikationen kommunikerer med databasen.

Opsummer dette indlæg med: