Sobes.tech
Junior

Ի՞նչ են պատրաստված հարցումները:

sobes.tech AI

Պատասխան AI-ից

Սա անվտանգության և արտադրողականության բարձրացման միջոց է տվյալների բազաների հետ աշխատելիս, երբ SQL հարցման ձևանմուշը առանձին է տվյալների սերվերից:

Առավելություններ:

  • Անվտանգություն SQL ինյեկցիաներից: Տվյալները մշակվում են տվյալների բազայի սերվերով որպես լիտերալներ, ոչ թե որպես SQL կոդի մաս:
  • Արդյունավետություն: Տվյալների բազայի սերվերը պահում է հարցման կատարման պլանը, ինչը խնայում է ժամանակը նույն հարցման բազմակի կատարման ժամանակ:
  • Հարմարավետություն: Օգնում է կոդը կառուցել և հեշտացնել սխալների հայտնաբերում:

Պատրաստված հարցման կատարման փուլերը:

  1. Պատրաստում (Prepare): Հարցման ձևանմուշը ուղարկվում է տվյալների բազայի սերվերին վերլուծության, սինտաքսի ստուգման և կատարման պլանի կառուցման համար: Դրանում օգտագործվում են փոխարինող նշաններ տվյալների տեղադրելու համար:
  2. Կապում (Bind): Փոփոխականների արժեքները կապվում են փոխարինող նշաններին: Սերվերը դրանք որպես SQL կոդ չեն մեկնաբանում:
  3. Կատարման (Execute): Հարցումը կատարվում է կապակցված արժեքներով:

Օրինակ՝ պատրաստված հարցման օգտագործում PHP-ով PDO-ի հետ:

// Տվյալների բազայի կապ (օրինակ)
$dsn = 'mysql:host=localhost;dbname=mydatabase';
$օգտատեր = 'myuser';
$գաղտնաբառ = 'mypassword';

try {
    $pdo = new PDO($dsn, $օգտատեր, $գաղտնաբառ);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Կապի սխալ: ' . $e->getMessage());
}

// Հարցման պատրաստում փոխարինողներով
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE id = :id");

// Արժեքի կապում փոխարինողի հետ
$օգտագործողId = 1;
$stmt->bindParam(':id', $օգտագործողId, PDO::PARAM_INT);

// Հարցման կատարում
$stmt->execute();

// Նվագների ստացում
$օգտագործող = $stmt->fetch(PDO::FETCH_ASSOC);

if ($օգտագործող) {
    echo "Օգտագործողի անունը: " . htmlspecialchars($օգտագործող['name']) . "<br>";
    echo "Օգտագործողի էլ.փոստը: " . htmlspecialchars($օգտագործող['email']) . "<br>";
} else {
    echo "Օգտագործող ID-ով " . htmlspecialchars($օգտագործողId) . " չի գտնվել.";
}

Այս օրինակով :id նշանավոր փոխարինողն է: Կարող են օգտագործվել նաև դիրքային փոխարինողներ (?).

// Պատրաստված հարցում դիրքային փոխարինողով
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE id = ?");

// Կատարման ժամանակ փոխանցվող արժեքների զանգված
$օգտագործողId = 2;
$stmt->execute([$օգտագործողId]);

// Նվագների ստացում
$օգտագործող = $stmt->fetch(PDO::FETCH_ASSOC);

if ($օգտագործող) {
    echo "Օգտագործողի անունը: " . htmlspecialchars($օգտագործող['name']) . "<br>";
    echo "Օգտագործողի էլ.փոստը: " . htmlspecialchars($օգտագործող['email']) . "<br>";
} else {
    echo "Օգտագործող ID-ով " . htmlspecialchars($օգտագործողId) . " չի գտնվել.";
}
?>