2013-02-27 3 views
3
$this->db->beginTransaction(); 
$this->db->query ('LOCK TABLES users WRITE'); 
$sql = 'INSERT INTO users (uname) VALUES (:uname)'; 
$sth = $this->db->prepare ($sql); 
$sth->bindParam (':uname', $uname); 
$sth->execute(); 
if ($sth->rowCount()==0) { 
    $this->db->rollBack(); 
    $this->db->query ('UNLOCK TABLES'); 
    throw new Exception('<strong>Oh snap!</strong> User name is taken! Try again.'); 
} 

Я настроил пользователя в моей базе данных вручную, что называется «тест». И когда я создал пользователя под названием «test2», он работал. Но всякий раз, когда я пытаюсь создать третьего пользователя, я получаю rowCount = 0.rowCount возвращает 0, даже если он не должен

uname in db is varchar(15).

if(isset($_POST['regUser']) && isset($_POST['regPwd']) && isset($_POST['regConfirmPwd'])) { 
    if($_POST['regPwd'] == $_POST['regConfirmPwd']) { 
     $user->newUser($_POST['regUser'], $_POST['regPwd']); 

} else { 
    $user->error = "<strong>Oh snap!</strong> The passwords don't match!"; 
    } 
} 

Отправить информацию о сообщении моей функции newuser, и она останавливается на первом бите кода. Есть идеи?

+0

+1 для информации и PDO. – L0j1k

+0

Какая у вас структура? – crush

+0

Вы ищете фактический запрос? 'echo' ваш полный запрос перед тем, как попробовать его в запросе в базе данных. – L0j1k

ответ

1

Вместо того, чтобы вставлять пользователя и затем откидываться назад, если его принять, может быть лучше проверить, доступен ли этот пользователь (после блокировки таблицы), а затем с уверенностью делать вставку.

+0

Я не уверен, почему он делает откат вообще. Ясно, что если 'rowCount == 0', это означает, что' INSERT' потерпел неудачу, что также означает, что он должен вводить имя пользователя (что делает его уникальным). Поэтому, если 'INSERT' не удалось, почему' rollBack() 'вообще? Кроме того, я не уверен, что блокировка таблицы выгодна в этой ситуации и не делает транзакции. Использование транзакции для одного «INSERT», похоже, не имеет никакого смысла. – crush

+0

отката, чтобы привыкнуть делать это для последующих предприятий, он ничего не делает в этом случае, да. Блокировка столов для обеспечения безопасности. – Fumler

+0

Здесь нет необходимости блокировать таблицу, потому что ваш 'INSERT' предназначен для отказа, если в таблице существует другое имя пользователя. Если другой поток выполняет «INSERT» с тем же именем пользователя на 1 наносекунду перед этим потоком, вы все равно хотите, чтобы этот запрос завершился неудачно (и он будет). Вы не должны «ЗАБЛОКИРОВАТЬ» таблицу, если это вам не понадобится. – crush

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