したがって、「なぜこのエラーが発生するのか」という質問に対する回答はありますが、「短縮PDOクエリ」に対する回答は得られませんでした。
このためには、「プログラミング」と呼ばれるものが少し必要になります。
プログラミングの興味深い点の1つは、他の職業のように、既存のツールに限定されないことです。プログラミングを使用すると、いつでも独自のツールを作成して、古いツールのセット全体の代わりにそれを使い始めることができます。
また、オブジェクト指向プログラミングは、既存のオブジェクトを取得して一部の機能を追加するだけで、残りはそのままにしておくことができるため、特に優れています。
たとえば、PDOで準備されたクエリを実行する簡単な方法が必要だとします。必要なのは拡張することだけです 新しい短縮メソッドを使用したPDOオブジェクト。最も難しいのは、新しいメソッドに名前を付けることです。
残りは簡単です。必要なコードは数行だけです
class MyPDO extends PDO
{
public function run($sql, $bind = NULL)
{
$stmt = $this->prepare($sql);
$stmt->execute($bind);
return $stmt;
}
}
これはすべてのコードです あなたが必要です。データベースのクレデンシャルを保存するのと同じファイルに保存できます。この追加は既存のコードには影響しませんことに注意してください いずれにせよ、それはまったく同じままであり、既存のすべてのPDO機能を通常どおり使用し続けることができます。
これで、PDOコンストラクターで2文字だけ変更する必要があり、それを
と呼びます。$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();
いつでもデフォルトのフェッチモードを一度だけ設定でき、1つの変数だけでは、指定されたプレースホルダーは使用されません。これにより、このコードは実際の省略形になります。 受け入れられた答えと比較して、
$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