Bei Verwendung von PDO für Datenbankoperationen ist pdostatement :: fetchObject eine sehr bequeme Methode, mit der die Abfrage direkt zu einem Objekt zugeordnet werden kann. Aber manchmal begegnen wir Mismatch -Probleme vom Typ, wie das Feld, das ursprünglich eine Ganzzahl ( int ) in der Datenbank war, in eine Zeichenfolge ( Zeichenfolge ) konvertiert. Diese Situation ist besonders problematisch, wenn es um große Datenmengen geht oder strenge Art von Datenstrukturen erforderlich ist.
Schauen wir uns die Gründe und Lösungen an.
Pdostatement :: fetchObject selbst schließt nicht automatisch den Typ von PHP basierend auf dem Typ des Datenbankfelds. Es füllt einfach die Daten in die Objekteigenschaften, so oft werden Zahlen als Zeichenfolgen verarbeitet. Dies liegt daran, dass PDO standardmäßig alle Daten als Zeichenfolge zurückgibt.
Schauen wir uns ein Beispiel an:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name FROM users');
$user = $stmt->fetchObject();
var_dump($user);
?>
Die Ausgabe kann sein:
object(stdClass)#1 (2) {
["id"]=>
string(1) "1"
["name"]=>
string(4) "John"
}
Wie Sie sehen können, ist das Ergebnis auch dann eine Zeichenfolge in PHP.
Es gibt mehrere gemeinsame Methoden, um dieses Problem zu lösen:
PDO verfügt über eine Einstellung namens PDO :: attr_stringify_fetches , die steuern kann, ob die Zahlen automatisch in Zeichenfolgen umwandelt werden. Es ist jedoch zu beachten, dass diese Option nur in den Funktionen Fetch () wirksam sein kann und keinen direkten Einfluss auf das FetchObject hat, sodass sie nicht empfohlen wird.
Die praktischste Methode besteht darin, eine Klasse zu definieren und die Typ -Konvertierung im Konstruktor oder in der magischen Methode __set manuell durchzuführen.
Zum Beispiel:
<?php
class User {
public int $id;
public string $name;
public function __construct() {
// Typ -Zwang kann hier durchgeführt werden
}
public function __set($name, $value) {
if ($name === 'id') {
$this->id = (int) $value;
} elseif ($name === 'name') {
$this->name = (string) $value;
}
}
}
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name FROM users');
$user = $stmt->fetchObject(User::class);
var_dump($user);
?>
Wenn Sie Daten aus der Datenbank abrufen, können Sie sicherstellen, dass der Typ korrekt ist.
Erzwingen Sie in SQL -Anweisungen die Felder direkt zum erforderlichen Typ, z. B.:
SELECT id + 0 AS id, name FROM users
Auf diese Weise ist die ID bereits eine Ganzzahl, wenn die Datenbank zurückgibt. Diese Methode ist jedoch nicht besonders elegant und hat eine schlechte Wartung, sodass sie nur für eine vorübergehende Notfallrettung geeignet ist.
Wenn es in Ihrem Projekt viele Orte gibt, an denen Objektzuordnung erforderlich ist, sollten Sie ein allgemeines Mapper -Tool schreiben. Zum Beispiel:
<?php
function mapUser($data) {
$user = new User();
$user->id = (int) $data->id;
$user->name = (string) $data->name;
return $user;
}
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name FROM users');
$rawUser = $stmt->fetchObject();
$user = mapUser($rawUser);
var_dump($user);
?>
Diese Methode ist kontrollierbar und ist einfach zu verwalten und zu erweitern, z. B. das Hinzufügen von Überprüfungslogik in der späteren Phase.
Der Datentabellenfeldtyp ist vernünftigerweise gestaltet : Versuchen Sie, die Felder in der Datenbanktabelle so weit wie möglich zu löschen. Zum Beispiel muss die ID int sein und der Betrag muss dezimal sein. Verwenden Sie keine Zeichenfolgen anstelle von numerischen Feldern.
Mit starken Typdeklarationen : In PHP 7.4+ kann die Verwendung von Typen und Attributtypdeklarationen Fehler früher erkennen.
Einheitliche Datenzugriffsschicht (DAL) Kapselung : Wenn das Projekt groß ist, ist es am besten, den Datenbankzugriff und die Objektzuordnung in einheitliche Module zu verkapulieren, um wiederholte Arbeitskräfte zu vermeiden.
Es ist sehr bequem, FetchObject zu verwenden. Um jedoch den richtigen Datentyp zu gewährleisten, wird normalerweise empfohlen, die Klasse selbst zu definieren, mit manueller Konvertierung zusammenzuarbeiten oder Zuordnungsfunktionen zu verwenden. Dies kann den Code robuster machen und die Mühe des anschließenden Debuggens verringern.
Wenn Sie detailliertere PDO-Verwendung und Objektzuordnung wissen möchten, können Sie sich unter: https://gitbox.net/docs/pdo-tutorial beziehen.
Verwandte Tags:
PDOStatement