2016-09-05 6 views
1

У меня есть пользовательская форма ввода (HTML), которая должна принимать информацию и вставлять ее в базу данных MySQL через PHP. PHP, по-видимому, выполняет и отгоняет «Ваша регистрация успешно завершена». Запись создается в базе данных, но столбцы пустые (я удалил свой сервер, базу данных и пароль из кода PHP).PHP/MySQL создает пустую запись в базе данных

HTML:

<!DOCTYPE html> 

<head> 

<link rel="stylesheet" type="text/css" href="css/styles.css"> 
<title>User Portal</title> 

</head> 

    <div class="inputContainer"> 

     <header> 
      User Information Portal 
     </header> 

      <form action="php/userPost.php" method="post"> 

       <label for=firstName">First Name</label> 
       <input type="text" id=firstName" name="fname"> 

       <br><br> 

       <label for="lastName">Last Name</label> 
       <input type="text" id="lastName" name="lname"> 

       <br><br> 

       <label for="eMail">Email</label> 
       <input type="text" id="eMail" name="email"> 

       <br><br> 

       <label class="labelRole" for="userRole">Role -</label><br> 
       <input type="radio" id="userRole" name="role" value="Instructor"> Instructor 

       <input class="submitButton" type="submit" name="submit" value="Register"> 

      </form> 

    </div> 
    </body> 

PHP:

<?php 

$sname = "server-name"; 
$uname = "username"; 
$pword = "password"; 
$dbname = "web_tech_test"; 
$conn = new mysqli($sname, $uname, $pword, $dbname); 



if ($conn->connect_error) { 
    die("Connection failure: " . $conn->connect_error); 
} 

$fname = !empty($_POST['firstName']); 
$lname = !empty($_POST['lastName']); 
$email = !empty($_POST['eMail']); 
$role = isset($_POST['userRole']); 


$sql = "INSERT INTO users (first_name, last_name, email, role) 
VALUES ('$fname', '$lname', '$email', '$role')"; 

if ($conn->query($sql) === TRUE) { 
    echo "Your registration has completed successfully"; 
} else { 
    echo "Error: " . $sql . "<br>" . $conn->error; 
} 

$conn->close(); 

?> 

Это создает новую запись в БД, но все столбцы являются пустыми. Любые идеи, почему это может произойти?

+0

** ПРЕДУПРЕЖДЕНИЕ ** При использовании 'mysqli' вы должны использовать [параметризованные запросы] (HTTP: // PHP. net/manual/en/mysqli.quickstart.prepared-statements.php) и ['bind_param'] (http://php.net/manual/en/mysqli-stmt.bind-param.php), чтобы добавить данные пользователя в Ваш запрос. ** НЕ используйте ** интерполирование строк или конкатенацию для выполнения этого, потому что вы создали серьезную [SQL-инъекцию] (http://bobby-tables.com/). ** НИКОГДА не ставьте данные '$ _POST' или' $ _GET' непосредственно в запрос, это может быть очень вредно, если кто-то пытается использовать вашу ошибку. – tadman

ответ

3
$fname = !empty($_POST['firstName']); 
$lname = !empty($_POST['lastName']); 
$email = !empty($_POST['eMail']); 
$role = isset($_POST['userRole']); 

этот код возвращает логическое значение, а не значение строки ...

Используйте! Пустой() только для проверки

например

if(empty($_POST['eMail'])) { 
    die("Email cannot be empty"); 
} 
+0

Это важное замечание, но не решение. – tadman

+0

Он просто хочет идеологии о том, почему, но я редактирую свой пост –

+0

Я думаю, вы имеете в виду 'if (empty (...))', потому что прямо сейчас он жалуется на противоположную вещь. – tadman

1

Вы смущать идентификаторы и теги имен на входах. Теги имен - те, которые будут отправлены в виде ключей к вашему серверу.

Попробуйте это в вашем сервере PHP скрипта после отправки формы, чтобы увидеть, какой ключ/значение фактически полученным сервер:

var_dump($_POST); 

Кроме того, если вы хотите, чтобы проверить, что все поля были заполнены, используйте что-то подобное:

if (empty($_POST['firstName'])) { 
    die("firstname is empty!"); 
} 

В вашем текущем примере вы фактически сохраняете логические переменные.

И последнее, но не менее важное: никогда не вставлять переменные из потенциально опасного источника (например, пользовательского ввода) непосредственно в ваш SQL. Использование PDO: http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers для этого

Полного примера кода, чтобы вы начали:

//prepare your values 
if (empty($_POST['fname']) || empty($_POST['lname']|| empty($_POST['email']|| !isset($_POST['role'])) { 
    die ("some values were empty or not set"); 
} 

//prepare your database 
$db = new PDO('mysql:host=server-name;dbname=web_tech_test;charset=utf8mb4', 'username', 'password'); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //throw an exception if there is an error 

//create your query 
$stmt = $db->prepare("INSERT INTO users (first_name, last_name, email, role) VALUES (:first_name,:last_name,:email,:role)"); //create a query statement 
$stmt->bindValue(":first_name", $firstName); //put your values into your statement 
$stmt->bindValue(":last_name", $lastName); 
$stmt->bindValue(":email", $email); 
$stmt->bindValue(":role", $role); 

if ($stmt->execute()) { //execute the query 
    echo "Your registration has completed successfully"; 
} else { 
    echo "Error :("; 
} 
+0

Я попытался использовать имя = "" из HTML, который теперь $ fname =! Empty ($ _ POST ['fname']); и т. д. в моем PHP, но он имеет те же результаты. –

+0

Могу ли я удалить пустые() и isset() вообще? –

+0

Нет, я все равно проверю правильность ввода пользователя, позвольте мне сделать полный пример кода –

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