Helpex - Trao đổi & giúp đỡ Đăng nhập
3

Tôi đang xây dựng một ứng dụng web đơn giản bằng PostgreSQL và PHP (sử dụng PDO). Tôi có một ràng buộc DUY NHẤT trên một cột và bây giờ tôi đang cố gắng tìm ra cách tốt nhất để xử lý nỗ lực chèn một bản sao vào bảng cơ sở dữ liệu đó.

Trước tiên, tôi có phải chạy câu lệnh SELECT một cách rõ ràng và kiểm tra xem giá trị mà tôi sắp chèn đã tồn tại chưa, hay tôi có thể xử lý nó bằng cách sử dụng các ngoại lệ PDO không?

Ngay bây giờ tôi đang làm

    try{
        $stmt = $pdo->prepare("INSERT INTO table (column) VALUES (?) RETURNING id;");
        $stmt->execute( array('duplicate') );
    }
    catch( PDOException $e ){
        print $e;
    } 

cái nào cho tôi

exception 'PDOException' with message 'SQLSTATE[23505]: Unique violation: 7 ERROR:  duplicate key value violates unique constraint "column"
DETAIL:  Key (column)=(duplicate) already exists.'

Tôi nghĩ rằng sẽ sạch hơn nếu chỉ có thể nhận lỗi khi nó xảy ra, thay vì kiểm tra trước nếu giá trị đã tồn tại (loại này đánh bại lợi ích của việc có ràng buộc DUY NHẤT ngay từ đầu).

Cuối cùng, tôi muốn đưa ra một thông báo lỗi thân thiện với người dùng, đại loại như "Tên người dùng đã tồn tại" .

Tôi cho rằng một cách hackish sẽ là kiểm tra chi tiết ngoại lệ và tạo thông báo lỗi thân thiện của tôi dựa trên đó, nhưng tôi có thể tin tưởng rằng các chi tiết (như SQLSTATE [23505] hoặc mã = ​​7) sẽ không thay đổi trong tương lai không?

Tôi có thể xây dựng một câu lệnh SQL tốt hơn trả về một thứ gì đó hữu ích khi lỗi ràng buộc trùng lặp (và id khi thành công, như bây giờ) không?

CHỈNH SỬA

Tạo một thủ tục được lưu trữ có thể là một giải pháp:

CREATE OR REPLACE FUNCTION my_insert(a_value text)
RETURNS text AS $$
DECLARE
 retval text;
BEGIN
    INSERT INTO table (column) VALUES (a_value) RETURNING id INTO retval;
    RETURN retval;

    EXCEPTION
        WHEN unique_violation THEN
            retval = 'duplicate';
            RETURN retval;
END;
$$ LANGUAGE plpgsql;

, sau đó kiểm tra xem giá trị trả về là 'duplicate'hay id.

Mặc dù nó không cho phép tôi sử dụng các ngoại lệ PHP để xác định điều gì đã xảy ra và tạo ra một thông báo lỗi thân thiện, nhưng nó loại bỏ sự cần thiết của một câu lệnh SELECT riêng. Vẫn chưa hoàn toàn hài lòng với giải pháp này, vì vậy nếu bạn biết về một cái gì đó thậm chí còn thanh lịch hơn ...

3 hữu ích 3 bình luận 2.8k xem chia sẻ
2

SQLSTATE được xác định trong tiêu chuẩn SQL và không có khả năng thay đổi. Không phải lúc nào họ cũng có thể tự cung cấp đủ thông tin (do đó là phần "DETAIL"), nhưng có thể được coi là đáng tin cậy.

2 hữu ích 2 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ php postgresql pdo , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading