2017-10-20 20 views
0

私はMS Accessデータベースを持っています。レコードを取得してから2次元配列に書きたい。私はレコードセットのメモリ領域と配列のメモリ領域を同じだと思っています。レコードセットを閉じると、配列の値にアクセスできなくなるためです。 $rsMS Access ADOレコードセットと2次元配列

Error: Catchable fatal error: Object of class variant could not be converted to string in ...

$databaselocation = $_SERVER['DOCUMENT_ROOT'] . "ornek.mdb"; 
$conn = new COM('ADODB.Connection') or exit('Cannot start ADO.'); 
$conn->Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=$databaselocation"); 

$SQL1 = "SELECT * from konu"; 
$rs = new com("ADODB.RecordSet") or die("Recordset cant create!"); 
$rs->Open($SQL1,$conn,1,3); 
$say = $rs->RecordCount(); 
echo "Row Counts: " . $say . "<br><br>"; 

$dizi = array(array()); 


for($a=0; $a<$say; $a++) 
{ 
    $dizi[$a][0] = $rs[0]; 
    $dizi[$a][1] = $rs[1]; 
    $rs->MoveNext; 
} 

$rs->Close(); $conn->Close(); 
$rs = null; $conn = null; 

echo $dizi[0][0];  // this line ERROR same below 

for($a=0; $a<$say; $a++) 
{ 
    echo $dizi[$a][0] . " - " . $dizi[$a][1] . "<br>"; // ERROR 
} 
+0

$ diziデータを表示/印刷できますか? print_r($ dizi); –

+0

実際には、 '$ dizi'は空白ですか? 'var_dump($ dizi)'を実行してください。興味深いことに、COMインターフェイスではなくPHP APIを使ってMS Accessに接続するための[PDO-ODBC](http://php.net/manual/en/ref.pdo-odbc.php)はありませんか? – Parfait

答えて

0

あなたは文字列値が、特別なCOMオブジェクトを持っていません。通常は自動的にstringに変換されます。この場合、任意のセルには、数式などの奇妙な値があります。

variant_get_type()およびConstants listを試してください。使用前に$rs[0],にチェックしてください。

もし私が覚えているのであれば、$rs->fields[0]propertyを使用してください。 (はい、この方法を使用します)

+0

あなたの答えに感謝します。私は解決した。私はデータベースに文字列データを持っていますが、自動的に文字列に変換されません。バリアントオブジェクトを文字列にキャストします。 $ dizi [$ a] [0] =(文字列)$ rs [0]; –

+0

クエリは1列の結果セットですか?私は@ bato3と一緒です。奇妙なものではありません。*フィールド*名前付きフィールドが必要です。 – Parfait

+2

@Parfait ADOとDAOの両方のレコードセットは、フィールドにアクセスするための 'rs(fieldnum)'構文をサポートしています(明示的なコードが好きなので、imhoは使用しないでください)。答えは、実際にこれを行う正しい方法は、私が知る限り、 '$ rs [0] - > Value'または' $ rs-> fields [0] - > Value'です。 valueプロパティは文字列で、それ以上のキャストは必要ありません。 –

0

私はちょうど今解決しました。文字列にオブジェクトをキャストすると、その文字列は次のようになります。 $ dizi [$ a] [0] =(文字列)$ rs [0];