Toon posts:

[PHP+MDB] Kan veldwaarde niet uitlezen: Item cannot be found

Pagina: 1
Acties:

Onderwerpen


  • PipoDC
  • Registratie: oktober 2007
  • Laatst online: 27-12-2010
Ik heb een probleem met het uitlezen van één bepaalde waarde uit een database. Ik kom er alleen niet uit waarom juist dit veld niet uit te lezen is en een error veroorzaakt. Ik zal het probleem hieronder uitleggen:

Eerst maak ik verbinding met een .mdb database:

PHP:
1
2
3
4
$conn = new COM ("ADODB.Connection")
   or die("Cannot start ADO");
$connStr = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source= E:\echtenaamweggehaald.nl\wwwroot\werkdir\bestand.mdb";
$conn->open($connStr);


Ik voer vervolgens een SQL query uit op de bestaande verbinding:

PHP:
1
2
$query = "SELECT tb_Product.Id, tb_Product.regionID, tb_Product.prd_name, tb_Product.prd_gps_lat, tb_Product.prd_order, tb_Region.Id, tb_Region.CountryId, tb_Region.Name, tb_Country.Id, tb_Country.Name FROM tb_Product, tb_Region, tb_Country WHERE tb_Product.regionID = ". $regionID ." AND tb_Product.regionID = tb_Region.Id AND tb_Region.CountryId = tb_Country.Id ORDER BY tb_Product.prd_order ASC, tb_Product.prd_name";
$rs = $conn->execute($query);


Vervolgens probeer ik wat waardes uit te lezen:

PHP:
1
2
3
4
$tempCountry = $rs->Fields('tb_Country.Name')->Value;
$tempRegion = $rs->Fields('tb_Region.Name')->Value;
$tempProductID = $rs->Fields('tb_Product.Id')->Value;
$tempProductName = $rs->Fields('tb_Product.prd_name')->Value;


Het vreemde is nu dat alles werkt totdat ik de laatste regel (over $tempProductName) aan het script toevoeg. Op dat moment geeft het script de volgende error:
PHP Fatal error: Uncaught exception 'com_exception' with message 'Source: ADODB.Recordset
Description: Item cannot be found in the collection corresponding to the requested name or ordinal.' in E:\echtenaamweggehaald.nl\wwwroot\werkdir\bestand.php:111 Stack trace: #0 E:\echtenaamweggehaald.nl\wwwroot\werkdir\bestand.php(111): variant->Fields('tb_Product.prd_na...') #1 {main} thrown in E:\echtenaamweggehaald.nl\wwwroot\werkdir\bestand.php on line 111
Natuurlijk weet ik dat deze foutmelding 99 uit 100 keer komt door een spelfout in de kolomnaam van de waarde die je probeert uit te lezen, maar ik kan jullie garanderen dat deze 100% goed is (tabelnaam: tb_Product, kolomnaam: prd_name). Vandaar ook mijn wanhoop en vraag aan jullie op dit forum! Ik hoop dat jullie mij kunnen helpen, ik kom hierdoor maar niet verder in mijn project. Bij voorbaat dank!

[Voor 4% gewijzigd door PipoDC op 06-10-2010 15:53. Reden: Korte inleiding toegevoegd]


  • RobIII
  • Registratie: december 2001
  • Laatst online: 21:50

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Je zult moeten aliassen (en de table prefixes uit je ->Fields weglaten).
Euh, wacht even... ik dacht dat er 2x een prd_name (1x uit tabel A en 1x uit tabel B ) in je query voorkwam waardoor je zou moeten aliassen:
SQL:
1
select a.prd_name as AName, b.prd_name as BName from ...

En dan zou je in je PHP de table prefixes weg moeten laten (is volgens mij sowieso niet goed :? )
PHP:
1
2
$aname= $rs->Fields('AName')->Value;
$bname= $rs->Fields('BName')->Value;


Maar dat is volgens mij je probleem toch niet; want dat verklaart niet waarom het alleen op die laatste regel fout zou gaan.

[Voor 90% gewijzigd door RobIII op 06-10-2010 16:22]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • PipoDC
  • Registratie: oktober 2007
  • Laatst online: 27-12-2010
Bedankt RobIII voor je hulp!

Klopt. Dat is inderdaad niet mijn probleem, maar zoiets dergelijks zal het misschien wel mee te maken hebben. Om de gelijke kolomnamen (db wordt mij aangeleverd, dus aan de structuur en naamgeving is helaas niks te doen) te voorkomen gebruik ik juist die prefixes.

Om iedereen wat meer inzicht te geven in de SQL query zal ik 'm even wat beter formatten...

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SELECT 
tb_Product.Id, 
tb_Product.regionID, 
tb_Product.prd_name, 
tb_Product.prd_order, 
tb_Region.Id, 
tb_Region.CountryId, 
tb_Region.Name, 
tb_Country.Id, 
tb_Country.Name 

FROM 
tb_Product, 
tb_Region, 
tb_Country 

WHERE 
tb_Product.regionID = ". $regionID ." 
AND 
tb_Product.regionID = tb_Region.Id 
AND 
tb_Region.CountryId = tb_Country.Id 

ORDER BY 
tb_Product.prd_order ASC, 
tb_Product.prd_name

[Voor 91% gewijzigd door PipoDC op 06-10-2010 16:01]


  • RobIII
  • Registratie: december 2001
  • Laatst online: 21:50

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Nou, mijn punt is/was dat als je bijvoorbeeld een product.name hebt en een country.name en een customer.name dan heb je in je select result 3 fields met de naam "name". Als je die dan met ->Fields gaat aanspreken gaat 'ie natuurlijk niet weten welke van de 3 "name"'s je bedoelt. Jij gebruikt tabel prefixes in je ->Field() aanroepen; waarvan ik dacht dat dat sowieso niet zou gaan (maar ik dus klaarblijkelijk verkeerd ingelicht ben :P ).

Je zou dat moeten oplossen door iets te doen als:
SQL:
1
select country.name as countryname, product.name as pname, customer.name as cname from ...

En dan zou je dus 3 "unieke" name fields hebben; countryname, pname en cname (even voor het voorbeeld; de namen zijn niet erg consistent maar maakt het duidelijk(er)). Dat noemen ze aliassen.

/edit: Ah, je bent ook aan 't editten geslagen :P Ik zie daarin sowieso al 3x een "id" en 2x een "name" dus dat kon er wel eens mee te maken hebben ja ;)

[Voor 11% gewijzigd door RobIII op 06-10-2010 16:03]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • PipoDC
  • Registratie: oktober 2007
  • Laatst online: 27-12-2010
Zou inderdaad raar zijn aangezien dat voor meerdere elementen waar is. Bijvoorbeeld:
PHP:
1
$rs->Fields('tb_Product.Id')->Value;

werkt wel. Terwijl:
PHP:
1
$rs->Fields('tb_Product.prd_name')->Value;

dus niet blijkt te werken én prd_name zeker uniek is in deze.

Kan het natuurlijk wel proberen om te kijken of het wat scheelt. Misschien gaat er iets anders in de recordset fout wat ik op dit moment niet kan zien... Ik zal het zo dadelijk laten weten.

[Voor 1% gewijzigd door PipoDC op 06-10-2010 16:08. Reden: spelfoutje én bbcode lijkt niet te pakken... my bad...]


  • NMe
  • Registratie: februari 2004
  • Laatst online: 26-09 14:38

NMe

Quia Ego Sic Dico.

edit:
bbcode lijkt niet te pakken..
offtopic:
Niet als je een [code]-tag opent en vervolgens een [php] tag probeert af te sluiten en daar dan ook nog eens de verkeerde slash voor gebruikt. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • PipoDC
  • Registratie: oktober 2007
  • Laatst online: 27-12-2010
@NMe: Had 'm gelukkig al door voor ik je post las. Van een dag staren naar hetzelde lijntje code wordt je heeeeel gaaaar 8)7

@ RobIII: Bedankt voor de tip! Ik heb werkelijk waar geen enkel idee waarom, maar het aliassen van de te selecteren veldnamen helpt wel degelijk. Het werkt nu dus!

Heb de SQL veranderd in:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT 
tb_Product.Id AS productid, 
tb_Product.regionID AS productregionid, 
tb_Product.prd_name AS productname, 
tb_Product.prd_order AS productorder, 
tb_Region.Id AS regionid, 
tb_Region.CountryId AS regioncountryid, 
tb_Region.Name AS regionname, 
tb_Country.Id AS countryid, 
tb_Country.Name AS countryname 

FROM 
tb_Product, 
tb_Region, 
tb_Country 

WHERE 
tb_Product.regionID = ". $regionID ." 
AND 
tb_Product.regionID = tb_Region.Id 
AND 
tb_Region.CountryId = tb_Country.Id 
ORDER BY 
tb_Product.prd_order ASC


Vraag blijft waarom het fout ging en wat de oorzaak was. (Ik zou graag het probleem exact willen begrijpen) Heb echt geen flauw idee waarom net dat ene veldje niet werkte... :/

[Voor 60% gewijzigd door PipoDC op 06-10-2010 16:27. Reden: nieuwe SQL query toegevoegd]


  • alex3305
  • Registratie: januari 2004
  • Laatst online: 22-09 16:46
Sowieso is het handiger om met aliassen te werken in SQL wanneer er kolommen zijn met dezelfde naam in verschillende tabellen. Anders kan het nog wel eens misgaan namelijk. Om je voorbeeld te quoten zou ik hetzelfde zo doen:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
tb_Product.Id AS productId, 
tb_Product.regionID AS prdRegionId, 
tb_Product.prd_name AS prdName, 
tb_Product.prd_order AS prdOrder, 
tb_Region.Id AS regionId, 
tb_Region.CountryId AS rgCountryId, 
tb_Region.Name AS regionName, 
tb_Country.Id AS countryId, 
tb_Country.Name AS countryName 
FROM tb_Product, tb_Region, tb_Country 
WHERE prdRegionId = ". $regionID ." AND prdRegionId = regionId AND rgCountryId = countryId 
ORDER BY prdOrder ASC, prdName


EDIT: Spuit 11

  • PipoDC
  • Registratie: oktober 2007
  • Laatst online: 27-12-2010
@alex3305: Kan nu moeilijk zeggen dat je geen gelijk hebt... toch bedankt voor je hulp!

Probleem is opgelost, maar blijf benieuwd waar het fout ging!

  • _js_
  • Registratie: oktober 2002
  • Laatst online: 25-09 03:02
PipoDC schreef op woensdag 06 oktober 2010 @ 16:20:
Vraag blijft waarom het fout ging en wat de oorzaak was. (Ik zou graag het probleem exact willen begrijpen) Heb echt geen flauw idee waarom net dat ene veldje niet werkte... :/
Omdat sommige programmeertalen en/of databases de neiging heeft om de tabelnaam niet te gebruiken als deel van de naam van het veld als dat niet nodig is. De andere velden Id en Name komen meerdere keren voor in je resultaat, dus daarvoor is de naam van de tabel nodig om ze te identificeren, prd_name komt als veldnaam maar 1 keer voor en heeft dus geen tabelnaam nodig om hem uniek te identificeren en blijkbaar is een deel van je omgeving zo handig om dat dan ook meteen onmogelijk te maken.

  • PipoDC
  • Registratie: oktober 2007
  • Laatst online: 27-12-2010
_js_ schreef op woensdag 06 oktober 2010 @ 16:38:
[...]

Omdat sommige programmeertalen en/of databases de neiging heeft om de tabelnaam niet te gebruiken als deel van de naam van het veld als dat niet nodig is. De andere velden Id en Name komen meerdere keren voor in je resultaat, dus daarvoor is de naam van de tabel nodig om ze te identificeren, prd_name komt als veldnaam maar 1 keer voor en heeft dus geen tabelnaam nodig om hem uniek te identificeren en blijkbaar is een deel van je omgeving zo handig om dat dan ook meteen onmogelijk te maken.
Zou kunnen kloppen, ware het niet dat ik prd_name ook heb proberen aan te roepen zonder de tabel prefix. (Als in: een prefix waar nodig, geen prefix waar geen dubbele namen kunnen voorkomen) Zonder resultaat helaas...

  • joppybt
  • Registratie: december 2002
  • Laatst online: 26-09 17:34
Een andere database zoals SQLite heeft speciale PRAGMA's om te sturen hoe hij met dit soort aliassen omgaat, zie bijvoorbeeld http://www.sqlite.org/pragma.html#pragma_full_column_names
Misschien dat je onderliggende MDB driver ook zoiets heeft?
Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee