Thinkphp Connecting PostgreSQL

Source: Internet
Author: User
Tags volatile apache log

PHP connection:

Remove the semicolon in front of extension = php_pgsql.dll in php.ini and set extension_dir to point to the ext folder under the php file.

Under normal circumstances, php can connect to postgres, but my error still occurs, prompting "Fatal error: Call to undefined function pg_connect ()", check the Apache log, "PHP Startup: Unable to load dynamic library '**** \\ PHP5 \\ ext \\ php_pdo_pgsql.dll ".

After searching, add LoadFile "*** / PHP5 / libpq.dll" to the configuration file httpd.conf in the conf folder in Apache, and the location can be behind LoadModule.

(*** is the php installation path)

 

 

The point is here: the table_msg function in thinkphp cannot be found, you need to manually create it:

Add custom function table_msg in PostgreSQL
Copy the following code to execute in the SQL manager:

CREATE OR REPLACE FUNCTION pgsql_type (a_type varchar) RETURNS varchar AS
$ BODY $
DECLARE
     v_type varchar;
BEGIN
     IF a_type = ‘int8’ THEN
          v_type: = ‘bigint’;
     ELSIF a_type = ‘int4’ THEN
          v_type: = ‘integer’;
     ELSIF a_type = ‘int2’ THEN
          v_type: = ‘smallint’;
     ELSIF a_type = ‘bpchar’ THEN
          v_type: = ‘char’;
     ELSE
          v_type: = a_type;
     END IF;
     RETURN v_type;
END;
$ BODY $
LANGUAGE PLPGSQL;

CREATE TYPE "public". "Tablestruct" AS (
  "fields_key_name" varchar (100),
  "fields_name" VARCHAR (200),
  "fields_type" VARCHAR (20),
  "fields_length" BIGINT,
  "fields_not_null" VARCHAR (10),
  "fields_default" VARCHAR (500),
  "fields_comment" VARCHAR (1000)
);

CREATE OR REPLACE FUNCTION "public". "Table_msg" (a_schema_name varchar, a_table_name varchar) RETURNS SETOF "public". "Tablestruct" AS
$ body $
DECLARE
     v_ret tablestruct;
     v_oid oid;
     v_sql varchar;
     v_rec RECORD;
     v_key varchar;
BEGIN
     SELECT
           pg_class.oid INTO v_oid
     FROM
           pg_class
           INNER JOIN pg_namespace ON (pg_class.relnamespace = pg_namespace.oid AND lower (pg_namespace.nspname) = a_schema_name)
     WHERE
           pg_class.relname = a_table_name;
     IF NOT FOUND THEN
         RETURN;
     END IF;

     v_sql = ‘
     SELECT
           pg_attribute.attname AS fields_name,
           pg_attribute.attnum AS fields_index,
           pgsql_type (pg_type.typname :: varchar) AS fields_type,
           pg_attribute.atttypmod-4 as fields_length,
           CASE WHEN pg_attribute.attnotnull THEN ‘‘ not null ’‘
           ELSE ‘‘ ‘‘ ‘
           END AS fields_not_null,
           pg_attrdef.adsrc AS fields_default,
           pg_description.description AS fields_comment
     FROM
           pg_attribute
           INNER JOIN pg_class ON pg_attribute.attrelid = pg_class.oid
           INNER JOIN pg_type ON pg_attribute.atttypid = pg_type.oid
           LEFT OUTER JOIN pg_attrdef ON pg_attrdef.adrelid = pg_class.oid AND pg_attrdef.adnum = pg_attribute.attnum
           LEFT OUTER JOIN pg_description ON pg_description.objoid = pg_class.oid AND pg_description.objsubid = pg_attribute.attnum
     WHERE
           pg_attribute.attnum> 0
           AND attisdropped <> ‘‘ t ’‘
           AND pg_class.oid = ‘|| v_oid ||‘
     ORDER BY pg_attribute.attnum ‘;

     FOR v_rec IN EXECUTE v_sql LOOP
         v_ret.fields_name = v_rec.fields_name;
         v_ret.fields_type = v_rec.fields_type;
         IF v_rec.fields_length> 0 THEN
            v_ret.fields_length: = v_rec.fields_length;
         ELSE
            v_ret.fields_length: = NULL;
         END IF;
         v_ret.fields_not_null = v_rec.fields_not_null;
         v_ret.fields_default = v_rec.fields_default;
         v_ret.fields_comment = v_rec.fields_comment;
         SELECT constraint_name INTO v_key FROM information_schema.key_column_usage WHERE table_schema = a_schema_name AND table_name = a_table_name AND column_name = v_rec.fields_name;
         IF FOUND THEN
            v_ret.fields_key_name = v_key;
         ELSE
            v_ret.fields_key_name = ‘‘;
         END IF;
         RETURN NEXT v_ret;
     END LOOP;
     RETURN;
END;
$ body $
LANGUAGE ‘plpgsql’ VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

COMMENT ON FUNCTION "public". "Table_msg" (a_schema_name varchar, a_table_name varchar)
IS ‘Get Table Information’;

--- Overload a function
CREATE OR REPLACE FUNCTION "public". "Table_msg" (a_table_name varchar) RETURNS SETOF "public". "Tablestruct" AS
$ body $
DECLARE
    v_ret tablestruct;
BEGIN
    FOR v_ret IN SELECT * FROM table_msg (‘public‘, a_table_name) LOOP
        RETURN NEXT v_ret;
    END LOOP;
    RETURN;
END;
$ body $
LANGUAGE ‘plpgsql’ VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

COMMENT ON FUNCTION "public". "Table_msg" (a_table_name varchar)
IS ‘Get Table Information’;
 

 

Modify the BUG in ThinkPHP source code
Change line 41 of ThinkPHP \ Library \ Think \ Db \ Driver \ Pgsql.class.php to:

$ result = $ this-> query ('select fields_name as "field", fields_type as "type", fields_not_null as "null", fields_key_name as "key", fields_default as "default", fields_default as "extra" from table_msg (\ ''. $ tableName. '\'); ');
That is, add a single quote before and after $ tableName, (‘. $ TableName.‘) => (\ ‘‘. $ TableName. ’\’).

 

In addition to the above problem, I also found that M (‘table’)-> add () cannot normally return the primary key id value of newly added records.

thinkphp connect postgresql

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.