Så du har fået et svar på spørgsmålet "Hvorfor får jeg denne fejl", men fik ikke et til "shorthand PDO-forespørgslen".
Til dette skal vi bruge lidt af en ting, der hedder "programmering".
En interessant ting ved programmering er, at vi ikke er begrænset til de eksisterende værktøjer, som med andre erhverv. Med programmering kan vi altid skabe vores eget værktøj og derefter begynde at bruge det i stedet for et helt sæt gamle værktøjer.
Og objektorienteret programmering er især god til det, da vi kan tage et eksisterende objekt og bare tilføje noget funktionalitet, og lade resten være som det er.
Forestil dig for eksempel, at vi ønsker en stenografisk måde at køre en forberedt forespørgsel på i PDO. Alt, hvad vi behøver, er at forlænge PDO-objektet med en ny stenografimetode. Det sværeste er at give den nye metode et navn.
Resten er enkelt:du behøver kun få linjer kode
class MyPDO extends PDO
{
public function run($sql, $bind = NULL)
{
$stmt = $this->prepare($sql);
$stmt->execute($bind);
return $stmt;
}
}
Dette er hele koden du mangler. Du kan gemme det i den samme fil, hvor du gemmer dine databaselegitimationsoplysninger. Bemærk, at denne tilføjelse ikke påvirker din eksisterende kode på nogen måde - det forbliver nøjagtigt det samme, og du kan fortsætte med at bruge al den eksisterende PDO-funktionalitet som normalt.
Nu skal du kun ændre 2 bogstaver i PDO-konstruktøren, kalde det som
$conn = new MyPDO(...the rest is exactly the same...);
Og straks kan du begynde at bruge dit skinnende nye værktøj:
$sql = "SELECT * FROM myTable WHERE id = :id";
$result = $conn->run($sql, ['id' => $id])->fetchAll(PDO::FETCH_ASSOC);
Eller giver det en smule optimering,
$result = $conn->run("SELECT * FROM myTable WHERE id = ?", [$id])->fetchAll();
da du altid kan indstille standard hentetilstand én gang for alle, og for kun en enkelt variabel er der ingen brug for den navngivne pladsholder. Hvilket gør denne kode til en rigtig shorthand sammenlignet med det accepterede svar,
$stmt_test = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$stmt_test->execute([$id]);
$result = $stmt_test->fetchAll(PDO::FETCH_ASSOC);
og endda til det bedste svar, du har fået indtil videre,
$result = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$result->execute([$id]);
for ikke at nævne, at sidstnævnte ikke altid er brugbart, da det kun passer til at få et array. Mens med en rigtig stenografi ethvert resultatformat er muligt:
$result = $conn->run($sql, [$id])->fetchAll(); // array
$result = $conn->run($sql, [$id])->fetch(); // single row
$result = $conn->run($sql, [$id])->fetchColumn(); // single value
$result = $conn->run($sql, [$id])->fetchAll(PDO::FETCH_*); // dozens of different formats