电子邮件或用户名已经存在的分割错误信息

问题描述 投票:0回答:1

我不知道如何为电子邮件和用户名已经存在得到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
        ..
php pdo
1个回答
3
投票

首先,如果你想检查一行是否存在于数据库中,你不需要获取数据,你可以简单地获取 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混在一起。


0
投票

关于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";
    }        
}
© www.soinside.com 2019 - 2024. All rights reserved.