2013-08-02 2 views
1

У меня есть база данных Microsoft Access, и я пытаюсь запросить таблицу с помощью PHP и выпустить действительный JSON. У меня есть эквивалентный код для базы данных MSSQL, я пытаюсь сделать свой код так же, как и для базы данных Access.Использование PHP для запроса файла MDB и возврата JSON

Вот код MSSQL

$myServer = "server"; 
$myDB = "db"; 
$conn = sqlsrv_connect ($myServer, array('Database'=>$myDB)); 

$sql = "SELECT * 
     FROM db.dbo.table"; 

$data = sqlsrv_query ($conn, $sql); 

$result = array(); 

do { 
    while ($row = sqlsrv_fetch_array ($data, SQLSRV_FETCH_ASSOC)) { 
     $result[] = $row; 
    } 
} while (sqlsrv_next_result($data)); 

$json = json_encode ($result); 

sqlsrv_free_stmt ($data); 
sqlsrv_close ($conn); 

Вот что я пытался для MDB файл

$dbName = "/filename.mdb"; 

if (!file_exists($dbName)) { 
    die("Could not find database file."); 
} 

$db = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=$dbName", $user, $password); 

$sql = "SELECT * 
     FROM cemetery"; 

$data = $db->query($sql); // I'm getting an error here 
$result = array(); 

// Not sure what do do for this part... 
do { 
    while ($row = fetch($data, SQLSRV_FETCH_ASSOC)) { 
     $result[] = $row; 
    } 
} while (sqlsrv_next_result($data)); 

$json = json_encode ($result); 

I рода вслед за этим, чтобы попытаться подключиться к базе данных: http://phpmaster.com/using-an-access-database-with-php/

В настоящее время это дает мне 500 внутренних ошибок сервера. Я ожидаю, что строки, такие как это будет сохранено в переменной $json

[ 
    { 
     "col1":"col value", 
     "col2":"col value", 
     "col3":"col value", 
    }, 
    { 
     "col1":"col value", 
     "col2":"col value", 
     "col3":"col value", 
    }, 
    { 
     etc... 
    } 
] 

Может кто-то помочь мне порт код MSSQL я выше, так что я могу использовать его с базой данных MDB? Спасибо за помощь!


EDIT: Я закомментировать строки по одному, и он бросает мне ошибку 500 на линии $data = $db->query($sql);. Я просмотрел журнал ошибок, и я получаю сообщение об ошибке Call to a member function query() on a non-object. У меня уже есть строка extension=php_pdo_odbc.dll без объявления в моем файле php.ini. Кто-нибудь знает, в чем проблема?

+1

научиться делать использовать эхо отлаживать и находить, где находится ваша ошибка. один из которых я уже нашел: 'while ($ row = fetch ($ data, SQLSRV_FETCH_ASSOC))' должно быть 'while ($ row = $ data-> fetch (PDO :: FETCH_ASSOC))'. 'do {..} while' нужно удалить. просто посмотрите пример, который вы опубликовали, его все там – x4rf41

+0

Пожалуйста, обновите свой вопрос, чтобы сообщить нам, что вы ожидаете, что происходит сейчас, и что вы пытались его исправить. Подумайте о том, какие сообщения об ошибках вы получите, а также описание ресурсов, которые вы использовали, чтобы помочь решить проблему и как они не смогли ответить на ваш вопрос. –

+0

Когда я запускаю это, он дает мне 500 Internal Server Error, поэтому я не вижу никаких эхо-строк (я получаю эту ошибку даже после внесения изменений, которые вы предложили). У меня есть файл MDB в том же каталоге, что и мой сайт, просто для тестирования прямо сейчас. И я обновил вопрос, Джордж! – TFischer

ответ

0

я, наконец, понял это.

<?php 
// Location of database. For some reason I could only get it to work in 
// the same location as the site. It's probably an easy fix though 
$dbName = "dbName.mdb"; 
$tName = "table"; 

// Throws an error if the database cannot be found 
if (!file_exists($dbName)) { 
    die("Could not find database file."); 
} 

// Connects to the database 
// Assumes there is no username or password 
$conn = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=$dbName", '', ''); 

// This is the query 
// You have to have each column you select in the format tableName.[ColumnName] 
$sql = "SELECT $tName.[ColumnOne], $tName.[ColumnTwo], etc... 
     FROM $dbName.$tName"; 

// Runs the query above in the table 
$rs = odbc_exec($conn, $sql); 

// This message is displayed if the query has an error in it 
if (!$rs) { 
    exit("There is an error in the SQL!"); 
} 

$data = array(); 
$i = 0; 

// Grabs all the rows, saves it in $data 
while($row = odbc_fetch_array($rs)) { 
    $data[$i] = $row; 
    $i++; 
} 

odbc_close($conn); // Closes the connection 
$json = json_encode($data); // Generates the JSON, saves it in a variable 
?> 
0

Вам нужен только 1 цикл, fetchAll Ваш итерацию друг:

while ($row = $data->fetchAll(SQLSRV_FETCH_ASSOC)) { 
    $result[] = $row; 
} 
0

odbc_connect не возвращает объект, он возвращает ресурс. см. (http://php.net/manual/en/function.odbc-connect.php), поэтому вам нужно будет сделать что-то подобное.

$db = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=$dbName", $user, $password); 
$oexec = obdc_exec($db,$sql); 
    $result[] = odbc_fetch_array($oexec); 

, а затем вы можете перебирать результаты ..

Смотри также:

http://www.php.net/manual/en/function.odbc-fetch-array.php http://www.php.net/manual/en/function.odbc-exec.php

+0

Теперь это дает мне предупреждение (' odbc_fetch_array() ожидает, что параметр 1 будет ресурсом, boolean задан в C: \\ ... ') и фатальной ошибкой (' вызов функции-члена fetchAll() для не-объекта в C: \\ ... ') – TFischer

+0

Извините, что я не учитывал проверку ошибок и тому подобное. Вам нужно проверить, что все вызовы не возвращают false, и если они это сделают. вызовите odbc_error, чтобы узнать, что такое ошибка. Я предполагаю, что oexec является ложным при передаче в obdc_fetch_array. IN, глядя на ваш пост, и учебное пособие, которое вы используете, использует PDO, который отличается от использования функций ODBC_ * – Doon

0

Я использую этот код, чтобы получить результаты запроса ODBC в массив JSON:

$response = null; 
$conn = null; 

try { 
    $odbc_name = 'myODBC'; //<-ODBC connectyion name as is in the Windows "Data Sources (ODBC) administrator" 

    $sql_query = "SELECT * FROM table;"; 

    $conn = odbc_connect($odbc_name, 'user', 'pass'); 
    $result = odbc_exec($conn, $sql_query); 

    //this will show all results: 
    //echo odbc_result_all($result); 

    //this will fetch row by row and allows to change column name, format, etc:  
    while($row = odbc_fetch_array($result)) { 
    $json['cod_sistema'] = $row['cod_sistema']; 
    $json['sistema'] = $row['sistema']; 
    $json['cod_subsistema'] = $row['cod_subsistema']; 
    $json['sub_sistema'] = $row['sub_sistema']; 
    $json['cod_funcion'] = $row['cod_funcion']; 
    $json['funcion'] = $row['funcion']; 
    $json['func_desc_abrev'] = $row['desc_abreviada']; 
    $json['cod_tipo_funcion'] = $row['cod_tipo_funcion']; 

    $response[] = array('funcionalidad' => $json); 
    } 

    odbc_free_result($result); //<- Release used resources 

} catch (Exception $e) { 
    $response = array('resultado' => 'err', 'detalle' => $e->getMessage()); 
    echo 'ERROR: ', $e->getMessage(), "\n"; 
} 
odbc_close($conn); 
return $response; 

И finnally кодирующего ответ в формате JSON:

echo json_encode($response); 
Смежные вопросы