2016-10-05 3 views
-2

Ich weiß, dass es eine Menge Mal gepostet wurde, und ich habe fast jede Antwort auf dieser Website versucht, aber nichts wird funktionieren. Wenn ich versuche, den Registrierungsprozess auszuführen, wird die if-Anweisung übersprungen, obwohl der Benutzername bereits vergeben ist. Hier ist der Teil des Codes:Wie überprüft man, ob der Benutzername bereits existiert mit PHP/MYSQL

$username = $_POST['username']; 
    $password = $_POST['password']; 

    $sql = mysql_query("SELECT * FROM users (username, password) WHERE username = '".$username."'") 

if(mysql_num_rows($sql)>0) 
{ 
    echo 'taken'; 
} 

else 
{ 
... 
} 

ich auch, dass ich einen Thread sah mit jemandem beachten sollte sagen, dass sie das gleiche Problem wie dieses hatte, weil sie mysqli verwenden musste, aber sonst nichts abgesehen davon. Vielen Dank.

+3

'mysql_query' ist tot, es wurde aus PHP 7 entfernt. Bitte, hör auf es zu benutzen und benutze zumindest 'mysqli'. PDO ist eine noch bessere Option. – tadman

+3

** WARNUNG **: Es ist nicht einfach, eine eigene Zugriffskontrollschicht zu schreiben, und es gibt viele Möglichkeiten, sie schwerwiegend falsch zu machen. Bitte schreiben Sie nicht Ihr eigenes Authentifizierungssystem, wenn Sie ein modernes [Entwicklungsframework] (http://codegeekz.com/best-php-frameworks-for-developers/) wie [Laravel] (http://laravel.com/) verfügt über ein robustes [Authentifizierungssystem] (https://laravel.com/docs/5.2/authentication). Am absolutesten folgen Sie [empfohlene Best Practices für die Sicherheit] (http://www.phptherightway.com/#security) und ** speichern Sie Passwörter niemals als Nur-Text **. – tadman

+0

Könnte ich mich bitte mit dem Benutzernamen "**' foo 'AND' 0 '=' 1' ** "anmelden?(Ich möchte mich mehrmals mit demselben Benutzernamen anmelden.) – spencer7593

Antwort

1

MYSQL: Diese Erweiterung wurde in PHP 5.5.0 veraltet, und es wurde in PHP 7.0.0 entfernt. Stattdessen sollte die MySQLi oder PDO_MySQL Erweiterung verwendet werden.

MYSQLI Referenz: http://php.net/manual/en/mysqli.query.php

PDO Referenz: http://php.net/manual/en/book.pdo.php

Vorteile von PDO mit:

Die meisten PHP-Programmierer haben entdeckt, wie MySQLi und MySQL-Erweiterungen zu verwenden. PHP Data Objects (PDO) bieten jedoch Möglichkeiten, mit Objekten zu arbeiten und vorbereitete Anweisungen abzurufen, die die Arbeit wesentlich erleichtern.

PDO ist ein Datenbankzugriffstool in PHP, das einen einheitlichen Zugriff auf mehrere Datenbanken ermöglicht. Es unterstützt keine Datenbanken spezifischen Syntax, aber es ermöglicht relativ nahtlose Wechsel zwischen verschiedenen Plattformen und Datenbanken, die einfach durch Ändern der Verbindungszeichenfolge durchgeführt werden können.

Im Folgenden finden Sie einige Informationen über PDO, die hauptsächlich an Programmierer gerichtet sind, die immer noch die Erweiterungen MySQL und MySQLi verwenden, um die Überlegenheit des ersten zu verdeutlichen. Verschiedene Aspekte werden in den nächsten Absätzen untersucht.

  • Datenbank-Unterstützung

Die PDO-Erweiterung hat die Fähigkeit, eine beliebige Datenbank zuzugreifen, die die PDO-Treiber für geschrieben wurde. Es gibt viele PDO-Treiber, von denen einige PDO-Treiber enthalten, die unter anderem auf Free TDS-, Sybase-, Microsoft SQL Server-, IBM DB2-, Firebird/Interbase 6-, Oracle Call Interface- und PostgreSQL-Datenbanken zugreifen.

Die Treiber sind nicht automatisch in jedem System verfügbar, daher müssen Sie Ihre verfügbaren Treiber finden und die Treiber hinzufügen, die Sie benötigen.

  • Datenbank verbindet

Es gibt verschiedene Syntax der sind Datenbankverbindungen zu schaffen, die auf bestimmte Datenbanken abhängen. Wenn Sie PDO verwenden, möchten Sie sicherstellen, dass Ihre Operationen in try/catch-Blöcke eingeschlossen sind und dass Sie die Ausnahmemethode verwenden.

Im Normalfall muss nur eine einzige Verbindung hergestellt werden, und die Verbindungen werden geschlossen, indem das Datenbank-Handle als Null programmiert wird. Sie können spezifischere Optionen und Syntax in verschiedenen Ressourcen-Sites nachschlagen.

  • Fehlerbehandlung

PDO für die Verwendung von Ausnahmen für die Fehlerbehandlung ermöglicht, weshalb Sie PDO geraten sind in try/catch-Blöcke zu wickeln. Auf diese Weise kann PDO in das entsprechende Fehlermodus-Attribut gezwungen werden, um eine Ausnahme zu erzeugen.

Es gibt drei - stille (Standard), Warnung und Ausnahme - Modi. Die letzten beiden sind bei der DRY-Programmierung nützlicher. Der 'Warning'-Fehlermodus ist nützlich für das Debugging und der' Exception'-Modus erlaubt eine fehlerfreie Fehlerbehandlung, während Daten versteckt werden, die eine Person benutzen könnte, um Ihr System auszunutzen.

  • Inserts und Updates

PDO kondensiert die gemeinsame Einsatz und Aktualisierung von Datenbankoperationen in einen einfachen zweistufigen Prozess: Prepare >> [Bind] >> Execute. Mit dieser Methode können Sie die vorbereiteten Anweisungen von PDO voll ausnutzen, die Ihnen Schutz vor böswilligen Angriffen durch SQL-Injection bieten.

Vorbereitete Anweisungen sind vorkompilierte SQL-Anweisungen, die mehrmals ausgeführt werden können, indem diese Daten an die Server gesendet werden. Sie haben den Vorteil, dass die in den Platzhaltern verwendeten Daten automatisch vor SQL-Injection-Angriffen geschützt sind.

Daher ist es besser, PDO zu verwenden, und es wird die SQL-Injektionen vermeiden, die jetzt ein Tage vorherrschen.

PDO-Code zu überprüfen, ob die Benutzernamen und Passwörter Felder in der DB vorhanden sind:

<?php 
//Connections 
try { 
    $handler = new PDO('mysql:host=localhost;dbname=s','root', '*'); 
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch (PDOException $e){ 
    exit($e->getMessage()); 
} 

$name = $_POST['name']; 
$username = $_POST['username']; 
$email = $_POST['email']; 
$password = $_POST['password']; 
$password1 = $_POST['passwordconf']; 
$ip = $_SERVER['REMOTE_ADDR']; 


//Verifcation 
if (empty($name) || empty($username) || empty($email) || empty($password) || empty($password1)){ 
    $error = "Complete all fields"; 
} 

// Password match 
if ($password != $password1){ 
    $error = "Passwords do not match"; 
} 

// Email validation 

if (!filter_var($email, FILTER_VALIDATE_EMAIL)){ 
    $error = "Enter a Valid email"; 
} 

// Password length 
if (strlen($password) <= 6){ 
    $error = "Choose a password longer then 6 character"; 
} 

if(!isset($error)){ 
//no error 
$sthandler = $handler->prepare("SELECT username FROM users WHERE username = :name"); 
$sthandler->bindParam(':name', $username); 
$sthandler->execute(); 

if($sthandler->rowCount() > 0){ 
    echo "User Already Exists."; 
} else { 
    //Securly insert into database 
    $sql = 'INSERT INTO users (name ,username, email, password, ip) VALUES (:name,:username,:email,:password,:ip)';  
    $query = $handler->prepare($sql); 

    $query->execute(array(

    ':name' => $name, 
    ':username' => $username, 
    ':email' => $email, 
    ':password' => $password, 
    ':ip' => $ip 

    )); 
    } 
}else{ 
    echo "error occured: ".$error; 
    exit(); 
} 

Hoffnung so diese Referenz könnte nützlich sein für Sie selbst die Codes in der Zukunft Projekt zu entwickeln.

+0

Vielen Dank dafür. Nachdem ich Ihren Beitrag gelesen habe, wechsle ich sicher zu PDO, sobald ich einen kostenlosen/günstigen Host finde, der php 7 unterstützt (derzeit mit 000webhost und nur PHP 5.1). –

+0

Ich muss den Grund für meine Ablehnung zu dieser Antwort wissen. Bitte begründen Sie –

+0

Entschuldigung, war ich nicht, der Sie herabgestuft hat ... –

-6

Dieser Code ist nicht sicher. Sie sollten die Einkommensdaten vor der Verwendung vorbereiten. Zumindest:

$username = addslashes(strip_tags($_POST['username'])); 
+4

Nein, nein, ** NEIN **. 'addslashes' ist nicht das zu verwendende Werkzeug und' strip_tags' ist einfach mehr Unsinn. Wenn Sie keine vorbereiteten Anweisungen mit Platzhalterwerten verwenden können, ist die ** einzige ** akzeptable Lösung hier eine Escape-Funktion wie mysql_real_escape_string. Tut mir leid, dass ich so hart bin, aber diese Art von Fehlinformation muss angesprochen werden. – tadman

+4

Das ist ein schrecklicher, schrecklicher Vorschlag. Für die Liebe von allem, was in dieser Welt gut und schön ist, benutze * vorbereitete Aussagen * mit * bind plocholders *. Und wenn das aus irgendeinem unerfindlichen Grund nicht möglich ist, dann muss potentiell schändlicher Inhalt, der im SQL-Text enthalten ist, * richtig maskiert * sein. Die Verwendung von "addslashes" und "strip_tags", um das Entweichen zu erreichen, ist nicht akzeptabel; es ist unentschuldbar. Verwenden Sie eine Funktion, die ausdrücklich für diesen Zweck vorgesehen ist, z. 'mysqli_real_escape_string'. – spencer7593

2

Dies ist nicht die eleganteste Lösung. Aber es wird prüfen, ob ein Benutzername existiert.

if (isset($_POST["username"]) && isset($_POST["password"])) { 
    $username = $_POST["username"]; 
    $password = $_POST["password"]; 
    $stmt = $this->db->prepare('SELECT COUNT(*) FROM yourtable WHERE username=?'); 
    $stmt->bind_param("s", $username); 
    $stmt->execute(); 
    $get_instances = NULL; 
    $stmt->bind_result($get_instances); 
    $instances = NULL; 
    while ($stmt->fetch()) { 
     $instances = $get_instances; 
    } 
    $stmt->close(); 

    if ($instances == 0) { 
     //whatever you want to happen   
    } 
} 
+0

Dieses Tutorial könnte hilfreich sein, um den obigen Code in den Kontext zu setzen: https://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app –

+0

Das hat mit ein paar kleinen Änderungen für mich funktioniert, danke. Ich werde diese Methode verwenden, bis ich besseres Hosting finde, das Server mit neueren php-Versionen hat und wahrscheinlich danach zu PDO-Erweiterungen wechselt. –

Verwandte Themen