Det här avsnittet ger en översikt över vad pdo är och varför en utvecklare kanske vill använda den.
Det bör också nämna alla stora ämnen inom pdo och länka till relaterade ämnen. Eftersom dokumentationen för pdo är ny kan du behöva skapa initialversioner av relaterade ämnen.
PDO är ett universellt databasanslutningskommando i PHP, det stöder 12 olika databastyper, t.ex. MySQL, MongoDB, NoSQL . En stor bonus för PDO är att den beräknar din kod för att stödja databastypen, så du behöver inte göra någon chans när du flyttar över till ett annat databassystem.
PDO | mysqli | |
---|---|---|
Databasstöd | 12 olika förare | mysqli |
API | OOP | OOP + processuellt |
Förbindelse | Lätt | Lätt |
Namngivna parametrar | Ja | Nej |
Objektkartläggning | Ja | Ja |
Förberedda uttalanden (klientsidan) | Ja | Nej |
Prestanda | Snabb | Snabb |
Lagrade procedurer | Ja | Ja |
Anslutningsdelen ser obekväm ut men det måste vi ta itu med. Resten av BOB är enkel och användbar, det hjälper också att göra den säkra delen ännu enklare.
$connection = new PDO("mysql:host=localhost;dbname=myDatabase, username, password);
PDO-anslutningen beställs enligt följande:
PDO (
database type
: host =host
; dbname =database name
,root
,password
);
// We use a array to hold the data about whats the :var is in normal $var
$params = array(
':username' => '$username',
':email' => $mail,
);
// Prepare the SQL and using named secure parameters ":username"
$pdo->prepare('SELECT * FROM users WHERE username = :username AND email = :email');
// Execute the $params and send them to the $pdo->prepare
$pdo->execute($params);
Koden du just har läst är skyddade SQL-injektioner
Installera:
Hur du installerar PDO om du inte har den
guider:
W3Schools handledning
Tuts + handledning (rekommenderas)
PDO :: setAttribute anger ett attribut i databashandtaget. Beskrivning av setAttribute är:
public bool PDO::setAttribute ( int $attribute , mixed $value )
PDO :: ATTR_ERRMODE: Detta attribut används för felrapportering. Det kan ha ett av följande värden.
PDO::ERRMODE_SILENT
: Om ATTR_ERRMODE inte är inställd i koden är ERRMODE_SILENT standardvärdet för attributet ATTR_ERRMODE. Den anger felkoder. I tyst läge, om det finns ett fel i SQL, kommer PDO att kasta inga undantag; PDO kommer inte att ge några varningar; det kommer helt enkelt att returnera falskt. Värdet på PDO :: ERRMODE_SILENT är 0. Skriptet körs utan att generera något fel eller varning. PDO::ERRMODE_WARNING
: Detta värde höjer E_WARNING. I varningsläge, om det finns ett fel i SQL, kommer PDO att utfärda varningar men skriptet fortsätter att köras. Värde på PDO :: ERRMODE_WARNING är 1. Skriptet körs med generering av varning om felet. PDO::ERRMODE_EXCEPTION
: Detta värde kastar undantag. I undantagsläge, om det finns ett fel i SQL, kommer PDO att kasta undantag och skriptet kommer att sluta köras. Värde på PDO :: ERRMODE_EXCEPTION är 2. Skriptet kommer att sluta exekvera generera felet som kastar undantaget. Exempel: Nu ska vi se de olika värdena för attributet ATTR_ERRMODE med några exempel. För att göra det, skapa en databas som heter learn_project_db
och sätt in en tabell som heter user_table
i den. Följande SQL-kod kan användas för att uppnå det:
DROP DATABASE IF EXISTS `learn_project_db`;
CREATE DATABASE `learn_project_db`;
USE `learn_project_db`;
CREATE TABLE `user_table` (
`user_email` varchar(50) PRIMARY KEY,
`user_password` varchar(50) NOT NULL
);
INSERT INTO `user_table` (`user_email`, `user_password`) VALUES
('test1@example.com', '123'),
('test2@example.com', '1234'),
('test3@example.com', '12345');
Först ska vi kontrollera vad som kommer att hända om vi inte ställer in ATTR_ERRMODE
och vi kommer att ha fel i SQL-frågan. Skapa en PHP-fil som heter default.php
och prova detta:
<?php
$server = "localhost";
$db_username = "root";
$db_password = "";
$db_name = "learn_project_db";
$conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
$sql_query = "SELECT * FROM wrong_user_table";
$stmt = $conn->prepare($sql_query);
$stmt->execute();
$result_set = $stmt->fetchAll();
var_dump($result_set);
/*Get the current error mode of PDO*/
$current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
echo "<br>";
echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode;
?>
Lägg märke till att wrong_user_table
är wrong_user_table
i frågan som inte definieras i databasen vi skapade tidigare. Men eftersom vi inte ställde in ATTR_ERRMODE
kommer det att köra skriptet utan att kasta något undantag eller ge någon varning. Det kommer att mata ut en tom matris som resultatuppsättning. Vi bör också märka att värdet på PDO::ATTR_ERRMODE
är 0.
Nu ska vi kontrollera vad som kommer att hända om vi ställer in ATTR_ERRMODE
med värdet PDO::ERRMODE_WARNING
och vi kommer att ha fel i SQL-frågan. Skapa en PHP-fil som heter warning.php
och prova detta:
<?php
$server = "localhost";
$db_username = "root";
$db_password = "";
$db_name = "learn_project_db";
$conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$sql_query = "SELECT * FROM wrong_user_table";
$stmt = $conn->prepare($sql_query);
$stmt->execute();
$result_set = $stmt->fetchAll();
var_dump($result_set);
/*Get the current error mode of PDO*/
$current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
echo "<br>";
echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode;
?>
Utgång från warning.php
är:
Warning: PDOStatement::execute(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'learn_project_db.wrong_user_table' doesn't exist in E:\xampp\htdocs\oop\db.php on line 10
array(0) { }
Value of PDO::ATTR_ERRMODE: 1
Den här gången när vi ställer in ATTR_ERRMODE
med PDO::ERRMODE_WARNING
värdet kommer det att visa ett varningsmeddelande. Skriptet körs framgångsrikt och visar en tom matris som utgång med värdet av PDO::ATTR_ERRMODE
av 1.
Till sist kommer vi att kontrollera vad som kommer att hända om vi ställer in ATTR_ERRMODE
med värdet PDO::ERRMODE_EXCEPTION
och vi kommer att ha fel i SQL-frågan. Skapa en PHP-fil som heter error.php
och prova detta:
<?php
$server = "localhost";
$db_username = "root";
$db_password = "";
$db_name = "learn_project_db";
$conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql_query = "SELECT * FROM wrong_user_table";
$stmt = $conn->prepare($sql_query);
$stmt->execute();
$result_set = $stmt->fetchAll();
var_dump($result_set);
/*Get the current error mode of PDO*/
$current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
echo "<br>";
echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode;
?>
Output of error.php
är:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'learn_project_db.wrong_user_table' doesn't exist' in E:\xampp\htdocs\oop\db.php:10 Stack trace: #0 E:\xampp\htdocs\oop\db.php(10): PDOStatement->execute() #1 {main} thrown in E:\xampp\htdocs\oop\db.php on line 10
Den här gången när vi ställer in ATTR_ERRMODE
med PDO::ERRMODE_EXCEPTION
värde kommer det att kasta PDOException
som genererar ett dödligt fel. Skriptet kommer att sluta köras efter att undantaget kastats. Detta är vanligast för att hantera fel i databasfrågan. Under större delen av tiden ställer vi in attributet ATTR_ERRMODE
med detta värde för att hantera alla undantag som kan finnas i SQL-frågan.