2015-07-09 5 views
0

Итак, это скрипт, который позволяет сбрасывать информацию пользователя в базу данных с помощью драйвера PDO. Всякий раз, когда я запускаю скрипт с уникальным именем пользователя, он работает, и он сбрасывает информацию. Но если пользователь с тем же именем пользователя пытается зарегистрироваться, он должен выбросить ошибку. Я использую $ stmt-> errorCode() == 23000 для проверки дубликатов в базе данных, но всякий раз, когда я пытаюсь зарегистрировать имя пользователя, которое я уже зарегистрировал, я просто получаю пустой белый экран. Я пропустил скрипт с помощью xDebug, и, похоже, когда я пытаюсь зарегистрироваться с именем пользователя, которое уже находится в базе данных, оно даже не попадает в операторы if/else в нижней части скрипта. Он просто выполняет и бросает пустой белый экран.User Register DB Issue

EDIT: У меня есть поле имени пользователя в БД, установленное в 'unique'.

Видео Xdebug пошаговом: http://screencast.com/t/znZfMgV2

Любые идеи?

// create a salt using the current timestamp 
$salt = time(); 

// encrypt the password and salt 
$password = sha1($password.$salt); 

// prepare the sql statement 
$sql = 'INSERT INTO users (created, username, salt, password) VALUES(now(), :username, :salt, :password)'; 
$stmt = $conn->prepare($sql); 
// bind the parameters 
$stmt->bindParam(':username', $username, PDO::PARAM_STR); 
$stmt->bindParam(':salt', $salt, PDO::PARAM_INT); 
$stmt->bindParam(':password', $password, PDO::PARAM_STR); 
$stmt->execute(); 

if ($stmt->rowCount() == 1) { 
    $registerResult = "$username has been registered. You may now log in."; 
} elseif ($stmt->errorCode() == 23000) { 
    $registerResult = "$username is already in use. Please choose another username."; 
} else { 
    $registerResult = 'Sorry, there was a problem with the database'; 
} 

ответ

1

Проверка errorcodes не будет работать, потому что дубликат ошибки будет сгенерировано исключение при вызове execute().

Вы должны поймать PDOException:

try { 
    // create a salt using the current timestamp 
    $salt = time(); 

    // encrypt the password and salt 
    $password = sha1($password.$salt); 

    // prepare the sql statement 
    $sql = 'INSERT INTO users (created, username, salt, password) VALUES(now(), :username, :salt, :password)'; 
    $stmt = $conn->prepare($sql); 
    // bind the parameters 
    $stmt->bindParam(':username', $username, PDO::PARAM_STR); 
    $stmt->bindParam(':salt', $salt, PDO::PARAM_INT); 
    $stmt->bindParam(':password', $password, PDO::PARAM_STR); 
    $stmt->execute(); 

    if ($stmt->rowCount() == 1) { 
     $registerResult = "$username has been registered. You may now log in."; 
    } 
} catch (PDOException $e) { 
    if ($stmt->errorCode() == 23000) { 
     $registerResult = "$username is already in use. Please choose another username."; 
    } else { 
     $registerResult = 'Sorry, there was a problem with the database'; 
    } 
    die($e->getMessage()); 
} 

Убедитесь, что соединение установлено, чтобы бросить исключение, конечно:

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
+0

Да, у меня есть установленные в моей функции конфигурации ошибок. С решением, которое вы предоставили, оно действительно работает, но оно вызывает ошибку SQL «SQLSTATE [23000]: нарушение ограничений целостности: 1062 Дублирующая запись« Futanical »для ключевого« имя пользователя » Мне нужно, чтобы проверить дублирование и если есть дубликат дампа, ошибка в переменной $ registerResult. –

+0

Итак, в чем проблема, просто выгрузите его в свою переменную '$ registerResult = $ e-> getMessage();' – meda

+0

Derp. Извините, мозг пердит. Ваше решение отлично работало! Благодаря! –

0

отключены PHP ошибки? (Пустая страница заставляет меня думать так) Если да, то попробуйте вставить

error_reporting(-1); 
ini_set('display_errors', 'On'); 

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

(Не используйте на живом сервере, хотя, очевидно)

+0

Да, у меня есть сообщения об ошибках. –