我有一个很简单的问题。
是否有办法将数据库错误与格式良好的警告联系起来?
我的意思是,例如一个用户在一个网站注册,他/她选择的用户名已经被采取,所以当保存到数据库时,发生以下错误:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'peter' for key 'username'
我真的不想把这个显示给用户,而是像这样:"选择的用户名已被占用"
识别错误并输出格式良好的警告的最佳方法是什么?
Thanks in advance
首先执行一个select查询来检查用户名是否已被占用。只有当它不是,你才插入它。
理想情况下,您可以锁定表,或者使用事务,但实际上,如果两个查询离彼此很近,则可能可以
您可以先检查用户名是否被占用:
$num_rows_aff = SELECT * FROM table where username = 'peter';
If($num_rows_aff > 0)
{
// Username exists, Output "Username is taken";
}else{
// Insert username into database
}
您可以尝试编写一些基本的数据库函数,如exists()等,您可以传递一个自定义的错误字符串。像这样:
<?php
class DB {
private $_instance;
public function __construct() {
$this->_instance = new MySQLI('server','username','password','database');
}
public function exists($sql, $msg) {
$result = $this->_instance->query($sql);
if ($result->num_rows > 0) {
throw new FrontDBException($msg);
}
return false;
}
}
class FrontDBException extends Exception {
public function __toString() {
echo($this->getMessage());
}
}
$db = new DB();
try {
$db->exists('SELECT id FROM users WHERE username="' . $username . "'",
'Username is already taken.');
} catch(FrontDBException $e) {
echo($e);
}
?>
但是你不能真正预测传入的错误,当你只是做基本的查询时,你需要把它包装在特定的函数中