Det finns flera sätt att kontrollera om användarnas tillhandahållande data matchar data i en MySQL-databas med PHP. Det bästa tillvägagångssättet beror på vad du jämför och hur du vill hantera potentiella avvikelser. Här är några exempel, med fokus på bästa praxis för säkerhet:
1. Kontrollera för en enda användare (t.ex. inloggning):
Detta är det vanligaste scenariot. Vi kontrollerar om ett användarnamn och lösenord matchar en post i databasen. avgörande, vi hash lösenordet innan du jämför det. Förvara aldrig lösenord i vanlig text!
`` `php
php
// databasuppgifter (ersätt dessa med dina faktiska referenser!)
$ Servername ="Your_Servername";
$ användarnamn ="your_username";
$ lösenord ="your_password";
$ dbname ="your_dbname";
// Användarinmatning (sanera detta!)
$ userNameInput =$ _post ["användarnamn"];
$ PasswordInput =$ _Post ["Password"];
// sanera användaringångar för att förhindra SQL -injektion
$ userNameInput =mysqli_real_escape_string ($ conn, $ userNameInput);
$ PasswordInput =mysqli_real_escape_string ($ conn, $ PasswordInput);
// Skapa anslutning
$ conn =new mysqli ($ servername, $ användarnamn, $ lösenord, $ dbname);
// Kontrollera anslutningen
if ($ conn-> connect_error) {
Die ("Anslutning misslyckades:". $ conn-> connect_error);
}
// Förbered och binda
$ stmt =$ conn-> förbereda ("Välj lösenord_hash från användare där användarnamn =?");
$ stmt-> bind_param ("s", $ usernameInput);
$ stmt-> execute ();
$ resultat =$ stmt-> get_result ();
if ($ result-> num_rows> 0) {
$ rad =$ result-> Fetch_assoc ();
$ hashedPassword =$ rad ["Password_hash"];
// Verifiera lösenord med Password_Verify (PHP:s inbyggda lösenordshash-funktion)
if (Password_verify ($ PasswordInput, $ hashedPassword)) {
// Logga in framgångsrik
Echo "Logga in framgångsrikt!";
} annat {
// Felaktigt lösenord
echo "felaktigt lösenord.";
}
} annat {
// Användarnamn hittades inte
echo "Användarnamn hittades inte.";
}
$ stmt-> close ();
$ conn-> close ();
?>
`` `
Förklaring:
* databasuppgifter: Byt ut platshållarens referenser med dina faktiska MySQL -databasinformation.
* Användarinmatning: Denna kod antar att användarnamnet och lösenordet skickas in via en postförfrågan. Sanit alltid användarinmatning För att förhindra SQL -injektionssårbarheter. `Mysqli_real_escape_string ()` är ett grundläggande steg, men beredda uttalanden (som används här) är mycket mer robusta.
* Förberedd uttalande: Ett förberett uttalande förhindrar SQL-injektion genom att separera SQL-frågan från användarnas leveransdata. Det är avgörande för säkerhet.
* Lösenordshashing: Databasen ska lagra lösenord *hash *, inte vanliga textlösenord. `Password_hash ()` skapar en säker hash, och `lösenord_verify ()` jämför användarens ingång mot den lagrade hashen.
* Felhantering: Koden innehåller grundläggande felhantering för databasanslutning och frågefel.
2. Kontrollera för flera matcher (t.ex. sökning av ett tabell):
Om du behöver hitta flera matcher baserade på användarinmatning (som att söka efter produkter med ett specifikt namn) måste du anpassa frågan:
`` `php
php
// ... (databasanslutning som ovan) ...
$ sökning =$ _post ["Searchterm"];
$ sökning =mysqli_real_escape_string ($ conn, $ sökning); // Sanit!
$ sql ="välj * från produkter där namn som '%$ Searchterm%'"; // Enkelt exempel - Använd förberett uttalande för bättre säkerhet!
$ resultat =$ conn-> query ($ sql);
if ($ result-> num_rows> 0) {
medan ($ rad =$ result-> fetch_assoc ()) {
// bearbeta varje matchande rad
Echo "Produkt:". $ rad ["namn"]. "
";
}
} annat {
echo "Inga produkter hittade.";
}
// ... (nära anslutning) ...
?>
`` `
Viktig anmärkning: Ovanstående sökexempel använder String Concatenation, som är sårbar för SQL -injektion om `$ Searchterm 'inte saneras . För en säker lösning, skriv om den med beredda uttalanden. Exempel:
`` `php
$ stmt =$ conn-> förbereda ("välj * från produkter där namn gillar?");
$ sökning ="%". $ sökning. "%"; // Lägg till jokertecken för liknande
$ stmt-> bind_param ("s", $ sökning);
$ stmt-> execute ();
// ... resten av koden för att hantera resultat ...
`` `
Kom ihåg att ersätta platshållartabellen och kolumnnamnen med ditt faktiska databasschema. Prioritera alltid säkerhet genom att använda beredda uttalanden och korrekt input sanering för att förhindra SQL -injektionsattacker. Överväg att använda parametrerade frågor för all interaktion med användarinmatning och din databas. För mer komplexa scenarier eller stora datasätt kanske du vill utforska mer avancerade tekniker som lagrade procedurer.