2014-01-28 8 views
1

У меня есть этот код:пользователь уже принят?

$username = $_POST["username"]; 
$password_input = $_POST["password"]; 
$password = md5($password_input); 
$email_input = $_POST["emailaddress"]; 
$email = md5($email_input); 

if (!($stmt = $con->prepare("INSERT INTO `users` (`username`,`password`,`email_address`) VALUES (?,?,?)")) || !is_object($stmt)) { 
    die("Error preparing: (" .$con->errno . ") " . $con->error); 
} 
$stmt->bind_param('sss', $username, $password, $email); 
$stmt->execute(); 
$stmt->close(); 
echo "User has been Created! Feel free to login - <a href='login.php'><span class='button color_blue'>Login</span></a>"; 

в базе данных SQL по электронной почте/имя пользователя может быть использован только один раз (UNIQUE), и я задавался вопросом, есть ли способ изменить эхо появляться только тогда, когда данные были успешно добавлено, а затем другое сообщение, если оно не было успешным.

Спасибо, я все еще новобранец!

EDIT: поэтому после использования какой-то код из ответа я сейчас нахожусь на:

$username = $_POST["username"]; 
$password_input = $_POST["password"]; 
$password = md5($password_input); 
$email_input = $_POST["emailaddress"]; 
$email = md5($email_input); 

if (!($stmt = $con->prepare("INSERT INTO `users` (`username`,`password`,`email_address`) VALUES (?,?,?)")) || !is_object($stmt)) {die("Error preparing: (" .$con->errno . ") " . $con->error);} 
$stmt->bind_param('sss', $username, $password, $email); 
$stmt->execute(); 
$stmt->close(); 
if ($con->affected_rows == 1) {echo "User has been Created! Feel free to login - <a href='login.php'><span class='button color_blue'>Login</span></a>";} 
var_dump($con->affected_rows); 

успешных и неуспешных INSERTS почему-то все есть -1, как их «изменяемых строк» ​​выход

+2

проверить, что касается метода связанных строк. –

+0

Посмотрите на Security.SE для лучших практик в отношении паролей, но короткая заметка заключается в том, что MD5 - это шутка. Предполагая, что вы не хотите разрешать слишком похожие имена/электронные письма, вам нужно сделать [канонизацию Unicode до попытки проверить наличие] (http://labs.spotify.com/2013/06/18/creative-usernames /).Почему вы хешируете электронные письма - люди могут не восстанавливать свои учетные записи? Черт, как вы планируете известить их о чем-либо (например, о нарушении пароля)? –

+0

@ clockwork-muse Я был хешированием писем, пока я тестировал incase Мне нужно было дать ссылку людям – Night

ответ

1

Метод Execute() возвращает истину в случае успеха.

Заменить:

$stmt->execute(); 

с:

if($stmt->execute()) { 
    echo "user created!"; 
} else { 
    echo "error: " . $stmt->error; 
} 
+1

Я бы не показал фактическую ошибку mysql для пользователя, если они попытаются вставить имя пользователя, которое уже существует –

+0

Согласовано, конечно, не в производстве, но подумало, что это может помочь во время разработки/тестирования :) – flauntster

0

Чтобы проверить успешный запрос UPDATE/INSERT/DELETE, вам нужно будет проверить, больше ли возвращенных строк с возвратом.

http://php.net/mysqli_affected_rows

Возвращает количество строк, затронутых в последнем INSERT, UPDATE REPLACE или DELETE запроса.

В вашем случае:

if ($con->affected_rows == 1) { 
    echo "User has been Created! Feel free to login - <a href='login.php'><span class='button color_blue'>Login</span></a>"; 
} 
+0

Это кажется хорошей идеей, но это не работает:/Может быть, я должен заменить «== 1» на " > = 0 ", чтобы убедиться, что это не код? – Night

+0

просто '>', потому что '> = 0' отобразит' созданный пользователь', даже если будут затронуты строки '0'. Но я думаю, что это было потому, что я написал '$ conn', и ваш объект был' $ con'. Просто убедитесь, что это ваш объект mysqli и user affected_rows thourgh его –

+0

Хорошая точка, я проверил дважды – Night

-1

Вы можете использовать mysqli_stmt::affected_rows, чтобы выяснить, были затронуты строки. Если нет, то вы можете распечатать ваше сообщение об ошибке

0

Да, вы просто должны проверить, если запрос был успешным или нет:

изменить конец кода этим:

$success = $stmt->execute(); 
$stmt->close(); 
if ($success) 
    echo "User has been Created! Feel free to login - <a href='login.php'><span class='button color_blue'>Login</span></a>"; 
else 
    echo "Impossible to create that user: ".$stmt->error; 
0

Для Предоставлять множество разных сообщений, с которыми я работаю с флагами. Просто скажите: если имя пользователя равно существующему имени db, userExistMsg = 1. Чтобы проверить, существует ли Пользователь, просто используйте запрос SELECT в sql и попросите какие-либо записи для данного пользователя. Этот запрос не должен приводить к отсутствию обектов, если имя пользователя является бесплатным.

КПП. Кажется, вы используете простой md5 для кодирования pw. Это не верно. Лучше использовать что-то вроде соленых паролей.

0

Попробуйте это. Это образец ответа, который изменит это в соответствии с вашим кодом.

 $username = $_POST["username"]; 
     $password_input = $_POST["password"]; 
     $password = md5($password_input); 
     $email_input = $_POST["emailaddress"]; 
     $email = md5($email_input); 

     $con=mysqli_connect("HOST","USER","PASSWORD","your_db"); 
     // Check connection 
     if (mysqli_connect_errno()) 
      { 
      echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
      } 

     $result = mysqli_query($con,"SELECT COUNT(username) FROM users WHERE username = $username "); 

     $datacount2 = mysql_num_rows($result); 
     if($datacount2 < 1) 
     { 
     if (!($stmt = $con->prepare("INSERT INTO `users` (`username`,`password`,`email_address`) VALUES (?,?,?)")) || !is_object($stmt)) { 
      die("Error preparing: (" .$con->errno . ") " . $con->error); 
     } 
     $stmt->bind_param('sss', $username, $password, $email); 
     $stmt->execute(); 
     $stmt->close(); 

    if($stmt) 
    { 
     echo "User has been Created! Feel free to login - <a href='login.php'><span class='button color_blue'>Login</span></a>"; 
     } 
     else 
    { 
    echo "Insert Failed"; 
    } 
     } 

     else 
     { 
     echo "User already exists.."; 
     } 
+0

Почти работает, по какой-то причине он все еще говорит «пользователь уже существует ", когда INSERT успешна: s – Night

+0

Извините за ошибку .. Я редактирую код if ($ result> 0) должен быть ** if ($ result <1) ** или ** if ($ result == 0) ** – tarzanbappa

+0

На этот раз ошибка заключается в том, что независимо от того, успешна ли ** INSERT или нет - она ​​по-прежнему дает сообщение «созданное пользователем» ** ^^ ' – Night

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