И така, вие имате отговор на въпроса „Защо получавам тази грешка“, но не сте получили отговор за „краткократната PDO заявка“.
За това ще ни трябва малко нещо, наречено "програмиране".
Едно интересно нещо за програмирането е, че не се ограничаваме до съществуващите инструменти, както при другите професии. С програмирането винаги можем да създадем собствен инструмент и след това да започнем да го използваме вместо цял набор от стари инструменти.
А обектно-ориентираното програмиране е особено добро в това, тъй като можем да вземем съществуващ обект и просто да добавим малко функционалност, оставяйки останалото както е.
Например, представете си, че искаме съкратен начин за изпълнение на подготвена заявка в PDO. Всичко, от което се нуждаем, е да удължим обекта PDO с нов съкратен метод. Най-трудната част е да дадете име на новия метод.
Останалото е просто:имате нужда само от няколко реда код
class MyPDO extends PDO
{
public function run($sql, $bind = NULL)
{
$stmt = $this->prepare($sql);
$stmt->execute($bind);
return $stmt;
}
}
Това е целият код имате нужда. Можете да го съхранявате в същия файл, в който съхранявате идентификационните си данни за базата данни. Имайте предвид, че това допълнение няма да засегне съществуващия ви код по какъвто и да е начин - той остава абсолютно същият и можете да продължите да използвате цялата съществуваща функционалност на PDO както обикновено.
Сега трябва да промените само 2 букви в конструктора на PDO, като го извикате като
$conn = new MyPDO(...the rest is exactly the same...);
И веднага можете да започнете да използвате своя лъскав нов инструмент:
$sql = "SELECT * FROM myTable WHERE id = :id";
$result = $conn->run($sql, ['id' => $id])->fetchAll(PDO::FETCH_ASSOC);
Или като го оптимизирате,
$result = $conn->run("SELECT * FROM myTable WHERE id = ?", [$id])->fetchAll();
тъй като винаги можете да зададете режим на извличане по подразбиране веднъж завинаги и само за една променлива няма полза от наименования контейнер. Което прави този код истинска стенография в сравнение с приетия отговор,
$stmt_test = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$stmt_test->execute([$id]);
$result = $stmt_test->fetchAll(PDO::FETCH_ASSOC);
и дори на най-добрия отговор, който сте получили досега,
$result = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$result->execute([$id]);
да не говорим, че последният не винаги е използваем, тъй като е подходящ само за получаване на масив. Докато с истински съкратено е възможен всеки формат на резултата:
$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