2014-02-11 57 views
0

我試圖直接通過PHP獲取Windows索引搜索工作,因此我可以非常快速地搜索數千個文件中的文本。使用Windows索引和PHP

我有工作在Visual Basic中使用此腳本:

'To run this snippet, save it to a file and run it using cscript.exe from a command line. 
'Running the .vbs file with Windows Script Host may cause dialog boxes to open for each item returned from the index. 

Set objConnection = CreateObject("ADODB.Connection") 
Set objRecordSet = CreateObject("ADODB.Recordset") 

objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';" 

objRecordSet.Open "SELECT System.ItemName FROM SYSTEMINDEX WHERE DIRECTORY='file:C:/folderIndexed' AND CONTAINS('myDemo') ORDER BY System.ItemName DESC", objConnection 

Do Until objRecordset.EOF 
    Wscript.Echo objRecordset.Fields.Item("System.ItemName") 
    objRecordset.MoveNext 
Loop 

現在我想將它移植到PHP使用COM class的建議here但我收到此錯誤信息:

發出com_exception
來源:未知
說明:未知

我嘗試看起來像這樣:

<?php 
$conn = new COM("ADODB.Connection") or die("Cannot start ADO"); 
$conn->Open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"); 

$recordset = new COM("ADODB.Recordset"); 

$keyword = 'a'; 
$sql = "SELECT filename, size, path 
    FROM SCOPE() 
    WHERE DIRECTORY='file:C:/folderIndexed' and CONTAINS('a')"; 


//-----------------> line of the error <----------------- 
$recordset = $recordset->Open($sql, $conn); 


foreach ($recordset as $obj) { 
    echo $obj->Fields->Item("System.filename")->Value, "\ n" ; 
} 

我在做什麼錯?

我使用PHP 5.5。我正在使用extension=php_com_dotnet.dllphp.ini。 php_com_dotnet.dll文件放置在ext文件夾中,詳情請參見extension_dir值。



相關問題:

+0

我不知道,但在MSDN文檔說'一定要使用第三個參數來COM()constructor.' –

+0

@ Nouphal.M我沒有看到它。實際上,其他兩個參數是可選的:'COM :: COM(string $ module_name [,mixed $ server_name [,int $ codepage [,string $ typelib]]])''你可以看到'$ obj = new COM(「Application.ID」)'[here](http://uk3.php.net/manual/en/class.com.php)。 – Alvaro

+0

在這裏檢查http://social.msdn.microsoft.com/Forums/en-US/63325b03-18f9-4506-a896-958ce55bde8a/query-windows-indexing-server-with-php?forum=sqldriverforphp –

回答

2

$recordset->open不返回記錄集,你應該不會像你正在做分配返回值。

嘗試改變:

$recordset = $recordset->Open($sql, $conn); 

$recordset->Open($sql, $conn); 

此外,您移植的代碼顯著從您的VBScript版本的結構偏差。這裏是我嘗試移植你的代碼,這對我很有用。

$conn = new COM("ADODB.Connection") or die("Cannot start ADO"); 
$recordset = new COM("ADODB.Recordset"); 

$conn->Open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"); 

// your query doesn't work for me in VBSCRIPT or PHP. this one does. 
$recordset->Open("SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX", $conn); 

if(!$recordset->EOF) $recordset->MoveFirst(); 
while(!$recordset->EOF) { 
    echo $recordset->Fields->Item("System.ItemPathDisplay")->Value . "\n"; 
    $recordset->MoveNext(); 
} 
+0

Thanks @Martin !!主要問題是在查詢中,我沒有使用'SYSTEMINDEX',也沒有使用有效的'fields'作爲select,現在我正在使用''SELECT System.ItemName,System.DateModified FROM SYSTEMINDEX WHERE DIRECTORY ='file:C:/xmls/folder1'AND CONTAINS('a')「'加上你提到的變化和循環記錄。 – Alvaro

+0

如果您對該主題有更多瞭解,我將在相同標籤下針對查詢的「限制」或「maxRecords」打開一個新問題。 :) – Alvaro

+0

這裏是相關的問題:http://stackoverflow.com/questions/21832267/set-a-limit-maxrecords-property-for-windows-indexing-search-through-php-com – Alvaro