On Jul 12, 2004, at 9:53 AM, Benjamin Smith wrote:

I'm writing an intranet app in PHP, and having issues around constraints.
Specifically, the error messages coming back from PG aren't very user
friendly. I'm looking for a way to make this a bit more smooth to the end
user, and ensure that my conditional checks really do match the requirements
set forth in the database.


For example, given a check constraint called "check_productcode" is it
possible to test a value against that constraint alone, without attempting to
insert anything?


I did something like this in one iteration of an app I was running. I wanted user names to be at least 6 characters long, so I made this function:

create or replace function
    domain_username_constraint_check (text)
    returns boolean as '
    select
        case
            when (length($1) >= 6) then true
            else false
        end
    ;
    ' language 'sql';

Then, I defined my username domain like this:

create domain username as
         text
        check (domain_username_constraint_check(value));


The PHP code could check the validity of the username without trying to insert by calling a simple SQL select :
$user = pg_escape_string($user);
$sql = "select domain_username_constraint_check($user);";


And checking whether the result is true or false.

Of course you could make the constraint check more complex.

In your case, I suspect you'd want to have valid product codes stored in the db. You could have an SQL function along the lines of

create function is_valid_product_code(
        text -- product code to be tested
        ) returns boolean
        language sql as '
        select count(*) = 1
        from product_codes
        where product_code = $1;
        ';

This assumes you have a table product_codes that has a unique product codes (such as a primary key). If product codes aren't unique in the table (though I'd think a good db design would have such a table somewhere), you can change count(*) = 1 to count(*) > 0.

Again, a simple select is_valid_product_code($product_code) should return true or false which can be called in your PHP code.

Does this help?

Michael Glaesemann
grzm myrealbox com


---------------------------(end of broadcast)--------------------------- TIP 6: Have you searched our list archives?

http://archives.postgresql.org

Reply via email to