Wie überprüfe ich, ob eine Zeile in MySQL vorhanden ist? (dh überprüfen Sie, ob Benutzername oder E-Mail in MySQL vorhanden sind)

Lesezeit: 10 Minuten

Wie uberprufe ich ob eine Zeile in MySQL vorhanden ist
Benutzer2882684

Ich brauche Hilfe bei der Überprüfung, ob eine Zeile in der Datenbank vorhanden ist. In meinem Fall enthält diese Zeile eine E-Mail-Adresse. Ich bekomme das Ergebnis:

email no longer exists publisher@example.com

Dies ist der Code, den ich derzeit verwende:

if (count($_POST)) {
    $email = $dbl->real_escape_string(trim(strip_tags($_POST['email'])));

    $query = "SELECT `email` FROM `tblUser` WHERE `email` = '$email'";
    $result = mysqli_query($dbl, $query);
    if (is_resource($result) && mysqli_num_rows($result) == 1) {
        $row = mysqli_fetch_assoc($result);
        echo $email . " email exists " .  $row["email"] . "\n";
    } else {
        echo "email no longer exists" . $email . "\n";
    }
}

Gibt es eine bessere Möglichkeit zu prüfen, ob eine Zeile in der MySQL-Datenbank vorhanden ist (in meinem Fall prüfen, ob eine E-Mail in MySQL vorhanden ist)?

  • $query ist eine Zeichenfolge, daher wird is_resource($query) immer fehlschlagen … Sie führen die Abfrage nicht aus.

    – Digitaler Chris

    7. März 2014 um 14:37 Uhr

  • Lesen Sie weiter is_resource()

    – Funk Forty-Niner

    7. März 2014 um 14:54 Uhr

  • Mögliches Duplikat von Best way to test if a row exist in a MySQL table

    – T. Todua

    15. August 2016 um 18:34 Uhr

  • noch nie Daten direkt in einer Abfrage verketten … es entstehen mehrdeutige Abfragen, die zu Fehlern und Sicherheitsproblemen führen können. Verwenden Sie vorbereitete/parametrisierte Abfragen, um dieses Problem vollständig zu vermeiden. Zumindest muss eine ordnungsgemäße Flucht verwendet werden.

    – Brad

    14. Juli 2017 um 18:34 Uhr

Wie uberprufe ich ob eine Zeile in MySQL vorhanden ist
Funk Forty-Niner

Im Folgenden finden Sie erprobte und bewährte Methoden, um zu überprüfen, ob eine Zeile vorhanden ist.

(Einige davon verwende ich selbst oder habe ich in der Vergangenheit verwendet).

Bearbeiten: Ich habe einen früheren Fehler in meiner Syntax gemacht, wo ich verwendet habe mysqli_query() zweimal. Bitte konsultieren Sie die Revision(en).

Dh:

if (!mysqli_query($con,$query)) das hätte sich einfach so lauten sollen if (!$query).

  • Ich entschuldige mich dafür, dass ich diesen Fehler übersehen habe.

Randnotiz: Beide '".$var."' und '$var' mach das selbe. Sie können beide verwenden, beide sind gültige Syntax.

Hier sind die beiden bearbeiteten Abfragen:

$query = mysqli_query($con, "SELECT * FROM emails WHERE email="".$email.""");

    if (!$query)
    {
        die('Error: ' . mysqli_error($con));
    }

if(mysqli_num_rows($query) > 0){

    echo "email already exists";

}else{

    // do something

}

und in deinem Fall:

$query = mysqli_query($dbl, "SELECT * FROM `tblUser` WHERE email="".$email.""");

    if (!$query)
    {
        die('Error: ' . mysqli_error($dbl));
    }

if(mysqli_num_rows($query) > 0){

    echo "email already exists";

}else{

    // do something

}

Sie können auch verwenden mysqli_ mit einer vorbereiteten Erklärung Methode:

$query = "SELECT `email` FROM `tblUser` WHERE email=?";

if ($stmt = $dbl->prepare($query)){

        $stmt->bind_param("s", $email);

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

            $email_check= "";         
            $stmt->bind_result($email_check);
            $stmt->fetch();

            if ($stmt->num_rows == 1){

            echo "That Email already exists.";
            exit;

            }
        }
    }

Oder eine PDO-Methode mit einer vorbereiteten Erklärung:

<?php
$email = $_POST['email'];

$mysql_hostname="xxx";
$mysql_username="xxx";
$mysql_password = 'xxx';
$mysql_dbname="xxx";

try {
$conn= new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password); 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
     exit( $e->getMessage() );
}

// assuming a named submit button
if(isset($_POST['submit']))
    {

        try {
            $stmt = $conn->prepare('SELECT `email` FROM `tblUser` WHERE email = ?');
            $stmt->bindParam(1, $_POST['email']); 
            $stmt->execute();
            while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

            }
        }
        catch(PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
        }

    if($stmt->rowCount() > 0){
        echo "The record exists!";
    } else {
        echo "The record is non-existant.";
    }


    }
?>
  • Vorbereitete Anweisungen eignen sich am besten zum Schutz vor einer SQL-Injection.

Hinweis:

Stellen Sie beim Umgang mit Formularen und POST-Arrays wie oben verwendet/umrissen sicher, dass die POST-Arrays Werte enthalten, dass eine POST-Methode für das Formular verwendet wird und übereinstimmende benannte Attribute für die Eingaben.

  • FYI: Formulare verwenden standardmäßig eine GET-Methode, wenn sie nicht ausdrücklich angewiesen werden.

Notiz: <input type = "text" name = "var">$_POST['var'] passen. $_POST['Var'] keine Übereinstimmung.

  • Bei POST-Arrays wird zwischen Groß- und Kleinschreibung unterschieden.

Konsultieren:

Fehler beim Überprüfen der Referenzen:

Bitte beachten Sie, dass sich MySQL-APIs nicht mischen, falls Sie diese Fragen und Antworten besuchen und verwenden mysql_ sich mit (und Abfragen) zu verbinden.

  • Sie müssen vom Verbinden bis zum Abfragen denselben verwenden.

Konsultieren Sie dazu Folgendes:

  • Kann ich MySQL-APIs in PHP mischen?

Wenn Sie die verwenden mysql_ API und haben keine andere Wahl, damit zu arbeiten, dann konsultieren Sie die folgenden Fragen und Antworten zu Stack:

  • MySql php: prüfen, ob Row existiert

Die mysql_* Funktionen sind veraltet und werden aus zukünftigen PHP-Releases entfernt.

  • Es ist an der Zeit, ins 21. Jahrhundert aufzubrechen.

Sie können (einer) Zeile(n) auch eine UNIQUE-Einschränkung hinzufügen.

Verweise:

  • Gehe ich richtig in der Annahme, dass die ersten 2 Beispiele NICHT injektionssicher sind, und die letzten 2 sind es? Danke

    – Krautsalat

    20. Oktober 2015 um 6:47 Uhr

  • Die Methoden hier, die Daten mit der Abfrage verketten, sind fehlerhaft und sollten nicht verwendet werden. Verwenden Sie immer parametrisierte Abfragen oder zumindest Escapezeichen.

    – Brad

    14. Juli 2017 um 18:15 Uhr

  • @ Brad “Verwenden Sie immer parametrisierte Abfragen oder zumindest Escapezeichen” – Ähm… steht das nicht in meiner Antwort? was suchst du überhaupt?

    – Funk Forty-Niner

    14. Juli 2017 um 18:19 Uhr

  • Flag weg … Ihr oben verketteter Code ist kaputt und das ist nur die Realität. Ihr Code darunter ist offensichtlich in Ordnung. Wenn Sie Ihren Beitrag bearbeiten und fehlerhaften Code entfernen, würde ich die Ablehnung gerne rückgängig machen. Und danke, dass Sie auf die anderen kaputten Antworten aufmerksam gemacht haben … Ich werde später heute darauf zurückkommen.

    – Brad

    14. Juli 2017 um 18:32 Uhr

  • @ Brad “Ihr Code, der oben verkettet, ist defekt” – Sie müssen hier genau sein, denn ich sehe nicht, wo etwas “kaputt” ist, Sie täuschen mich nur, wenn überhaupt. An meiner Antwort oder der verwendeten Syntax ist nichts falsch, bitte beleidigen Sie mich nicht. Edit: Wenn du redest email='".$email."' Das ist eine gültige Syntax, in der Sie vielleicht denken, dass sie so hätte geschrieben werden sollen email='$email'Ich weiß nicht.

    – Funk Forty-Niner

    20. Juli 2017 um 14:04 Uhr


1647084848 44 Wie uberprufe ich ob eine Zeile in MySQL vorhanden ist
Emilio Gort

Sie müssen Ihre Abfrage ausführen und $email in der Abfrage ein einfaches Anführungszeichen hinzufügen, da es sich um eine Zeichenfolge handelt, und die entfernen is_resource($query) $query ist ein String, das $result ist die Ressource

$query = "SELECT `email` FROM `tblUser` WHERE `email` = '$email'";
$result = mysqli_query($link,$query); //$link is the connection

if(mysqli_num_rows($result) > 0 ){....}

AKTUALISIEREN

Basis in Ihrer Bearbeitung ändern Sie einfach:

if(is_resource($query) && mysqli_num_rows($query) > 0 ){
        $query = mysqli_fetch_assoc($query);
        echo $email . " email exists " .  $query["email"] . "\n";

Durch

if(is_resource($result) && mysqli_num_rows($result) == 1 ){
        $row = mysqli_fetch_assoc($result);
         echo $email . " email exists " .  $row["email"] . "\n";

und es wird dir gut gehen

AKTUALISIERUNG 2

Ein besserer Weg sollte eine Speicherprozedur sein, die die folgende SQL ausführt und die E-Mail als Parameter übergibt

SELECT IF( EXISTS (
                  SELECT *
                  FROM `Table`
                  WHERE `email` = @Email)
          , 1, 0) as `Exist`

und den Wert in php abrufen

Pseudokodigo:

 $query = Call MYSQL_SP($EMAIL);
 $result = mysqli_query($conn,$query);
 $row = mysqli_fetch_array($result)
 $exist = ($row['Exist']==1)? 'the email exist' : 'the email doesnt exist';

  • Ich mache so eine Band namens Pseudocodigo.

    – Brian Powell

    12. April 2016 um 16:26 Uhr

  • noch nie Daten direkt in einer Abfrage verketten … es entstehen mehrdeutige Abfragen, die zu Fehlern und Sicherheitsproblemen führen können. Verwenden Sie vorbereitete/parametrisierte Abfragen, um dieses Problem vollständig zu vermeiden. Zumindest muss eine ordnungsgemäße Flucht verwendet werden.

    – Brad

    14. Juli 2017 um 18:34 Uhr

  • @ Brad A better way should be have a Store Procedure that execute the following SQL passing the Email as Parameter

    – Emilio Gort

    14. Juli 2017 um 18:56 Uhr

  • @EmilioGort Das hängt davon ab, wie Sie diese gespeicherte Prozedur ausführen!

    – Brad

    14. Juli 2017 um 18:57 Uhr

  • @Brad nur eine Frage: Bereitet MYSQL vor, einen Parameter wie @Email=’email@email.com’); DROP TABLE USERS; ‘ ??

    – Emilio Gort

    14. Juli 2017 um 19:01 Uhr

1647084849 730 Wie uberprufe ich ob eine Zeile in MySQL vorhanden ist
Dharman

Es gibt mehrere Möglichkeiten zu prüfen, ob ein Wert in der Datenbank vorhanden ist. Lassen Sie mich demonstrieren, wie dies mit PDO und mysqli richtig gemacht werden kann.

PDO

PDO ist die einfachere Option. Um herauszufinden, ob ein Wert in der Datenbank vorhanden ist, können Sie die vorbereitete Anweisung und verwenden fetchColumn(). Es besteht keine Notwendigkeit, Daten abzurufen, also werden wir nur abholen 1 wenn der Wert vorhanden ist.

<?php

// Connection code. 
$options = [
    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new \PDO('mysql:host=localhost;port=3306;dbname=test;charset=utf8mb4', 'testuser', 'password', $options);

// Prepared statement
$stmt = $pdo->prepare('SELECT 1 FROM tblUser WHERE email=?');
$stmt->execute([$_POST['email']]);
$exists = $stmt->fetchColumn(); // either 1 or null

if ($exists) {
    echo 'Email exists in the database.';
} else {
    // email doesn't exist yet
}

Weitere Beispiele finden Sie unter: Wie überprüfe ich, ob E-Mails in der Datenbank vorhanden sind?

MySQLi

Wie immer ist mysqli etwas umständlicher und eingeschränkter, aber wir können mit der vorbereiteten Anweisung einen ähnlichen Ansatz verfolgen.

<?php

// Connection code
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli('localhost', 'testuser', 'password', 'test');
$mysqli->set_charset('utf8mb4');

// Prepared statement
$stmt = $mysqli->prepare('SELECT 1 FROM tblUser WHERE email=?');
$stmt->bind_param('s', $_POST['email']);
$stmt->execute();
$exists = (bool) $stmt->get_result()->fetch_row(); // Get the first row from result and cast to boolean

if ($exists) {
    echo 'Email exists in the database.';
} else {
    // email doesn't exist yet
}

Anstatt die Ergebniszeile (die möglicherweise gar nicht existiert) in einen booleschen Wert umzuwandeln, können Sie auch abrufen COUNT(1) und lesen Sie das erste Element aus der ersten Zeile mit fetch_row()[0]

Weitere Beispiele finden Sie unter: So überprüfen Sie, ob ein Wert in einer Datenbank mit mysqli-vorbereiteten Anweisungen vorhanden ist

Kleinere Bemerkungen

  • Wenn Ihnen jemand die Verwendung vorschlägt mysqli_num_rows(), hör nicht auf sie. Dies ist ein sehr schlechter Ansatz und kann bei Missbrauch zu Leistungsproblemen führen.
  • Nicht verwenden real_escape_string(). Dies ist nicht als Schutz vor SQL-Injection gedacht. Wenn Sie vorbereitete Anweisungen korrekt verwenden, müssen Sie sich keine Gedanken über ein Escape machen.
  • Wenn Sie überprüfen möchten, ob eine Zeile in der Datenbank vorhanden ist, bevor Sie versuchen, eine neue einzufügen, sollten Sie diesen Ansatz besser nicht verwenden. Es ist besser, einen eindeutigen Schlüssel in der Datenbank zu erstellen und ihn eine Ausnahme auslösen zu lassen, wenn ein doppelter Wert vorhanden ist.

Prüfen Sie nach der Validierung und vor INSERT, ob der Benutzername bereits existiert, indem Sie mysqli(procedural) verwenden. Das funktioniert:

//check if username already exists
       include 'phpscript/connect.php'; //connect to your database

       $sql = "SELECT username FROM users WHERE username="$username"";
       $result = $conn->query($sql);

       if($result->num_rows > 0) {
           $usernameErr =  "username already taken"; //takes'em back to form
       } else { // go on to INSERT new record

993510cookie-checkWie überprüfe ich, ob eine Zeile in MySQL vorhanden ist? (dh überprüfen Sie, ob Benutzername oder E-Mail in MySQL vorhanden sind)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy