sql >> Databasteknik >  >> RDS >> Mysql

förkortad PDO-fråga

Så du har ett svar på frågan "Varför jag får det här felet", men fick inget för "shorthand PDO-frågan".

För detta kommer vi att behöva lite av en sak som heter "programmering".

En intressant sak med programmering är att vi inte är begränsade till de befintliga verktygen, som med andra yrken. Med programmering kan vi alltid skapa ett eget verktyg och sedan börja använda det istället för en hel uppsättning gamla verktyg.

Och objektorienterad programmering är särskilt bra på det, eftersom vi kan ta ett befintligt objekt och bara lägga till lite funktionalitet och lämna resten som den är.

Föreställ dig till exempel att vi vill ha ett stenografisk sätt att köra en förberedd fråga i PDO. Allt vi behöver är att förlänga SUB-objektet med en ny stenografimetod. Det svåraste är att ge den nya metoden ett namn.

Resten är enkelt:du behöver bara några rader kod

class MyPDO extends PDO
{
    public function run($sql, $bind = NULL)
    {
        $stmt = $this->prepare($sql);
        $stmt->execute($bind);
        return $stmt;
    }
}

Det här är all koden du behöver. Du kan lagra den i samma fil där du lagrar dina databasuppgifter. Observera att detta tillägg inte kommer att påverka din befintliga kod på något sätt - det förblir exakt detsamma och du kan fortsätta använda alla befintliga PDO-funktioner som vanligt.

Nu måste du bara ändra 2 bokstäver i PDO-konstruktorn, kalla det som

$conn = new MyPDO(...the rest is exactly the same...);

Och omedelbart kan du börja använda ditt skinande nya verktyg:

$sql = "SELECT * FROM myTable WHERE id = :id";
$result = $conn->run($sql, ['id' => $id])->fetchAll(PDO::FETCH_ASSOC);

Eller ge det lite optimering,

$result = $conn->run("SELECT * FROM myTable WHERE id = ?", [$id])->fetchAll();

eftersom du alltid kan ställa in standard hämtningsläge en gång för alla, och för bara en enda variabel finns det ingen användning för den namngivna platshållaren. Vilket gör den här koden till en riktig shorthand jämfört med det accepterade svaret,

$stmt_test = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$stmt_test->execute([$id]);
$result = $stmt_test->fetchAll(PDO::FETCH_ASSOC);

och till och med det bästa svaret du har fått hittills,

$result = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$result->execute([$id]);

för att inte tala om att den senare inte alltid är användbar, eftersom den bara passar för att få en array. Medan med en riktig stenografi vilket resultatformat som helst är möjligt:

$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


  1. Hur lagrar man bäst datum/tid i MySql?

  2. PostgreSQL:Ändra OWNER på alla tabeller samtidigt i PostgreSQL

  3. kommaseparerat argument för IN-operator, MySQL

  4. MySQL ger alla privilegier till databasen utom en tabell