The data source you are setting is inclusive of the full name of the .DBF... Don't do that. The data source should just point to the physical directory WHERE the table is .... Then, when you issue a query to a table, it looks in the path for a .dbf by the name you are querying, finds it and returns that... Also, you don't need to explicitly include .dbf, such as
select * from YourTable.dbf
EDIT PER FEEDBACK
Your "connection" that is being opened has a data source. That is telling where it should find the data. When connecting to a VFP source, all you have to do is set the source to the physical path of the table. Notice I just stripped off the "VCABDOC.DBF" from the string parameter.
$conn->Open('Provider=VFPOLEDB.1;Data Source="C:\xampp\htdocs\work;";');
NOW, you should be able to just query directly from the table that is located in the "c:xampphtdocswork" folder.
$rs = $conn->Execute("SELECT * FROM vcabdoc");
Finally, lets say you have more than one .dbf table in your "c:xampphtdocswork" folder. Say a simple customer / order entry system and you want to get all orders for a specific person. As long as both tables are in the same folder (ie: work), then you could do something like
$rs = $conn->Execute(
"SELECT customer.*, orders.*
FROM customer
join orders on customer.ID = orders.customerID
order by orders.date");
Notice I'm not explicitly throwing into the query the full path PLUS table name. The connection knows where it will try to find the tables to complete the query. Also, your connection does NOT allow you to go relative path BACKWARDS (closer to C:), but DOES allow you to go relatively FORWARD. So, say you have a directory structure something like
c:xampphtdocswork
c:xampphtdocsworkSubFolder1
c:xampphtdocsworkSubFolder2
And you make your connection point to the "work" folder as in the original sample. You COULD query referencing the subfolders in your query. In this query, I'm using an "alias" after each table name reference so I don't have to explicitly type the Long table name where used in the rest of the query. It makes for easier readability.
("c" is alias to customers table)
("sft1" is alias to Sub-folder first table )
("sft2" is alias to Sub-folder second table )
select
c.*,
sft1.someField,
sft2.AnotherField
from
customers c
join SubFolder1SomeOtherTable sft1
on c.SomeCommonColumn = sft1.SameCommonColumn
join SubFolder2SecondTable sft2
on c.ADifferentColumn =sft2.SimilarPurposeColumn
Hope this helps clarify some things for you.