Es kann nicht mehr als eine STMT-Abfrage für mysqli verwendet werden

Adel Azeroth:

Ich versuche, eine Benutzererstellungsseite zu generieren, und überprüfe, ob der Benutzer bereits vorhanden ist. Dazu verwende ich den nächsten Code:

hier füge ich den Benutzer und sein Passwort in die Tabelle USERS ein

mysqli_stmt_bind_param($guardar_usuario, 'ss', $usuario,$encriptar);
mysqli_stmt_execute($guardar_usuario);

hier verwende ich die Variable $ user wieder, um die neu erstellte ID des Benutzers wiederherzustellen

$consulta = "SELECT id_usuario FROM usuario WHERE usuario = '$usuario' ORDER BY fecha_registro DESC LIMIT 1";
$ultimo_registro = mysqli_prepare($connect,$consulta);
mysqli_stmt_execute($ultimo_registro);
mysqli_stmt_bind_result($ultimo_registro, $id_usuario_creado);
mysqli_stmt_fetch($ultimo_registro);

Ich füge die zusätzlichen Daten in eine Tabelle namens PERSONAS ein

$guardar_persona = mysqli_prepare($connect, "INSERT INTO persona (id_usuario, nombre, email) VALUES (?, ?, ?)");        
mysqli_stmt_bind_param($guardar_persona, 'iss',  $ultimo_registro, $nombre_usuario, $email_usuario);            
mysqli_stmt_execute($guardar_persona);

Mein Problem ist, dass die zweite Abfrage, das Einfügen von Daten in die Tabelle PERSONAS, nicht funktioniert. Wenn ich jedoch die erste Abfrage entferne, die das Einfügen in die Tabelle USERS ermöglicht, funktioniert diese Abfrage einwandfrei, sodass ich nicht weiß, ob es eine Regel gibt um diese Arbeit zu machen?

Es tut uns leid, wenn es sich um eine ziemlich neue Frage handelt. Ich habe gerade angefangen, auf diese Weise zu arbeiten, um zu versuchen, so viele Daten wie möglich zu verhindern.

Dharman:

Bei der Ausführung vorbereiteter Anweisungen verwendet mysqli standardmäßig ungepufferte Abfragen. Dies ist ein sehr verwirrendes Verhalten, aber es bedeutet, dass die Ergebnisse nicht automatisch an PHP gesendet werden. Der MySQL-Server speichert die Ergebnisse auf dem Server und wartet darauf, dass PHP sie abruft. Solange noch weitere Ergebnisse abgerufen werden müssen, können Sie keine weitere Abfrage ausführen.

Um dies zu beheben, müssen Sie anrufen mysqli_stmt_store_result()oder alle Ergebnisse erhalten.

In Ihrem Fall wäre die einfache Option, sie hinzuzufügen store_resultund damit fertig zu werden.

$consulta = "SELECT id_usuario FROM usuario WHERE usuario = ? ORDER BY fecha_registro DESC LIMIT 1";
$ultimo_registro = mysqli_prepare($connect,$consulta);
mysqli_stmt_bind_param($ultimo_registro, 's', $usuario);
mysqli_stmt_execute($ultimo_registro);
mysqli_stmt_store_result($ultimo_registro);
mysqli_stmt_bind_result($ultimo_registro, $id_usuario_creado);
mysqli_stmt_fetch($ultimo_registro);

Es wäre jedoch viel einfacher für Sie, wenn Sie die mysqli-Funktionen nicht mehr direkt verwenden würden. Sogar eine einfache Wrapper-Funktion kann Ihnen helfen, all dieses MySQL-Chaos zu vermeiden.

function safeQuery(mysqli $db, string $sql, array $params = []): ?array {
    $stmt = $db->prepare($sql);
    if ($params) {
        $stmt->bind_param(str_repeat("s", count($params)), ...$params);
    }
    $stmt->execute();
    if ($result = $stmt->get_result()) {
        return $result->fetch_all(MYSQLI_BOTH);
    }
    return null;
}

Dann können Sie Ihre gesamte vorbereitete Anweisung in nur eine Codezeile abstrahieren:

$consulta = "SELECT id_usuario FROM usuario WHERE usuario = ? ORDER BY fecha_registro DESC LIMIT 1";
$result = safeQuery($connect, $consulta, [$usuario]);
if ($result) {
    $id_usuario_creado = $result[0]['id_usuario'];
}

Sie können sogar eine zweite Funktion schreiben, die nur einen einzigen Wert aus der vorbereiteten Anweisung abruft.

function fetchSingle(mysqli $db, string $sql, array $params = []) {
    $stmt = $db->prepare($sql);
    if ($params) {
        $stmt->bind_param(str_repeat("s", count($params)), ...$params);
    }
    $stmt->execute();
    if ($result = $stmt->get_result()) {
        return $result->fetch_row()[0];
    }
    return null;
}

Dies kann verwendet werden, LIMIT 1wenn Sie nur einen einzelnen Wert abrufen möchten.

$consulta = "SELECT id_usuario FROM usuario WHERE usuario = ? ORDER BY fecha_registro DESC LIMIT 1";
$id_usuario_creado = fetchSingle($connect, $consulta, [$usuario]);

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Es kann nicht mehr als eine Prozessorgruppe für meine Threads in einer C # -App verwendet werden

Es kann nicht mehr als ein Clustered-Index für eine Tabelle erstellt werden

Braintree IOS + Rails-Fehler 91564 Eine Zahlungsmethode kann nicht mehr als einmal verwendet werden

Es kann nicht mehr als ein Dienst in einer Komponente verwendet werden

Abfrage für Datenbank kann nicht mehr ausgeführt werden

Warum kann die Konstantenzeigerdifferenz nicht als Initialisierer für eine statische Variable verwendet werden?

Eine Klasse von Nestklassen kann nicht als Typname für Vorlagenfunktionen verwendet werden

Eine veränderbare Variable kann nicht als Argument für die Sicherheitsfunktion verwendet werden

Wie kann eine Schnittstelle für mehr als zwei Hintergrund-Android-Aufgaben innerhalb einer Aktivität verwendet werden?

Es kann nicht mehr als eine Zeichenfolge zu einer Liste hinzugefügt werden

Es kann nicht mehr als 1 Zeichen in die Eingabe für FormArray in einem FormArray für reaktive Formulare eingegeben werden

Mit Python kann nicht mehr als eine Klasseninstanz erstellt werden

Es kann nicht mehr als 30 Tage abgefragt werden

'Fetchall ()' kann mit mysql.connector in Python nicht für eine MySQL-Abfrage mit mehreren Anweisungen verwendet werden

Eine Annotation kann nicht als Annotationsargument verwendet werden

Eine for-Schleife kann nicht als Listenverständnis verwendet werden

Warum kann basename nicht für eine Variable verwendet werden?

Aggregat kann nicht für eine Liste <T> verwendet werden

R, das RSQLite, DBI und dbplyr verwendet, kann nicht mehr als eine Tabelle in RSQLite haben, um eine Verknüpfung herzustellen

Es kann nicht mehr als eine Taste oder eine bereits gedrückte Taste Selen gedrückt werden

Kann * in Sym-Token für mehr als ein Zeichen verwendet werden?

Kann mehr als ein Argument für __getitem__ verwendet werden?

Kann Upstart Expect / Respawn für Prozesse verwendet werden, die mehr als zweimal verzweigt sind?

Kann mehr als ein SCSS für ein SPFx-Webpart verwendet werden?

Kann ein Delim mehr als einmal für Strtok in C verwendet werden?

Scala - Eine Methode, die play.api.mvc.Result als Handler für Anforderungen zurückgibt, kann nicht verwendet werden

Warum kann in C eine const-Variable nicht als Initialisierer für die Arraygröße verwendet werden?

make_index_sequence kann nicht als Standardargument für eine Funktion verwendet werden (Instanziierung einer undefinierten Vorlage)

BundleReleaseAar kann in MavenPublication nicht mehr verwendet werden