Array mit GET-Variablen vergleichen?

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Lukas03

Mitglied
Hallo, ich möchte gerne meine Array aus der Datenbank mit einer einfachen GET- Variablen vergleichen.

Dieses funktioniert zwar, aber der Else wert wird wiederholt ausgegeben.

user gefundenUser nicht gefunden!User nicht gefunden!User nicht gefunden!

Mit in_array läuft es auch nicht. Sonst wird keine Fehlermeldung ausgegeben.

Wie sollte ich sonst noch probieren?

Hier mal mein versuch:

PHP:
<?php
error_reporting ( -1 );
ini_set ( 'display_errors', true ); 

$user= $_GET['pm'];
$db = mysqli_connect("localhost", "******", "", "user");


$sql = mysqli_query($db, "SELECT id, username FROM user");
while ($row = mysqli_fetch_object($sql)) {

// Schreibe alle Usernamen in die Array $usernamepruefen
$usernamepruefen = ['username' => $row->username];

    //alle Inhalte werden geladen!
    var_dump($usernamepruefen);

    if ($row->username == $user){
    echo "user gefunden";
    }
    else{
        echo  "User nicht gefunden!";
        }

  }

?>
 

ComFreek

Mod | @comfreek
Moderator
Du möchtest die Benutzersuche bereits im SQL-Query unterbringen. Datenbanken sind insbesondere zur Suche von Daten gedacht. Das ist effizienter und weniger fehleranfällig, weniger repetitiver als es in der Programmiersprache zu tun.

Bringe also in deinem SQL-Query eine WHERE-Klausel ein, die den Nutzernamen auf die $_GET-Eingabe überprüft. Nutze Prepared Statements, um SQL-Injection zu vermeiden.
 

Igäl

Erfahrenes Mitglied
Gratuliere. Dein Script macht genau das, was du programmiert hast :) Offensichtlich enthält deine Tabelle vier User.

Ich rate dir auch zum Ansatz von ComFree.

Solltest du auf die codeseitige Bearbeitung deiner Daten bestehen, kannst du "break;" benutzen, um die Schleife abzubrechen, wenn das gewünschte Ergebnis eingetreten ist. Allerdings müsstest du dann damit leben, dass "Fehlversuche" passieren, bis der gewünschte User gefunden ist. Sprich: wenn der dritte User der von dir Gewünschte ist, wird zwei Mal ein "User nicht gefunden!" resultieren. Performancetechnisch ist das ein Graus!

Also:
PHP:
$sql = mysqli_query($db, "SELECT id, username FROM user WHERE username='.$user.'");

Schau dir aber auf jeden Fall die Prepared Statements an oder baue andere Sicherheitsmechanismen ein. Beispielsweise GET-Whitelists (du definierst die Art der Werte deiner GET-Variablen). Oder wenn du weisst, dass deine Usernamen nicht länger als 15 Zeichen sind, kannst du für den Anfang einfach mal die Stringlänge überprüfen. Unter 15 Zeichen wird eine SQL-Injection m. A. n. zur Challenge :).
 

Lukas03

Mitglied
Da bin ich wieder, hab die Abfrage geändert in Prepared Statements.

Die User Abfrage funktioniert (Ausgabe, wenn Wert übereinstimmt "User gefunden")

Allerdings gibt es keine (else Ausgabe) wenn der wert nicht stimmt?

PHP:
<?php

error_reporting ( -1 );
ini_set ( 'display_errors', true );

$user= $_GET['pm'];

$pdo = new PDO('mysql:host=localhost;dbname=user', 'root', '******');

$statement = $pdo->prepare("SELECT id, username FROM user WHERE username = ?");
$statement->execute(array($user));  
while($row = $statement->fetch()) {
$db_user = $row['username'];


if ($db_user == $user)
{echo "User gefunden";}
  else
  { echo  "User nicht gefunden!";}}

?>
 

m.scatello

Erfahrenes Mitglied
PHP:
<?php
  error_reporting (E_ALL);
  ini_set ('display_errors', true);

  $pdo = new PDO('mysql:host=localhost;dbname=user', 'root', '******');

  $statement = $pdo->prepare("SELECT id, username FROM user WHERE username = ?");

  if ($statement->execute(array($_GET['pm'])))
  {
     $row = $statement->fetch();
    
     if ($row)
     {
       $db_user = $row['username'];
    
       echo "User gefunden";
     }
     else
       echo "User nicht gefunden";
 }
 else
   echo "Execute-Error";
?>
 

Lukas03

Mitglied
PHP:
<?php
  error_reporting (E_ALL);
  ini_set ('display_errors', true);

  $pdo = new PDO('mysql:host=localhost;dbname=user', 'root', '******');

  $statement = $pdo->prepare("SELECT id, username FROM user WHERE username = ?");

  if ($statement->execute(array($_GET['pm'])))
  {
     $row = $statement->fetch();
   
     if ($row)
     {
       $db_user = $row['username'];
   
       echo "User gefunden";
     }
     else
       echo "User nicht gefunden";
}
else
   echo "Execute-Error";
?>
Danke funktioniert ! Echt lieb von dir !
 

ComFreek

Mod | @comfreek
Moderator
Schau dir aber auf jeden Fall die Prepared Statements an oder baue andere Sicherheitsmechanismen ein. Beispielsweise GET-Whitelists (du definierst die Art der Werte deiner GET-Variablen). Oder wenn du weisst, dass deine Usernamen nicht länger als 15 Zeichen sind, kannst du für den Anfang einfach mal die Stringlänge überprüfen. Unter 15 Zeichen wird eine SQL-Injection m. A. n. zur Challenge :).
Warum möchtest du das Risiko eingehen? Ich sehe keinen Vorteil von "15-Zeichen Nutzernamen und Risiko eingehen" und "2-Zeilenlösung mit Prepared Statements".

Mit Verlaub, aber dieser Ansatz ist konzeptionell so falsch, dass es einem Gegenbeispiel eigentlich nicht bedürfte. Aber guck dir doch mal 'OR 1=1 an, das müssten weniger als 15 Zeichen sein :)

Prepared Statements sind übrigens nicht nur ein Sicherheitsmechanismus, sondern einer der wenigen Wege, überhaupt korrekten Code zu erhalten.
Fehlschlagende SQL Queries sind inkorrekter Code. Dass Nutzernamen keine Quotes enthalten dürfen, ist auch inkorrekt (außer spezifiziert).
 

Igäl

Erfahrenes Mitglied
True story. Meine aktive Zeit in der Materie ist leider schon etwas her. Werde mich wohl besser etwas zurückhalten.

Aber daneben wächst man mit den Projekten die man programmiert und dies geht nur step by step, wenn man das als Hobby betreibt. Haut man Neulingen gleich die komplexeste (wenn auch komplett korrekte) Vorgehensweise um die Ohren, generiert man gerne Überforderung, damit einhergehende Frustration und Unlust, das Projekt weiter zu verfolgen. Deshalb mein Ansatz, dass seine Lösung mit "einfacherer" Materie als Prepared Statements am Anfang mal erweitert werden kann. Er wird in dem Stadium nicht gleich für die NSA programmieren und sich dann, wenn die Basics gefestigt sind, auch sicherlich mit der Sicherheit seiner Scripts befassen. Bis dahin wird er weder ein attraktives Ziel für Angriffe sein, noch ist das Schadenspotential hoch. Sind natürlich Mutmassungen.

Meine Aussage war materiell falsch. Sehe ich ein. Aber auch ohne PS ist hier einiges an Sicherheit zu gewinnen. Der Vollständigkeit halber sei hier demnach auf das Stichwort "Typenvalidierung" hingewiesen. Für Usernamen gibt es auch supereinfache RegEx, die das gewünschte Ergebnis bringen können. Aber wie bereits erwähnt, sind die PS natürlich zu präferieren.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Neue Beiträge