Все важное о БД @Dharman уже сказал, и этот код основан на коде Дхармана, но с другим подходом для выполнения того же самого с фактическими сообщениями об ошибках.
Мой подход требует, чтобы поле ввода name совпадает с именем db-fields, например, <input name="email>
требует email field в db, <input name="username">
требует username field in db et c.
Если вы хотите показать все сообщения:
$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>";
}
}
Если вы просто хотите показать одно из сообщений (первое), вы можете просто сделать разрыв в l oop ...
$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";
}
}