sql >> Databasteknik >  >> RDS >> Mysql

Hur analyserar jag objektdata från MySQL-databasen med PHP PDO?

Problemet med dessa instruktionsvideor är deras författare som inte har någon aning om ämnet, vilket gör resultatet MYCKET MYCKET värre än om du inte skulle använda deras mentala avföring alls. Skadan de orsakar är så illa att jag till och med var tvungen att skriva en dedikerad artikel som förklarar varför alla dessa hjälplösa "omslag" är helt oanvändbara för alla verkliga tillämpningar, Din första databasomslags barnsjukdomar .

Ta detta omslag från videon till exempel:

  • Felrapporteringen är helt felaktig
  • En värdelös funktion för SELECT.
  • Statefulness
  • Skyddad PDO-instans

Så i huvudsak kommer du inte att kunna få från denna "omslag" ens en så dum sak som Insert Id. Och ingen felrapportering kan hjälpa dig ens att inse problemet.

När det gäller din kod, pruta bara inte för att spara dig själv genom att skriva ett SQL-nyckelord. Det är dumt. SQL är en dyrbar sak, avfärda den inte till förmån för några snåla genvägar. Du bör inte heller förminska PDO till ett tillstånd av en handikappad invalid, som förstör dess mest briljanta egenskaper.

Ditt omslag bör göra alla PDO- och SQL-funktioner tillgängliga istället för att kassera dem. Så det går:

class DB
{
    protected static $instance;
    protected $pdo;

    protected function __construct() {
            $opt  = array(
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                PDO::ATTR_EMULATE_PREPARES   => FALSE,
            );
            $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
            $this->pdo = new PDO($dsn, DB_USER, DB_PASS, $opt);

    }

    // a classical static method to make it universally available
    public static function instance()
    {
        if (self::$instance === null)
        {
            self::$instance = new self;
        }
        return self::$instance;
    }

    // a proxy to native PDO methods
    public function __call($method, $args)
    {
        return call_user_func_array(array($this->pdo, $method), $args);
    }

    // a helper function to run prepared statements smoothly
    public function run($sql, $args = [])
    {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}

detta omslag är tio gånger enklare och samtidigt tio gånger mer kraftfullt än det från videon.

Och nu din klass

class Schedule
{
    private $_db;

    public function __construct()
    {
        $this->_db = DB::instance();
    }

    public function listGames()
    {
        $data = $this->_db->query('SELECT * FROM games')->fetchAll();
        var_dump($data);
        echo '<br>';
    }
}

Hemligheten här är att PDO redan kan ge dig objektdata, utan en enda extra kodningsrad.

Även om detta enkla exempel inte är särskilt imponerande, är hemligheten här att detta omslag kommer att tjäna dig för alla andra exempel också, när det från videon kommer att kvävas. Försök att tänka på vilket annat exempel som helst så ska jag visa dig hur enkelt men ändå kraftfullt detta omslag är.




  1. Hur man ändrar mysql root-lösenordet

  2. MySQL:är det möjligt att group_concat flera rader?

  3. Överför datatabell till en lagrad procedur

  4. försök catch, och flera mysql infoga uttalande. Kommer den att acceptera alla eller neka alla frågor?