es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener el error de duplicado de MYSQL para varias columnas únicas

Estoy tratando de obtener el mensaje de error o el código de mi consulta SQL. Actualmente, tengo mi método de esta manera en un archivo de clase:

public function createNew()
{
    $query = "INSERT INTO " . $this->table_name . " SET userId = ?, email = ?, data1 = ?";
    $obj = $this->conn->prepare($query);
    $this->userId = htmlspecialchars(strip_tags($this->userId));
    $this->email = htmlspecialchars(strip_tags($this->email));
    $this->data1 = htmlspecialchars(strip_tags($this->data1));
    $obj->bind_param("sss", $this->userId, $this->email, $this->data1);
    if ($obj->execute()) {return true;}
    return false;
}

Y aquí está el archivo PHP:

if ($_SERVER['REQUEST_METHOD'] === "POST") {
    $data = json_decode(file_get_contents("php://input"));

    $users->userId = $data->userId;
    $users->email = $data->email;
    $users->data1 = $data->data1;
    if ($users->createNew()) {
        http_response_code(200);
        echo json_encode(array(
            "status" => 200,
            "message" => "Éxito"
        ));
    } else {
        http_response_code(200);
        echo json_encode(array(
            "status" => 500,
            "message" => "Falló"
        ));
    }
}

El código funciona correctamente, pero cuando se inserta un valor duplicado para el email o userId, obtengo el mensaje de error “Falló”. Lo que quiero es que el mensaje de error especifique si el userId ya existe o si el email ya existe en lugar de devolver siempre “Falló”. Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener un mensaje de error específico para valores duplicados en el método createNew(), puedes usar las funciones de manejo de errores de mysqli para verificar si se produce un error de clave duplicada después de ejecutar la consulta. Aquí tienes una versión actualizada del método createNew():

    public function createNew()
    {
        $query = "INSERT INTO " . $this->table_name . " SET userId = ?, email = ?, data1 = ?";
    
        $obj = $this->conn->prepare($query);
        $this->userId = htmlspecialchars(strip_tags($this->userId));
        $this->email = htmlspecialchars(strip_tags($this->email));
        $this->data1 = htmlspecialchars(strip_tags($this->data1));
        $obj->bind_param("sss", $this->userId, $this->email, $this->data1);
        if ($obj->execute()) {
            return true;
        } else {
            $error_code = $obj->errno;
            if ($error_code == 1062) {
                $error_message = $obj->error;
                if (strpos($error_message, 'userId') !== false) {
                    throw new Exception('userId ya existe');
                } else if (strpos($error_message, 'email') !== false) {
                    throw new Exception('email ya existe');
                }
            }
            throw new Exception('Error');
        }
    }
    

    Este código verifica si se produce un error de clave duplicada (errno 1062) después de ejecutar la consulta. Si se produce ese error, verifica el mensaje de error para ver en qué columna se encontró el valor duplicado y lanza una Exception específica con el mensaje de error correspondiente. Si el error no es un error de clave duplicada o el mensaje de error no es reconocible, lanza una Exception genérica con el mensaje “Error”.

    En tu archivo PHP, puedes capturar la Exception y devolver la respuesta apropiada:

    if ($_SERVER['REQUEST_METHOD'] === "POST") {
        $data = json_decode(file_get_contents("php://input"));
    
        $users->userId = $data->userId;
        $users->email = $data->email;
        $users->data1 = $data->data1;
        try {
            if ($users->createNew()) {
                http_response_code(200);
                echo json_encode(array(
                    "status" => 200,
                    "message" => "Éxito"
                ));
            }
        } catch (Exception $e) {
            http_response_code(200);
            echo json_encode(array(
                "status" => 500,
                "message" => $e->getMessage()
            ));
        }
    }
    

    Este código captura la Exception lanzada por el método createNew() y devuelve el mensaje de error apropiado en la respuesta.

Comments are closed.