Váš počáteční problém je, že jste nekontrolovali každé volání po neúspěchu, jen těch pár na začátku. Oba store_result a bind_result může také selhat.
Váš konkrétní problém (až opravíte ten původní) je ten, že děláte select * získat více sloupce, ale svážete pouze jeden ve výsledku. To je zřejmé z chybové zprávy, kterou dostanete z bind_result zavolejte:
Pokud změníte select příkaz na něco jako select id from ... , zjistíte, že to začíná fungovat.
Nicméně za předpokladu, že chcete více sloupců, měli byste ve vazbě zadat více proměnných, něco jako:
$stmt = $db->prepare("SELECT col1, col2 FROM messages WHERE post_id = ?");
:
$ex = $stmt->bind_result($param1, $param2);
Všimnete si, že nepoužívám select * tam nahoře je lepší používat explicitní pojmenování sloupců téměř ve všech situacích, takže:
- nebudete překvapeni, když se schéma DB změní;
- získáte pouze data, která potřebujete;
- můžete správně mapovat sloupce na výsledné proměnné.
V podstatě jediné místo, kde jsem kdy zjistil, že je v pořádku použít select * je v nástrojích pro analýzu DB, kde chcete získat vše. Pokud víte, co chcete předem, měli byste o to požádat.