Probleem met PostgreSql

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Paul K

Paul K

14/02/2009 15:34:00
Quote Anchor link
Hallo allemaal,

Ik ben nu al aantal uren bezig met 1 stukje code, dit is de query:
Code
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM aanbod WHERE intstatus = '1' AND w_opp BETWEEN '150' AND '999'

maar hij geeft ook als er in de db geen results staan die matches
9 results terug (van de 10 rijen in de database)

Wat doe ik hier fout?

Het betreft PostgreSql..

Groeten

edit:
Normaal is die 150 een dynamisch getal maar ik ging nu verder testen met een vast getal zodat het daar niet aan zou liggen.
Gewijzigd op 01/01/1970 01:00:00 door Paul K
 
PHP hulp

PHP hulp

27/11/2024 04:27:01
 
Frank -

Frank -

14/02/2009 15:43:00
Quote Anchor link
Quote:
maar hij geeft ook als er in de db geen results staan die matches

Wat zijn "die matches" ?

Wanneer de database resultaten geeft, dan zijn er resultaten. Zeker wanneer je PostgreSQL gebruikt, die verzint geen resultaten die er niet zijn. Het is geen MySQL... ;)

Waarschijnlijk moet je even beter gaan testen en beter kijken welke data er in de database staat en welke resultaten je dan kunt verwachten bij welke queries. Even netjes uitschrijven, via pgAdmin3 testen en klaar ben je.
 
Paul K

Paul K

14/02/2009 15:53:00
Quote Anchor link
Hmm inderdaag zelfs in pgadmin geeft hij "teveel' results

w_opp is op 1 veld 100 en bij alle anderen lager
(Gebruik nu deze query:)
SELECT apnr,straatnaam,huisnummer,postcode,status,von_kk,status,bj,won_det,prijs,w_opp,plaats FROM aanbod WHERE intstatus = '1' AND w_opp BETWEEN '100' AND '999'


het rijtje met de w_opp values is hetvolgende:
90
87
52
51
85
68
60
90
60
100

het veld heeft type character varying(3)
 
Frank -

Frank -

14/02/2009 15:57:00
Quote Anchor link
Tja, je bent nu ook geen getallen aan het vergelijken, maar letters. En dan liggen tussen de 1 (van het "woord" 100) en 999 (dus het "woord" 999) ineens een heleboel andere "woorden". Bijvoorbeeld het "woord" 87.

Kortom, je hebt de verkeerde datatypes gekozen. Een varchar() gebruik je UITSLUITEND wanneer er geen beter datatype beschikbaar is. In jouw geval ben je blijkbaar op zoek naar getallen en dus zul je een getal moeten opslaan. Een integer of een numeric ligt voor de hand.

Ps. Ga alle kolommen in jouw database controleren en herstellen, dit soort vouten zullen nog veel meer voorkomen. Er gaat tenslotte geen lichtje branden wanneer je hier roept dat je een varchar gebruikt voor getallen.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 
Paul K

Paul K

14/02/2009 16:05:00
Quote Anchor link
Ik moest voor iemand een zoekfunctie werkend maken en ben verder niet bekend met postgresql, ben het wel aan het proberen te "leren".
Hoe kan je in phpPgAdmin een datatype wijzigen (A)?
 
Frank -

Frank -

14/02/2009 16:09:00
Quote Anchor link
Jouw probleem heeft niets met PostgreSQL te maken, dit gaat in iedere database fout. Je hebt geen enkele ervaring met pgSQL nodig om correcte datatypes te kiezen, dat moet je met iedere database en iedere programmeertaal.

Wijzigen van datatype doe je gewoon met SQL, zie het hoofdstuk ALTER TABLE
 
Paul K

Paul K

14/02/2009 16:26:00
Quote Anchor link
Met mysql werkte het wel altijd en dit is voor de eerste keer dat ik met PostgreSQL werk. Weer een minpunt voor mysql dus.
Heel erg bedankt voor de hulp want nu kan ik eindelijk verder het afmaken (na 4 uur :P)
En zou je nog even kunnen helpen met die query voor het wijzigen van het type (A)?
 
Frank -

Frank -

14/02/2009 16:36:00
Quote Anchor link
Voortaan beter testen, ook MySQL zal een varchar als een varchar behandelen en dus precies dezelfde resultaten geven. Het datamodel klopt gewoon niet en dat heeft niets met het merk database te maken. Of je nu met een Fiat of Renault tegen een boom rijdt, in beide gevallen loop je een deuk op.

Dan de query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
ALTER TABLE
  aanbod
ALTER COLUMN
  w_opp TYPE INT USING w_opp::INT;

Mocht de query mislukken en gaan klagen over "cannot be cast to type", dan heb je blijkbaar foute data in de kolom gezet, data die niet in een integer past. Dus iets anders dan een geheel getal. Deze data mag je dan eerst handmatig gaan opschonen en dán pas kun je de kolom gaan aanpassen.

Voortaan gewoon direct het juiste datatype kiezen, scheelt je een hoop werk en een corrupte database. Want met jouw oplossing ben je corrupte data aan het aanmaken.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.