Avatar billede napisok Nybegynder
10. februar 2005 - 13:27 Der er 33 kommentarer og
1 løsning

PHP og postgresql fejl

Jeg skal have php til at forbinde med postgresql, men får flg fejl: Fatal error: Call to undefined function: pg_connect()

$hest="host=localhost port=5432 dbname=new_db user=xx password=xxx";
    $fisk =pg_connect($hest);

Hvad gør jeg for at det virker.
Avatar billede evilhoppemis Nybegynder
10. februar 2005 - 14:10 #1
ser ud som om når du kalder funktionen det er forkert..

Hvordan kalder du den?
Avatar billede mungojerrie Nybegynder
10. februar 2005 - 14:18 #2
kører du php på windows eller linux ?
hvis windows, så skal du have en php_pgsql.dll fil lagt over under system32
hvis linux, skal php compileres med support for postgresql
Avatar billede napisok Nybegynder
10. februar 2005 - 16:27 #3
Jeg bruger windows og har prøvet at søge efter php_pgsql.dll, men kan ikke finde den har du evt et link hvor jeg kan finde den
Avatar billede mungojerrie Nybegynder
10. februar 2005 - 17:13 #4
Den skulle da gerne ligge i samme bibliotek som din php install, se efter en mappe der hedder extensions, ellers skal du hente en fuld pakke af php filerne her:
http://dk.php.net/get/php-4.3.10-Win32.zip/from/a/mirror

Der burde filen være i......
Avatar billede napisok Nybegynder
10. februar 2005 - 17:24 #5
Jep jeg havde downloaded win-installer, men har nu hentet og fundet den under extentions php_pgsql.dll, den er nu lagt under windows/system32, men stadig kommer samme fejl
Avatar billede mungojerrie Nybegynder
10. februar 2005 - 20:26 #6
jeps, det havde jeg lige glemt, du skal også i php.ini filen udkommentere en linje der angiver at php skal loade pgsql.dll filen når serveren starter....
prøv at søge på pgsql i ini filen, så tror jeg du finder det.....
Avatar billede mungojerrie Nybegynder
10. februar 2005 - 20:31 #7
skal du ikke også have en smart php klasse til at klare din sql forbindelse ?
Avatar billede napisok Nybegynder
10. februar 2005 - 23:14 #8
jeg har startet php.exe i c:/php, lagt php_pgsql.dll under system32, har fjernet ;extension=php_pgsql.dll i php.ini, men der kommer samme fejl. Hvad er der galt og har du et eksempel på en smart php klasse til sqlforbindelsen. er på i morgen tidlig igen
Avatar billede mungojerrie Nybegynder
11. februar 2005 - 07:30 #9
håber ikke du har fjernet linjen med : ;extension=php_pgsql.dll
fra din php.ini, du skal bare fjerne ";"  altså semicolon'et

Her har du en php klasse til postgre, bare indsæt dine connection data:



--------------Klassen.--------------------

<?php

class dbclass {

    var $dbconn;

    function dbclass(){
        return;
    }
   
    function opendb(){
        $this->dbconn = pg_connect("host=localhost port=5432 dbname=xxx user=xxx password=xxx");
        return $this->dbconn;
    }

    function closedb($dbconn){
        if(!pg_close($this->dbconn)){
            echo "Kunne ikke lukke forbindelsen til PostGre!";
            return false;
        }else{
            return true;
        }
    }
 
    function sql_execute($query)
    {
        $resultat = pg_exec($this->dbconn, $query);
       
        if(!$resultat) {
            echo "Kunne ikke udføre: <em>$query</em>";
        }
    }
   
    function sql_execute_receive($query)
    {
        $resultat = pg_exec($this->dbconn, $query);
       
        if(!$resultat)
        {
            echo "Kunne ikke udføre: <em>$query</em>";
            return;
        }
       
        return $resultat;
    }
   
    function sql_execute_scalar($query) //returnerer kun et felt
    {
        $resultat = pg_exec($this->dbconn, $query);
        if($resultat){
            $row = pg_fetch_array($resultat);   
            return $row[0];
        }
    }

}

?>


-------------sådan instatierer du en ny connection--------------------
        #åbn for databasen
      $mydbclass = new dbclass();
      $connection = $mydbclass->opendb();

-----------sådan lukker du for en forbindelsen------------------

    #luk for databasen
    $mydbclass->closedb($connection);


-----------sådan benytter du din forbindelse inde fra en function--------------

    function getFirstVisitor(){
        global $connection;
        global $mydbclass;        
        $sql = "select first_visitor()";
        $data = $mydbclass->sql_execute_scalar($sql);       
        return $data;
        //return $sql;
    }   
   
--------------sådan benytter du den på en vilkårlig php side------------------


    $query = "select feltnavn1, feltnavn2 from \"arrangementer\" where id='$id'";
  $myarray = $mydbclass->sql_execute_receive($query);
 
  if(pg_numrows($myarray) > 0){
     
      //udpak data
      for ($k = 0; $k < pg_numrows($myarray); $k++ ){
     
            $post = pg_fetch_array($myarray, $k);
            $feltnavn1 = $post["feltnavn1"];
            $feltnavn2 = $post["feltnavn2"]; 
            .......
            .......
        }
  }else{
      echo "Der er ingen data!!!!!";
  }
Avatar billede napisok Nybegynder
11. februar 2005 - 08:51 #10
skide godt det virker takker
Avatar billede napisok Nybegynder
11. februar 2005 - 10:08 #11
Lige et spørgsmål, hvis jeg nu vil kontakte en anden pc med database på eks ip 192.168.1.203 port 5432, får jeg den fejl at den ikke kan forbinde, hvad skal jeg gøre for at min php kan forbinde med db på anden pc
Avatar billede napisok Nybegynder
11. februar 2005 - 12:00 #12
hvordan laver man en tabel fra php har brugt flg. kode
$tabelSQL = "CREATE TABLE users
            (
            id    int,
                navn    varchar(50),
                email    varchar(50),
                password varchar(50),
                primary key (id));"
pg_Query($tabelSQL);
men den melder fejl i pg_Query($tabelSQL);
Avatar billede mungojerrie Nybegynder
11. februar 2005 - 13:49 #13
du skriver som følger:

CREATE TABLE users (
    id integer SERIAL,
    navn character varying(50),
    email character varying(50),
    password character varying(50)
);

varchar hedder character varying i postgre terminologi

SERIAL keywordet kan du læse mere om her:
http://www.postgresql.org/docs/7.4/interactive/datatype.html#DATATYPE-SERIAL
kort fortalt laver den autoincrement af din id. Hvis du selv vil gøre det eller ikke har brug for det, sletter du bare ordet SERIAL fra sql'en

En lille bemærkning til din email felt, en email kan jo nemt være over 50 tegn, hvis jeg var dig ville jeg skrive 255 i stedet for, længere kan en email ikke være....
Avatar billede napisok Nybegynder
14. februar 2005 - 22:58 #14
Når jeg laver en select hvor der spørges på en værdi får jeg i return Resource id #2 hvad betyder dette, tak for en stor hjælp
Avatar billede mungojerrie Nybegynder
15. februar 2005 - 07:52 #15
Det er højst sandsynligt fordi du ikke har pakket din recordset ud endnu, hvis du da får mere end et resultat tilbage. Du kan evt prøve at lave et select statement, hvor du ved der kun kommer en værdi tilbage og så benytte denne funktion :

function sql_execute_scalar($query) //returnerer kun et felt
    {
        $resultat = pg_exec($this->dbconn, $query);
        if($resultat){
            $row = pg_fetch_array($resultat);   
            return $row[0];
        }
    }

Hvis du så bare udskriver hvad funktionen returner med et echo, burde du ikke få "Resource id #2"
Avatar billede napisok Nybegynder
15. februar 2005 - 10:40 #16
Du kan bare det der, men når man indsætter en record i en tabel og gerne vil have den sidste record man har oprettet (dennes attribut customerID), hvordan gør man så. Det skal siges at der kan være flere bruger på samme tid, så det vil være noget skidt hvis man får fat i en af deres records. Har brug pg_last_oid, men den returnere kun et positivt tal for at der er oprettet en. Har også brugt select * from customer order by "customerId" desc limit 1;, men den tager kun den sidste der er i tabellen (uden at se hvem der har oprettet den)
Avatar billede mungojerrie Nybegynder
15. februar 2005 - 10:55 #17
Ja, det er lidt tricky at få den sidst oprettede id, denne funktion er ikke helt foolproof....

    function getLastInsertedID($result, $table_name, $column_name) {
        global $connection;
        global $mydbclass;
        $oid = pg_getlastoid($result);
        $query_for_id = "SELECT $column_name FROM $table_name WHERE oid=$oid";
        $result_for_id = $mydbclass->sql_execute_receive($query_for_id);
        if(pg_numrows($result_for_id)){
            $id=pg_fetch_array($result_for_id, 0, PGSQL_ASSOC);
        }
        return $id[$column_name];
    }

Når du bruger den skal du have de variable "til stede"
$connection + $mydbclass;
Ellers vil funktionen ikke virke.

Hvis du skal være helt sikker på at du får den sidste id, skal du lave noget med locks på din tabel, men det er noget omstændelig og kan også give lange svartider, hvis der er mange der skal vente på at lock'en bliver fjernet igen.

Jeg bruger selv denne funktion som en del af et debatforum og den har endnu ikke fejlet...
Avatar billede napisok Nybegynder
15. februar 2005 - 11:11 #18
du er dagens helt, jeg prøver at arbejde videre med det
Avatar billede napisok Nybegynder
15. februar 2005 - 15:44 #19
Din sidste funktion virker. man skal bruge customerId som fremmednøgle i tabellen user, dvs der er nogle user der er tilknyttet customer, jeg har prøvet at gøre det på flg måde:
1. insert en customer
2. select id fra customer
3. insert en user med fremmednøglen id fra customer (denne udførsel sker mange gange)
Jeg tænkte at der måske var en mere simpel måde at gøre det på
Avatar billede mungojerrie Nybegynder
15. februar 2005 - 16:00 #20
Kan du ikke lige uddybe dit spg, er ikke sikker på hvad du mener ?  :-)

Savner du en nemmere funktion til at give dig "last inserted id" eller ?
Avatar billede mungojerrie Nybegynder
15. februar 2005 - 16:36 #21
hov, så først nu din bemærkning:
"Lige et spørgsmål, hvis jeg nu vil kontakte en anden pc med database på eks ip 192.168.1.203 port 5432, får jeg den fejl at den ikke kan forbinde, hvad skal jeg gøre for at min php kan forbinde med db på anden pc"

For at postgre skal give adgang fra en anden pc, skal der på den linux server som den kører på gives tilladelse. Det foregår ved man redigerer i filen pg_hba.conf, her skal der tilføjes en linje i bunden af filen:

host    all    all    192.168.1.203    255.255.255.255    trust

Så skal database enginen genstartes før ændringerne træder i kraft, det gøres nemmest ved at genstarte hele maskinen, hvis du kan det....
Avatar billede napisok Nybegynder
15. februar 2005 - 18:26 #22
Nu har du hjulpet mig igen, mht. til pg_hba.conf, skrev jeg md5 i stedet for trust.
Men til det andet, jeg har 2 tabeller customer og user, hvor primær nøgle i customer er fremmed nøgle i user, (for at man kan se hvilken customer user hører til). Derfor efter min løsning, skal man først oprette customer, når den er oprettet finder man dens customerid. Customerid bruger man når man opretter en user. Men jeg tænkte at der måske var en bedre løsning?, istedet for de 3 punkter, så man evt. kan gøre det i et hug
Avatar billede mungojerrie Nybegynder
15. februar 2005 - 21:20 #23
Du skulle nok godt kunne klare det med en stored procedure, også kaldet functions i postgresql, da en function bliver udført atomart, dvs uden at andre kald til databasen bliver udført mens functionen udføres.
Du kan læse lidt om hvordan man evt kan gøre her:
http://www.postgresql.org/docs/7.4/interactive/xfunc-sql.html
Avatar billede napisok Nybegynder
17. februar 2005 - 11:15 #24
Igen virker det. Men i usertabel skal jeg have genereret et unik password til hver user som skal gemmes i usertabellen, kan man få postgresql til det og hvordan gør man det. Har ledt på internettet, men kan ikke finde noget konkret
Avatar billede mungojerrie Nybegynder
18. februar 2005 - 10:04 #25
har ikke lige den store erfaring med password i databaser, men du kan på denne side finde en function i sql der kan generere md5 passwords for dig
http://www.postgresql.org/docs/7.4/interactive/functions-string.html
søg på md5 på siden
Avatar billede napisok Nybegynder
20. februar 2005 - 21:06 #26
Så er jeg tilbage, men har lidt problemer med at få lukket for database, min kode er:
require_once ("dbclass.php");
require_once ("customer.php");
$db = new dbclass();
$connect = $db->opendb();
class dbCustomer{
function createCustomer(&$customer){
global $connect; //åbner database
funktionindhold....
global $db->closedb($connect);}
men den vil ikke køre den sidste linje får fejl T_Global, hvad sker der
Avatar billede mungojerrie Nybegynder
20. februar 2005 - 21:31 #27
det er fordi du ikke skal skrive "global $db->closedb($connect);}"
men bare "$db->closedb($connect);}"
global keywordet er beskrevet her :
http://dk.php.net/language.variables.scope
kort fortalt giver den dig adgang til dine variable (der er erklæret udenfor) inde i en function
Avatar billede napisok Nybegynder
20. februar 2005 - 21:54 #28
hvordan kan jeg give dig flere point for den store hjælp du giver mig
Avatar billede napisok Nybegynder
20. februar 2005 - 21:56 #29
tak det virker
Avatar billede mungojerrie Nybegynder
20. februar 2005 - 21:57 #30
du kan oprette et nyt spørgsmål som hedder "point til mungojerrie"
så ligger jeg et svar og du accepterer......
men det behøver du nu ikke.....
Avatar billede napisok Nybegynder
20. februar 2005 - 22:41 #31
så er det oprettet
Avatar billede napisok Nybegynder
21. februar 2005 - 10:05 #32
har oprettet det med overskrift point til mungojerrie + select, jeg har en select som returnere blank skærm
Avatar billede napisok Nybegynder
21. februar 2005 - 16:46 #33
Nå jeg har løst min select (tastefejl(har arbejdet lidt med java og aldrig php, det er nyt det hele)),jeg har et problem hvor jeg selecter en record fra databasen, men det skal returnere et objekt af customer (har lavet en customer klasse) koden er
function selectOneCustomer($customer) //man sender et customer objekt til funktionen
    {
        global $connect;
$rov="select * from \"customer\" where \"customerId\" ='$customer->id'";
        $selectOne = pg_query($connect, $rov);
            if($selectOne){
            while ($row = pg_fetch_row($selectOne)) 
            $cc=new customer();
            $cc->setPostNo($row[2]);  //fejl hvordan skal man oprette et
            echo $cc->post;                          customerobjekt
            }else{
            return "sur";
            }}
har prøvet dette men virker ikke.
Avatar billede napisok Nybegynder
21. februar 2005 - 19:32 #34
Jeg fandt fejlen, det var en dum tastefejl,
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester