Start · Sprachen · PHP · Referenz · mysqli_stmt_attr_set

mysqli_stmt_attr_set

Funktion

Verändert das Verhalten einer vorbereiteten Anweisung (Prepared Statement) durch Setzen eines bestimmten Attributs.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_attr_set(mysqli_stmt $statement, int $attribute, int $value): bool

Beschreibung

mysqli_stmt_attr_set() erlaubt es, bestimmte Verhaltensweisen eines vorbereiteten Statements zu konfigurieren, nachdem es mit mysqli_prepare() erzeugt wurde. Das Attribut wird als Integer-Konstante angegeben, der zugehörige Wert legt die gewünschte Einstellung fest.

Das wichtigste unterstützte Attribut ist MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH: Wenn dieser Wert auf 1 gesetzt wird, aktualisiert MySQL den max_length-Wert in den Ergebnis-Metadaten nach dem Abrufen der Daten. Dies ist besonders nützlich, wenn man die maximale Länge der zurückgegebenen Strings kennen muss, ohne die Daten selbst zu analysieren.

Ein weiteres Attribut ist MYSQLI_STMT_ATTR_CURSOR_TYPE, das den Cursortyp für das Statement festlegt. Mögliche Werte sind MYSQLI_CURSOR_TYPE_NO_CURSOR (Standard) und MYSQLI_CURSOR_TYPE_READ_ONLY. Mit einem Read-only-Cursor werden Zeilen einzeln vom Server abgerufen, was den Speicherbedarf bei großen Ergebnismengen reduzieren kann.

Die Funktion ist in der prozeduralen Form verfügbar; die objektorientierte Entsprechung lautet $stmt->attr_set(). Sie sollte nach mysqli_prepare(), aber vor mysqli_stmt_execute() aufgerufen werden.

Parameter

Name Typ Default Beschreibung
$statement Pflicht mysqli_stmt Das Prepared-Statement-Objekt, das von mysqli_prepare() zurückgegeben wurde.
$attribute Pflicht int Die zu setzende Attribut-Konstante. Mögliche Werte: MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH, MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_STMT_ATTR_PREFETCH_ROWS.
$value Pflicht int Der Wert für das angegebene Attribut. Bei MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH: 1 (aktivieren) oder 0 (deaktivieren). Bei MYSQLI_STMT_ATTR_CURSOR_TYPE: MYSQLI_CURSOR_TYPE_NO_CURSOR oder MYSQLI_CURSOR_TYPE_READ_ONLY.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Attribut erfolgreich gesetzt wurde. Gibt false zurück, wenn das angegebene Attribut unbekannt ist oder nicht gesetzt werden konnte.

Beispiele

max_length in Metadaten mit MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH aktivieren

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');

if ($mysqli->connect_error) {
    die('Verbindungsfehler: ' . $mysqli->connect_error);
}

$stmt = $mysqli->prepare('SELECT vorname, nachname FROM benutzer');

// Aktiviert die Aktualisierung von max_length in den Ergebnis-Metadaten
mysqli_stmt_attr_set($stmt, MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH, 1);

$stmt->execute();
$stmt->store_result();

$meta = $stmt->result_metadata();
$fields = $meta->fetch_fields();

foreach ($fields as $field) {
    echo $field->name . ': max_length = ' . $field->max_length . PHP_EOL;
}

$stmt->close();
$mysqli->close();
vorname: max_length = 10 nachname: max_length = 15

Read-only-Cursor für speichereffizientes Abrufen großer Ergebnismengen

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');

if ($mysqli->connect_error) {
    die('Verbindungsfehler: ' . $mysqli->connect_error);
}

$stmt = $mysqli->prepare('SELECT id, titel FROM produkte ORDER BY id');

// Read-only-Cursor aktivieren: Zeilen werden einzeln vom Server geholt
mysqli_stmt_attr_set($stmt, MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_READ_ONLY);

$stmt->execute();

$id = null;
$titel = null;
$stmt->bind_result($id, $titel);

while ($stmt->fetch()) {
    echo "ID: $id – Titel: $titel" . PHP_EOL;
}

$stmt->close();
$mysqli->close();
ID: 1 – Titel: Produkt A ID: 2 – Titel: Produkt B ...

// Wichtig · Fallstricke

Hinweis zur Cursor-Unterstützung: MYSQLI_CURSOR_TYPE_READ_ONLY wird nicht von allen MySQL-Speicher-Engines gleich gut unterstützt. Bei der Verwendung mit InnoDB kann es in bestimmten Versionen zu unerwarteten Verhaltensweisen kommen.

Reihenfolge beachten: mysqli_stmt_attr_set() muss nach mysqli_prepare() und vor mysqli_stmt_execute() aufgerufen werden, da das Attribut den Ausführungsablauf beeinflusst.

MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH und Performance: Das Aktivieren dieses Attributs kann bei sehr großen Ergebnismengen einen geringen Mehraufwand verursachen, da die maximale Länge bei jedem Datensatz geprüft wird. In leistungskritischen Anwendungen sollte es nur bei Bedarf aktiviert werden.