2014-12-03 2 views
0

У меня проблема с формой, я создал (только для диагностики, я знаю, что это уязвимы для SQL Injection)PHP форма не вставляя значения в БД

В принципе, форма не вставляется в БД , но, похоже, он возвращает true в скрипте.

Код выглядит следующим образом:

form.php

<form action="create.php" method="post"> 
     <p>Username: <input type="text" name="username" /> 
     </p> 
     <p>Password: <input type="password" name="password" /> 
     </p> 
     <p><input type="submit" value="Create" name= "cre" /> 
     </p> 
    </form> 

create.php

<?php 
session_start(); 
$dbname = "obsidian"; 

if(isset($_POST['cre'])){ 


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

    $mysqli = new mysqli('localhost','admin1', 'password1','obsidian') or die('Failed to connect to DB' . $mysqli->error); 

    $hashed_password = password_hash($password,PASSWORD_DEFAULT); 

     $registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 
     if($registerquery = true) 
     { 
      echo "<h1>Success</h1>"; 
      echo "<p>Your account was successfully created. Please <a href=\"index.php\">click here to login</a>.</p>"; 
     } 
     else 
     { 
      echo "<h1>Error</h1>"; 
      echo "<p>Sorry, your registration failed. Please go back and try again.</p>";  
     }  
    } 


    ?> 

я получаю сообщение об успехе, но, как я уже говорил, значения не получают вставлен в БД.

Любая помощь будет хорошей.

+2

Вы никогда не запускаете запрос Insert в базе данных. – Pitchinnate

+4

... и вы уязвимы для [SQL-инъекций] (http://bobby-tables.com) –

+0

Вы делаете разницу между = и ==? – bksi

ответ

6

Это определяет запрос, но делает НЕ запустить его:

$registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 

это НЕ "тестирование" для достижения успеха.Это просто видеть переменную верно:

if($registerquery = true) 

= это назначение, == для проверки равенства.

+0

Да, ему все еще нужны вызовы 'prepare()', 'bind_param()' и 'execute()'. – tadman

1

Вы пропустили шаг, на котором вы действительно передаете запрос SQL в базу данных.

$mysqli->query($registerquery); 

должен быть запущен до его ввода.

Вы также можете изменить, если заявление на следующий

if ($mysqli->query($registerquery)) 

Кроме того, вы используете один =, который устанавливает $registerquery вместо проверки его значение.

1

Все, что вы здесь делаете:

$registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 
if($registerquery = true) 

устанавливает строку, а затем позже установив строку верно. Это всегда вернет истину. Есть две проблемы:

  • Вам необходимо выполнить оператор SQL, который вы сохранили в строке, для чего-либо, что должно произойти в базе данных.
  • Вы действительно не проверяете возвращаемое значение («==»), а используете «=», который просто устанавливает переменную. Очень распространенная ошибка.

Кроме того, вы, вероятно, больше не должны использовать встроенные функции mysqli, так как они скоро будут устарели. Я бы рекомендовал переключиться на PDO, прежде чем двигаться дальше.

+0

он на самом деле не проверяет его – ofrommel

+0

Duly отметил и отредактирован. Остается самый важный момент, заключающийся в том, что он вообще не выполняет никаких SQL-операторов. Не уверен, что это заслуживает нисходящего потока. –

+0

Я не спустил вниз. Не знаю, кто это делает, но мой ответ тоже был замедлен, поэтому я удаляю его, потому что вокруг, очевидно, слишком много глупых людей. – ofrommel

3

У вас должно быть запрос база данных. Попробуйте это:

$registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 

if ($mysqli->query($registerquery)) 
{ 
    // success. 
} 
else 
{ 
    // failed. 
} 

Вот документация: http://php.net/manual/en/mysqli.query.php

1

Формально, Вы должны сделать что-то вроде этого:

if(isset($_POST['cre'])){ 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $mysqli = new mysqli('localhost','admin1', 'password1','obsidian') or die('Failed to connect to DB' . $mysqli->error); 

    $hashed_password = password_hash($password,PASSWORD_DEFAULT); 

    $registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 
    $stmt=$mysqli->prepare($registerquery); 
    if($stmt->execute()) 
    { 
     echo "<h1>Success</h1>"; 
     echo "<p>Your account was successfully created. Please <a href=\"index.php\">click here to login</a>.</p>"; 
    } 
    else 
    { 
     echo "<h1>Error</h1>"; 
     echo "<p>Sorry, your registration failed. Please go back and try again.</p>";  
    }  
    $stmt->close(); 
} 

Кроме того, вы могли бы назвать только mysqli_query

if($mysqli->query($registerquery)){ 
.... 
} 

Было бы достаточно. Первый вызов лучше, если вам нужно связать параметры и сделать несколько вызовов одного и того же запроса с разными значениями.

Regards.-

Смежные вопросы