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.
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_result
und 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 1
wenn 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.
Lass mich ein paar Worte sagen