Sobes.tech
Junior

Kas ir sagatavotas vaicājums?

sobes.tech AI

Atbilde no AI

Šis ir veids, kā palielināt drošību un veiktspēju darbā ar datu bāzēm, kad SQL vaicājuma šablons tiek nosūtīts datu bāzes serverim atsevišķi no pašu datiem.

Priekšrocības:

  • Aizsardzība pret SQL injekcijām: Dati tiek apstrādāti datu bāzes serverī kā literāli, nevis kā SQL koda daļa.
  • Veiktspēja: Datu bāzes serveris kešē veicēšanas plānu, kas ietaupa laiku, atkārtoti izpildot to pašu vaicājumu ar dažādiem parametriem.
  • Ērtība: Tie ļauj strukturēt kodu un atvieglo kļūdu labošanas procesu.

Sagatavotā vaicājuma izpildes posmi:

  1. Sagatavošana (Prepare): Vaicājuma šablons tiek nosūtīts datu bāzes serverim analīzei, sintakses pārbaudei un izpildes plāna izveidei. Šablonā tiek izmantoti aizstājēji datu ievietošanai.
  2. Saistīšana (Bind): Mainīgo vērtības tiek saistītas ar aizstājējiem. Servers tos neinterpretē kā SQL kodu.
  3. Izpilde (Execute): Vaicājums tiek izpildīts ar saistītajām vērtībām.

Piemērs, kā izmantot sagatavotu vaicājumu PHP ar PDO:

// Savienojums ar datu bāzi (piemērs)
$dsn = 'mysql:host=localhost;dbname=mydatabase';
$lietotajs = 'myuser';
$parole = 'mypassword';

try {
    $pdo = new PDO($dsn, $lietotajs, $parole);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Savienojuma kļūda: ' . $e->getMessage());
}

// Sagatavota vaicājuma ar aizstājējiem
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE id = :id");

// Vērtības saistīšana ar aizstājēju
$lietotajaId = 1;
$stmt->bindParam(':id', $lietotajaId, PDO::PARAM_INT);

// Vaicājuma izpilde
$stmt->execute();

// Rezultātu iegūšana
$lietotajs = $stmt->fetch(PDO::FETCH_ASSOC);

if ($lietotajs) {
    echo "Lietotāja vārds: " . htmlspecialchars($lietotajs['name']) . "<br>";
    echo "Lietotāja e-pasts: " . htmlspecialchars($lietotajs['email']) . "<br>";
} else {
    echo "Lietotājs ar ID " . htmlspecialchars($lietotajaId) . " nav atrasts.";
}

Šajā piemērā :id ir nosaukts aizstājējs. Var izmantot arī pozicionālos aizstājējus (?).

// Sagatavota vaicājuma ar pozicionālo aizstājēju
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE id = ?");

// Izpilde ar vērtību masīvu
$lietotajaId = 2;
$stmt->execute([$lietotajaId]);

// Rezultātu iegūšana
$lietotajs = $stmt->fetch(PDO::FETCH_ASSOC);

if ($lietotajs) {
    echo "Lietotāja vārds: " . htmlspecialchars($lietotajs['name']) . "<br>";
    echo "Lietotāja e-pasts: " . htmlspecialchars($lietotajs['email']) . "<br>";
} else {
    echo "Lietotājs ar ID " . htmlspecialchars($lietotajaId) . " nav atrasts.";
}
?>