2014-01-25 5 views
0

Проблема в том, что когда я заполняю форму, она вставляет две записи в sql, первую, которую я ввел, а вторая пустая. Я действительно не знаю, почему он добавляет второй. Я сомневаюсь в if($result), в котором я думаю, что $ result выполняется во второй раз, и именно поэтому он показывает пустую строку.Пустая строка отображается после успешного mysql INSERT

<?php 
$connection = mysql_connect("localhost", "db", "pass"); 
mysql_select_db("dbname", $connection); 
$name = mysql_real_escape_string(stripslashes($_POST['name'])); 
$email = mysql_real_escape_string(stripslashes($_POST['email'])); 
$password = mysql_real_escape_string(stripslashes($_POST['pass'])); 
$sql="INSERT INTO users VALUES('$name','$email','$password')"; 
$result = mysql_query($sql); 

if($result) { 
echo '{"success":1}'; 
} else { 
echo '{"success":0,"error_message":"Sorry, your registration failed. Please go back and try again."}'; 
} 

?> 
+2

Обязательное предложение, [** Не использовать 'mysql_ *' функции в новом коде **] (http://bit.ly/phpmsql). Они больше не поддерживаются [и официально устарели] (http://j.mp/XqV7Lp). См. [** красное поле **] (http://j.mp/Te9zIL)? Узнайте о [* подготовленных операторах *] (http://j.mp/T9hLWi) и используйте [PDO] (http://php.net/pdo) или [MySQLi] (http://php.net/ mysqli) - [эта статья] (http://j.mp/QEx8IB) поможет вам решить, какой из них. Если вы выберете PDO, [здесь хороший учебник] (http://j.mp/PoWehJ). –

+0

Хранение паролей в текстовом виде является определенным «no-no» –

+3

Опубликуйте свою схему БД. Если у вас есть одноименные столбцы, тогда вам лучше использовать их, а не просто «INSERT INTO users». Т.е.: 'INSERT INTO users (имя, адрес электронной почты, пароль)' Это как ** «Я возьму эти 3 шара и выброшу их в любом месте, надеясь, что они попадут в правильные отверстия». ** –

ответ

-1

Если таблица базы данных содержит более 3 столбцов, например идентификатор, имя, электронную почту, пароль, то вы должны указать, какие столбцы вы хотите, чтобы вставить значения в.

"INSERT INTO users (name, email, password) VALUES (:name, :email, :pass);" 

Хотя делать это не будет вызывать двойные вставки строки, так что вы должны будете сложной о том, как вы отправляете эти значения в этом файле. Вы случайно используете jQuery для POST значений, но не возвращаете false или не препятствуете действию по умолчанию в форме? (Выведено из ответа JSON)

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

Также обратите внимание на другие ответы о безопасности, если вы намерены ввести свой код в эксплуатацию.

+0

Я НЕ сделал это, но ваш ответ неверен из-за котировок вокруг имен столбцов. Либо никаких кавычек, либо еще лучше, используйте обратные ссылки. –

+1

Вы правы. – VikingBlooded

+0

Несмотря на плохой ответ, как это помогает OP без объяснения причин. Кроме того, что отличается от SQL-кода OPs? Вам не нужно указывать столбцы –

0

Почему вы используете strip_slashes()?

mysql_real_escape_string() достаточно. Хотя, конечно, подготовленные заявления с использованием PDO - это современный, более безопасный способ делать что-то.

Я также предлагаю вам использовать:

if($result !== false) вместо if($result), чтобы быть уверенным, что вы получаете положительный результат.

Вы можете публиковать ваши полные результаты для запроса "SHOW CREATE TABLE [table_name]", чтобы мы могли видеть вашу структуру таблицы?

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

function securePassword($plain_text_pw) { 
    $salt = 'jklolomfg99'; 
    $salted_password = $salt . $password; 
    $hashed_pw = md5($hashed_pw); 
    return $hashed_pw; 
} 


function checkPassword($username,$plain_text_pw) { 
    $secure_pw = securePassword($plain_text_pw); 
    // query would look something like this: 
    // $sql = "SELECT `id` FROM `users` WHERE `name` = "' . $username . '" 
    // AND `secure_password` = "' . $secure_password . '"'; 
    // if no results, then return false. If 1 result, return true. log user in. 
} 

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

2

Не знаете, почему он добавляет пустой ряд. Может ли форма быть отправлена ​​дважды?

Здесь вы можете сделать немного, чтобы улучшить безопасность.

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

  • проверки поле не является пустым
  • убедитесь, что поле адреса электронной почты содержит действительный адрес электронной почты

Также вы не должны добавлять пароль прямо в БД. Хранение паролей в их первоначальной форме - очень плохая практика. Сначала вы должны добавить «соль», которая является ключом, известным только вашему приложению (т. Е. Любая случайная строка «dwewsd2r23345wfsdf»), а затем все это делает. Это сделает жизнь немного сложнее для любых хакеров, которым удастся получить доступ к вашей БД.See here for more on password hashing

Наконец, вы должны использовать PDO вместо функций mysql для запросов к базе данных. Если вы используете подготовленные инструкции, которые добавят еще один уровень безопасности. See here for more on PDO.

+0

Хороший звонок по паролю + соль -> хеш -> хранить в дБ. –

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