Avatar billede slein55 Mester
05. oktober 2023 - 15:48 Der er 17 kommentarer

php checke om data er slettet i SQL

jeg sletter data med følgende
$sql = "DELETE FROM bro WHERE email='$email' and token = '$token'";
er der en måde man kan checke om data er slettet korekt
eller skal man læse databasen først og checke om de findes?
Avatar billede arne_v Ekspert
05. oktober 2023 - 16:16 #1
Du kan godt tillade dig at antage at databasen fungerer korrekt således at hvis der er rækker som matcher kriterierne så bliver de slettet.

Hvorvidt der var rækker som matchede kriterierne bør du kunne finde ud af ved at checke om antal påvirkede rækker er større end 0. INSERT, UPDATE og DELETE returnerer antal påvirkede rækker.
Avatar billede arne_v Ekspert
05. oktober 2023 - 16:19 #2
Hvordan du finder antal påvirkede rækker afhænger af det brugte API.

Eksempler:

https://www.php.net/manual/en/mysqli-stmt.affected-rows.php

https://www.php.net/manual/en/pdo.exec.php
Avatar billede slein55 Mester
06. oktober 2023 - 14:48 #3
jeg fandt ud af det jeg læser databasen og ser om data findes før jeg sletter dem
Avatar billede arne_v Ekspert
06. oktober 2023 - 15:05 #4
Det kan du også. Bare vær opmærksom på risikoen for samtidigheds problemer:
- du checker at ser at der er N rækker
- en anden process sletter de N rækker
- du sletter men sletter 0 rækker fordi de ikke er der længere
Avatar billede slein55 Mester
06. oktober 2023 - 15:28 #5
jeg skal kun slette en, der kan kun oprettes en med hver mail og der slettes på mail og token sendt fra en email som bekræftelse
Avatar billede arne_v Ekspert
06. oktober 2023 - 15:40 #6
Men det kunne også laves som (pseudo kode):

execute SQL DELETE ...
if deleted rows = 1 {
    email user "OK"
} else if deleted rows = 0 {
  email admin "look like a hacker is trying to delete users"
}
Avatar billede slein55 Mester
06. oktober 2023 - 15:43 #7
den vil jeg prøve og se om den dur ved mig
Avatar billede arne_v Ekspert
06. oktober 2023 - 15:57 #8
Når man arbejder med databaser er det godt altid at overveje concurrency problemer.

Hvad nu hvis en anden process opdaterer databasen samtidg med at jeg opdaterer? Kan jeg redesigne så jeg kun udfører en SQL sætning? Hvis jeg bruger flere SQL sætninger skal jeg bruge en transaktion?
Avatar billede slein55 Mester
06. oktober 2023 - 17:54 #10
så vidt jeg kan se bruges der ikke PHP i de eksempler
jeg mangler noget der kan fortælle om en record er slettet hvis ikke melde fejl
ud fra denne:
$sql = "DELETE FROM database WHERE email='$email' and token = '$token'";

if slettet then ok
else ikke ok
Avatar billede arne_v Ekspert
06. oktober 2023 - 18:56 #11
Jeg havde et par referencer i #2.

Hvis du bruger mysqli så er der en funktion du kan kalde efter at have udført query for at få antal slettede rækker.

Hvis du bruger PDO vil eksekvering returnere antal rækker som reur værdi.
Avatar billede slein55 Mester
07. oktober 2023 - 17:39 #12
jeg har prøvet denne:
$sql = "DELETE FROM database WHERE email='$email' and token = '$token'";
if ($conn->query($sql) === TRUE) {
    $conn->close();
    $msg = "data slettet!";
}
men den siger "data slettet" bare email er ok selvom token ikke er ok, men den sletter kun data hvis begge er ok
Avatar billede arne_v Ekspert
07. oktober 2023 - 18:36 #13
Prøv:

$sql = "DELETE FROM database WHERE email='$email' and token = '$token'";
if ($conn->query($sql) === TRUE) {
    if($conn->affected_rows == 1) {
        $msg = "data slettet!";
    } else {
        $msg = "hmmmm!";
    }
    $conn->close();
}
Avatar billede arne_v Ekspert
07. oktober 2023 - 18:36 #14
Skulle der iøvrigt ikke bruges prepare når der er værdier i den DELETE??
Avatar billede slein55 Mester
08. oktober 2023 - 09:50 #15
?? ved ikke hvad det er
Avatar billede arne_v Ekspert
08. oktober 2023 - 14:21 #16
Fik du $conn->affected_rows  til at virke?
Avatar billede arne_v Ekspert
08. oktober 2023 - 14:24 #17
Prepare er:

$sql = "DELETE FROM database WHERE email='$email' and token = '$token'";
$conn->query($sql);

->

$sql = "DELETE FROM database WHERE email = ? and token = ?;
$stmt = $conn->prepare($sql);
$stmt->bind_param('ss', $email, $token);
$stmt->execute();
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester