我不知道如何为电子邮件和用户名已经存在得到2个独立的错误信息。我想让它给出准确的错误信息,所以如果电子邮件已经存在,它只会说 "电子邮件已经存在,请选择另一个!"而不是 "用户名或电子邮件已经存在,请选择另一个!"
if ($stmt = $con->prepare('SELECT id, password FROM accounts WHERE username = ? OR email = ?')) {
$stmt->bind_param('ss', $_POST['username'], $_POST['email']);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
// Username already exists
echo 'Username or email already exists, please choose another!';
} else {
// Insert the new account
..
首先,如果你想检查一行是否存在于数据库中,你不需要获取数据,你可以简单地获取 COUNT(*)
. 然而,就你的情况而言,这其实是让你向你想要达到的目标前进了一步。
$stmt = $con->prepare('SELECT username, email FROM accounts WHERE username = ? OR email = ?');
$stmt->bind_param('ss', $_POST['username'], $_POST['email']);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
if ($row['username'] === $_POST['username']) {
// Username already exists
echo 'Username already exists, please choose another!';
} elseif ($row['email'] === $_POST['email']) {
// Email already exists
echo 'Email already exists, please choose another!';
}
}
顺便说一句,请不要把自己包裹在 prepare()
中的方法调用 if
语句。你应该启用适当的错误报告。如何在MySQLi中获取错误信息?
如果你想把这段代码转换成PDO,那就是另一回事了。你不能把这两个API混在一起。
关于DB的一切重要的东西@Dharman都已经说过了,这段代码是基于Dharman的代码,但用另一种方法来做同样的事情与实际的错误信息。
我的方法要求输入字段的名字和db字段的名字相同。例如 <input name="email>
要求 电子邮件 领域中的db。<input name="username">
需要 帐号 字段等。
如果你想显示所有的消息。
$stmt = $con->prepare('SELECT username, email FROM accounts
WHERE username = ? OR email = ?');
$stmt->bind_param('ss', $_POST['username'], $_POST['email']);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
$errors = array_intersect($_POST,$row);
foreach($errors as $key=>$item) {
echo "$key already exists, please choose another<br>";
}
}
如果你只想显示其中一条消息(第一条), 你可以简单地在循环中做一个中断... ...
$stmt = $con->prepare('SELECT username, email FROM accounts
WHERE username = ? OR email = ?');
$stmt->bind_param('ss', $_POST['username'], $_POST['email']);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
$errors = array_intersect($_POST,$row);
foreach($errors as $key=>$item) {
echo "$key already exists, please choose another<br>";
break;
}
}
...或者只是获取数组$errors中的第一个键。
$stmt = $con->prepare('SELECT username, email FROM accounts
WHERE username = ? OR email = ?');
$stmt->bind_param('ss', $_POST['username'], $_POST['email']);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
$errors = array_intersect($_POST,$row);
if (!empty($errors)) {
echo array_keys($errors)[0] . " already exists, please choose another";
}
}