Mysql
 sql >> Database >  >> RDS >> Mysql

abbreviazione di query PDO

Quindi hai una risposta alla domanda "Perché ricevo questo errore", ma non ne hai una per la "query PDO abbreviata".

Per questo avremo bisogno di una cosa chiamata "programmazione".

Una cosa interessante della programmazione è che non ci limitiamo agli strumenti esistenti, come con altre professioni. Con la programmazione possiamo sempre creare un nostro strumento e quindi iniziare a usarlo al posto di un intero set di vecchi strumenti.

E la programmazione orientata agli oggetti è particolarmente efficace, poiché possiamo prendere un oggetto esistente e aggiungere semplicemente alcune funzionalità, lasciando il resto così com'è.

Ad esempio, immagina di volere un modo abbreviato per eseguire una query preparata in PDO. Tutto ciò di cui abbiamo bisogno è estendere l'oggetto PDO con un nuovo metodo abbreviato. La parte più difficile è dare un nome al nuovo metodo.

Il resto è semplice:bastano poche righe di codice

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

Questo è tutto il codice hai bisogno. Puoi memorizzarlo nello stesso file in cui memorizzi le credenziali del database. Tieni presente che questa aggiunta non influirà sul tuo codice esistente in ogni caso - rimane esattamente lo stesso e puoi continuare a utilizzare tutte le funzionalità PDO esistenti come al solito.

Ora devi cambiare solo 2 lettere nel costruttore PDO, chiamandolo come

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

E immediatamente puoi iniziare a utilizzare il tuo nuovo brillante strumento:

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

Oppure, dandogli un po' di ottimizzazione,

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

poiché puoi sempre impostare la modalità di recupero predefinita una volta per tutte e solo per una singola variabile non è possibile utilizzare il segnaposto denominato. Il che rende questo codice una vera abbreviazione rispetto alla risposta accettata,

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

e anche alla migliore risposta che hai ottenuto finora,

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

per non parlare del fatto che quest'ultimo non è sempre utilizzabile, in quanto si adatta solo per ottenere un array. Mentre con un reale abbreviazione è possibile qualsiasi formato di risultato:

$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