2017-04-03 2 views
-4

Ich habe den folgenden CodeFetch nur ein Feld in PHP und mysqli

if (isset($_POST['change'])) { 
    $current = mysqli_real_escape_string($con, $_POST['current']); 
    $password = mysqli_real_escape_string($con, $_POST['password']); 
    $cpassword = mysqli_real_escape_string($con, $_POST['cpassword']); 

    if(strlen($password) < 6) { 
     $error = true; 
     $password_error = "Password must be minimum of 6 characters"; 
    } 
    if($password != $cpassword) { 
     $error = true; 
     $cpassword_error = "Password and Confirm Password doesn't match"; 
    } 

    if(mysqli_fetch_field(mysqli_query($con, "SELECT password FROM users WHERE id = '" . $_SESSION['usr_id'] . "' LIMIT 1")) != md5($current)) { 
     $error = true; 
     $confirm_error = "Your actual password is not correct"; 
    } 
} 

Das Problem ist hier:

mysqli_fetch_field(mysqli_query($con, "SELECT password FROM users WHERE id = '" . $_SESSION['usr_id'] . "' LIMIT 1")) 

Es gibt mir den Fehler

PHP Catchable fatal error: Object of class stdClass could not be converted to string in /.../password.php on line 27

ich versucht habe, mit

mysql_result(mysqli_query($con, "SELECT password FROM users WHERE id = '" . $_SESSION['usr_id'] . "' LIMIT 1"), 0)

aber es nicht funktioniert, es gibt mir

PHP Fatal error: Uncaught Error: Call to undefined function mysql_result() in /.../password.php:27

Ich will nicht mysqli_fetch_array() und eine while Schleife verwenden. Ich habe nach einer Funktion oder etwas Ähnlichem gesucht und ich habe etwas gefunden, aber nichts hat für mich gearbeitet.

+2

'mysqli_real_escape_string ($ con, $ _POST ['password'])' Sie wissen, dass das zu Fehlzündungen steht. –

+0

Es kann nichts mit mysqli_fetch_field zu tun haben. Dump '$ _SESSION ['usr_id']', und trennen Sie Ihre mysqli_query und mysqli_fetch_field Anweisungen. Und natürlich wird mysql_result nicht funktionieren, es ist keine mysqli-Funktion. – aynber

+0

'Ich möchte nicht mysqli_fetch_array() und eine while-Schleife verwenden .... warum? –

Antwort

0

Ich denke nicht, dass dies die beste Lösung für Sie ist, aber basierend auf dem, was Sie fragen, möchten Sie vielleicht mysqli_fetch_assoc verwenden.

$result = mysqli_query($con, "SELECT password FROM users WHERE id = '" . $_SESSION['usr_id'] . "' LIMIT 1"); 
$row = mysqli_fetch_assoc($result); 

if($row['password']!= md5($current)) { 
     $error = true; 
     $confirm_error = "Your actual password is not correct"; 
} 

Erwähnung in den Kommentaren unten, dass sollten Sie parametrisierte Abfrage verwenden. Für Benutzer Passwort Passwort hashing Bibliothek wie http://www.openwall.com/phpass/ ODER eingebaut in password_hash Funktion in PHP 5> = 5.5.0, PHP 7.

Um Ihre aktuelle Abfrage zu parametrisieren und mögliche SQL-Injektion Angriffe vermeiden versuchen Sie den folgenden Code.

$mysqliConnection = new mysqli("localhost", "my_user", "my_password", "my_dbname"); 

/* check connection */ 
if ($mysqliConnection->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $mysqliConnection->connect_errno . ") " . $mysqliConnection->connect_error; 
} 

$sql = "SELECT password FROM users WHERE id = ? LIMIT 1"; 
$stmt = $mysqliConnection->prepare($sql); 
$stmt->bind_param("i", $_SESSION['usr_id']); 
$stmt->execute(); 
$stmt->bind_result($password); 
$stmt->store_result(); 
$row = $stmt->fetch() 

Jetzt könnten Sie $ Passwort Variable, um das Kennwort zu überprüfen Hashing Sie verwendet haben. Ich hoffe das hilft.

+0

Es sieht so aus, als hätte ich die Frage missverstanden und bin ohne Antwort gegangen Warum würdest du es mir erklären, warum ich so viel gesagt habe? d verbessern? –

+0

Wenn Sie eine Antwort ohne vorbereitete Anweisungen posten [möchten Sie dies möglicherweise vor dem Posten berücksichtigen] (http://meta.stackoverflow.com/q/344703/). Zusätzlich [kommt eine wertvollere Antwort von der OP die richtige Methode] (https://meta.stackoverflow.com/a/290789/1011527). –

+0

*** Sie sollten [MD5 Passwort-Hashes] nicht wirklich verwenden (http://security.stackexchange.com/questions/19906/is-md5-considered-insecure) *** und Sie sollten wirklich PHP's verwenden in Funktionen] (http://jayblanchard.net/proper_password_hashing_with_PHP.html), um die Passwortsicherheit zu behandeln. Stellen Sie sicher, dass Sie Passwörter nicht umgehen (http://stackoverflow.com/q/36628418/1011527) oder verwenden Sie vor dem Hashing einen anderen Bereinigungsmechanismus. Wenn Sie dies tun, * ändert * das Passwort und verursacht unnötige zusätzliche Codierung. –

0

Sie müssen die Dokumentation für mysqli_fetch_field() lesen:

Returns the definition of one column of a result set as an object. Call this function repeatedly to retrieve information about all columns in the result set.

Diese Funktion gibt den Wert in einer Spalte der Ergebnismenge nicht, es gibt Metadaten über diese Spalte. Wie die Spaltennamen, den Tabellennamen, den Datentyp, die maximale Länge usw.

Wenn Sie das Feld erfassen und Dump es, Sie sehen:

$passhash = mysqli_fetch_field(mysqli_query($con, "SELECT password FROM users WHERE id = '" . $usr_id . "' LIMIT 1")); 
print_r($passhash); 

Ausgang:

stdClass Object 
(
    [name] => password 
    [orgname] => password 
    [table] => users 
    [orgtable] => users 
    [def] => 
    [db] => test 
    [catalog] => def 
    [max_length] => 32 
    [length] => 65535 <-- I used TEXT for the password column 
    [charsetnr] => 8 
    [flags] => 16 
    [type] => 252 
    [decimals] => 0 
) 

Beachten Sie, dass es als ein Objekt und nicht als ein skalarer Wert zurückgegeben wird. Sie können es also nicht direkt mit Ihrer md5($current) vergleichen. Es hat auch nicht den Wert, nach dem Sie suchen.

Hier ist, wie ich den Code schreiben würden Sie zu tun versuchen:

$sql = "SELECT password FROM users WHERE id = ? LIMIT 1"; 
$stmt = mysqli_prepare($con, $sql); 
$stmt->bind_param($stmt, "i", $_SESSION['usr_id']); 
$stmt->execute(); 
$result = $stmt->get_result(); 
$match = false; 
while ($row = $result->fetch_assoc()) { 
    if ($row['password'] == md5($current) { 
     $match = true; 
    } 
} 
if (!$match) { 
    $error = true; 
    $confirm_error = "Your actual password is not correct"; 
} 

Weitere Fehler:

Call to undefined function mysql_result()

Die mysql_result() Funktion ist veraltet und es wurde in PHP 7 entfernt wurde.Es würde sowieso nicht mit mysqli_query() zusammenarbeiten, da es Teil einer anderen API ist und diese beiden APIs nicht zusammenpassen.

mysqli_result (beachten Sie die mysqli, nicht mysql) ist der Name einer Ressourcenklasse, keine Funktion.