今天coding的时候,遇到了一个问题,直接贴代码:
$db_obj = db_conn::getDbinstance()->getDbConn();
//插入
$sql_reg = "insert into user (username, password, nickname, email,regdate) values (?,?,?,?,?)";
if ( $stmt = $db_obj->prepare($sql_reg) ){
$stmt->bind_param('ssssd',$username,$pswd,$nickname,$email,$reg_time);
if ( !$stmt->execute() ) {
exit("0");//插入失败,用户名重复
}
$stmt->close();
}else{
exit(“11”);//数据库操作预编译失败
}
$db_obj = db_conn::getDbinstance()->getDbConn();
$sql_check_username = "select password from user where username = ?";
if ( $result = $db_obj->prepare($sql_check_username) ){
$result->bind_param("s",$username);
$result->execute();
$result->bind_result($t_pswd);
if( !$result->fetch() ){
exit("0");//用户名不存在
}
$result->close();
}else{
exit ("1");//数据库预编译错误
}
这个过程就是遵照着官方文档给出的mysqli实例代码来做的。但是因为需要,加上了对预编译之后,语句是否执行成功了的一个判断。插入语句,因为用户名是unique的,所以,如果执行插入语句,插入相同的用户名,会出现error。同样,在查询语句中,如果查询的username 在数据库中不存在,那么就会给出error提示。
但是,开始的时候,我把这两个判断条件全部加给了对execute函数的判断。却发现,插入操作判断正常,而查询操作用错误数据却怎么也不会跳转到execute错误的判断里去。纠结了好长时间时候,将查询的语句判断改为对fetch()的判断(如上),就运行成功了。
问题就来了,insert产生的unique属性不符合的错误跟select语句产生的不存在错误不是同一种错误吗?
暂时没有找到答案,问题先挂上。求高手解答。
插入重复的带有unique属性的column是错误。会在execute语句返回错误信息。
Returns TRUE
on success or FALSE
on failure.
但是fetch()函数从官方给出的return值还是看不明白,
select一个不存在的值,是会返回NULL还是FALSE呢?如果是NULL,那么上面代码中的!result->fetch()是代表什么呢?继续存疑。