Php rowCount返回0,即使它不应该返回

Php rowCount返回0,即使它不应该返回,php,mysql,pdo,Php,Mysql,Pdo,将帖子信息发送到我的newuser函数,它会在那里的第一位代码上停止。有什么想法吗?与其插入用户,然后在采取措施后回滚,不如测试该用户是否可用(锁定表后),然后自信地进行插入。+1获取信息和PDO。您的数据库结构是什么?您是否在查看实际请求回显在数据库查询中尝试之前,请先回显完整请求。如何回显完整请求?我做了一个debugDumpParams,并在Return中得到了SQL:[41]插入到用户(uname)值(:uname)参数:1键:名称:[6]:uname参数=-1名称=[6]“:uname

将帖子信息发送到我的newuser函数,它会在那里的第一位代码上停止。有什么想法吗?

与其插入用户,然后在采取措施后回滚,不如测试该用户是否可用(锁定表后),然后自信地进行插入。

+1获取信息和PDO。您的数据库结构是什么?您是否在查看实际请求<代码>回显在数据库查询中尝试之前,请先回显完整请求。如何回显完整请求?我做了一个debugDumpParams,并在Return中得到了
SQL:[41]插入到用户(uname)值(:uname)参数:1键:名称:[6]:uname参数=-1名称=[6]“:uname”是参数=1参数类型=2
,完全没有看到数据库结构注释<代码>uid int(PK)、uname varchar(15)、pwd varchar(300)、fname、lname、address等。将uname作为唯一索引,但出于测试目的将其删除。我不知道他为什么要进行回滚。显然,如果
rowCount==0
,这意味着
插入失败,这也意味着他必须键入用户名(使其唯一)。因此,如果插入失败,为什么要回滚呢?此外,我不确定表锁定在这种情况下是否有益,也不确定是否进行事务。对单个
插入使用事务似乎没有任何意义。回滚要养成在以后的风险投资中这样做的习惯,在这种情况下它不会起任何作用,是的。锁定表以确保安全。您不需要在此处锁定表,因为如果表中存在另一个用户名,您的
插入将失败。如果另一个线程在该线程前1纳秒使用相同的用户名执行
INSERT
,那么您仍然希望该查询失败(它会失败)。除非有必要,否则不应锁定该表。
$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.');
}
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!";
  }  
}