CodeIgniter Active Record: Infoga, uppdatera, ta bort fråga

⚡ Smart sammanfattning

CodeIgniter Active Record är ett designmönster som låter en modell läsa och skriva databasen med enkla, säkra metodkedjor. Det stöder infoga, välja, uppdatera och ta bort mellan olika databasmotorer utan att skriva om kod, och det parametriserar inmatning för att förhindra SQL-injektion.

  • 🔗 Kärnidé: Active Record omsluter SQL i metodanrop som insert, get, update och delete.
  • 🛡️ Säkra: Värden skickas som parametrar, vilket skyddar mot SQL-injektion.
  • 🔄 Bärbar: Samma kod fungerar överallt MySQL, SQL Server och andra via databasdrivrutiner.
  • ⚙️ Setup: Konfigurera database.php och ladda databasbiblioteket automatiskt.
  • Föra in: $this->db->insert('table', $data) skapar och kör en INSERT.
  • 🔍 Välj: $this->db->get('table') returnerar raderna att loopa över.
  • ✏️ Uppdatera och ta bort: En where-klausul plus uppdatering eller borttagning ändrar eller tar bort rader.

CodeIgniter aktiv post CRUD

Data är själva kärnan i de flesta applikationer. De behöver lagras så att de kan analyseras för att ge insikter och underlätta affärsbeslut. Informationen lagras vanligtvis i en databas. Bland de viktigaste frågorna vid interaktion med databasen är säkerhet, enkel åtkomst och leverantörsspecifika implementeringar av Structured Query Language (SQL).

Active Record är ett designmönster som gör det enkelt att interagera med databasen på ett säkert och tydligt sätt. Active Record har följande fördelar:

  • Infoga, uppdatera och ta bort poster med enkla metodkedjor.
  • Skickar in användarinmatning säkert med hjälp av parametrar.
  • Låter dig arbeta med flera databasmotorer som t.ex MySQL och SQL Server utan att skriva om applikationskoden.
  • CodeIgniter använder drivrutiner som är specifika för varje databasmotor i bakgrunden.

Hur man använder Active Record: Exempel

I den här handledningen använder vi en exempeldatabas med två tabeller, en med ordrar och den andra med detaljer. Handledningen förutsätter att du har en MySQL databasen är installerad och körs. Kör följande skript för att skapa handledningsdatabasen:

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 ovan skapar en databas med namnet ci_active_record och två tabeller, orders och order_details. Relationen mellan de två tabellerna definieras av kolumn-ID i orders och order_id i order_details.

CodeKonfiguration av Igniter-databas

Vi ska nu konfigurera vår applikation för att kommunicera med den här databasen. Öppna databasens konfigurationsfil som finns i application/config/database.php och leta reda på följande rader:

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

Uppdatera koden ovan till följande:

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

Obs: du måste ersätta användarnamnet och lösenordet med de som matchar ditt MySQL konfiguration.

Förutom detaljerna om databasens konfiguration behöver vi också berätta CodeIgniter för att ladda databasbiblioteket när det laddas.

Steg 1) Öppna följande fil: application/config/autoload.php.

Steg 2) Leta reda på nyckelbiblioteken för arrayen $autoload och ladda databasbiblioteket enligt nedan:

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

Här:

  • Koden ovan laddar databasbiblioteket när programmet startar.

CodeTändare Infoga aktiv post

För teständamål kommer vi att skapa en kontroller och definiera rutter för att interagera med vår applikation via Active Record. Skapa en ny fil application/controllers/ActiveRecordController.php och lägg till följande kod:

<?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';
}
}

Här:

  • $data = […] definierar en arrayvariabel data som använder databastabellkolumnnamn som arraynycklar och tilldelar värden till dem.
  • $this->db->insert('orders', $data); anropar insert-metoden för databasbiblioteket och skickar in tabellnamnet orders och arrayvariabeln $data. Den här raden genererar SQL INSERT-satsen med hjälp av arraynycklarna som fältnamn och arrayvärdena som värden som ska infogas.

Nu när vi har skapat controllermetoden behöver vi skapa en rutt som vi anropar för att köra den. Öppna application/config/routes.php och lägg till följande rad:

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

Här:

  • Vi definierar en rutt ar/insert som anropar store_order-metoden för ActiveRecordController.

Låt oss nu starta webbservern för att testa vår metod. Kör följande kommando för att starta den inbyggda PHP-servern:

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

Här:

  • Kommandot ovan bläddrar till projektkatalogen och startar den inbyggda servern på port 3000.

Ladda följande URL i din webbläsare: http://localhost:3000/ar/insert. Du får följande resultat:

order has successfully been created

Öppna MySQL handledningsdatabasen och kontrollera ordertabellen. Du kommer att se den nyskapade raden, som visas på bilden nedan:

Ny orderrad infogad via aktiv post

CodeTändningsval Aktiv post

I det här avsnittet ska vi se hur man läser posterna i databasen och visar dem i webbläsaren som en oordnad lista. Lägg till följande metod 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>";
}

Här:

  • $query = $this->db->get('orders'); kör urvalsfrågan mot ordertabellen och väljer alla fält.
  • eko Orderlista ”; visar en HTML-rubrik.
  • eko ”; skriver ut öppningstaggen för en oordnad HTML-lista.
  • foreach ($query->result() as $row) {…} loopar igenom resultaten som returneras från databasen och upprepar “ $rad->kundnamn ”; skriver ut kundnamnet.

Innan du laddar URL, kan du lägga till ett par poster till i databasen. Låt oss nu definiera en rutt för SELECT-frågan. Öppna application/config/routes.php och lägg till följande rutt:

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

Här:

  • Rutten ar pekar på indexmetoden i ActiveRecordController-klassen. Detta är standardinställningen, vilket är anledningen till att vi inte specificerade indexmetoden, som vi gjorde för rutten som infogar poster.

Förutsatt att webbservern redan körs, ladda följande URL: http://localhost:3000/arDu bör se resultat som liknar följande i din webbläsare:

Orderlista vald via aktiv post

CodeAktiv post för Igniter-uppdatering

I det här avsnittet kommer vi att prata om hur man använder Active Record för att uppdatera databasen. Anta att vi vill uppdatera kundnamnet Joe Thomas till Joe. Lägg till följande metod 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';
}

Här:

  • $data = […] definierar de fält och värden vi vill uppdatera i databastabellen.
  • $this->db->where('id', 1); anger where-klausulen för uppdateringsfrågan.
  • $this->db->update('order', $data); genererar SQL-uppdateringsfrågan och kör den mot vår databas.

Koden ovan producerar följande SQL-sats:

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

Låt oss nu uppdatera application/config/routes.php och lägga till följande rutt:

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

Spara ändringarna och ladda följande URL i webbläsaren:

Meddelandet om beställningen har uppdaterats

Låt oss nu visa databasposterna och se om ändringen har trätt i kraft.

Orderlista som visar det uppdaterade namnet

Som du kan se på bilden ovan har den första posten uppdaterats från Joe Thomas till Joe.

CodeTändningsradering av aktiv post

Vi ska nu ta bort en post från databasen. Vi tar bort posten med ID:t 3. Lägg till följande metod i ActiveRecordController:

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

echo 'order has successfully been deleted';
}

Här:

  • $this->db->where('id', 3); ställer in where-klausulen.
  • $this->db->delete('orders'); tar bort databasraden i orderstabellen baserat på kriterierna som angetts med where-klausulen.

För att köra koden ovan, ladda följande URL i din webbläsare: http://localhost:3000/ar/delete.

Vanliga frågor

Active Record binder värden som parametrar istället för att sammanfoga dem till SQL-strängen, så att användarinmatning inte kan ändra frågestrukturen. Denna escaping sker automatiskt för infoga, uppdatera och var.

Ja. Active Record genererar SQL via en drivrutin för varje motor, så att byta från MySQL till SQL Server innebär vanligtvis att ändra konfigurationen, inte modellkoden, så länge du undviker leverantörsspecifik SQL.

Where-klausulen begränsar vilka rader som satsen påverkar. Utan den körs en uppdatering eller borttagning mot varje rad i tabellen, vilket är ett vanligt och kostsamt misstag.

Ja. AI kan skriva om en SELECT-, INSERT-, UPDATE- eller DELETE-kedja som motsvarande get-, insert-, update- eller delete-kedja. Testa resultatet, eftersom komplexa kopplingar kan behöva frågebyggaren snarare än en enkel Active Record.

Att automatiskt ladda databasbiblioteket gör $this->db tillgängligt i varje kontroller och modell utan att det behöver laddas varje gång. Det är praktiskt när större delen av applikationen kommunicerar med databasen.

Sammanfatta detta inlägg med: