MSSQL to XML

0

Witam, na potrzeby aplikacji moblilnej, z racji, że nie ma możliwości bezpośredniego dostępu do bazy ms sql, próbuję za pomocą php wygenerować te dane w xml, a następnie chce je odczytać przez c#.
Na razie jestem na tym pierwszym etapie.
Z wielu przykładów w Internecie skleciłem taki skrypt:

<?php
$myServer = "*********.**********.*****.***";
$myUser = "*****";
$myPass = "*****";
$myDB = "*******"; 

$connectionInfo = array("UID" => $myUser, "PWD" => $myPass, "Database"=>$myDB);
// Coder Mustafa Turan

// http://mustafaturan.wordpress.com/
// get query from URL  
//if(empty($_GET['q'])) exit(); 
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; 
    /* 
    sample query: 
    $query = “SELECT * FROM table_name”; 
    */
 $query = "SELECT * FROM pracownicy"; 
    // connection open to MSSQL 
    $link = sqlsrv_connect($myServer, $connectionInfo);

    // get the query result 
    $result = sqlsrv_query($link, $query); 
    $i = 0;

    // get all columns readed from query 
    while ($column = sqlsrv_field_metadata($result)){ 
        $columnx[$i] = $column->name; 
        $i++; 
    } 
    $column = null;

    // read all rows with its column name 
    while (($row = sqlsrv_fetch_array($result, MSSQL_BOTH))) 
    { 
        echo "\n <new_row>"; 
        foreach($columnx as $C){ 
            // $C                : column name 
            // $row[$C]            : it give the current rows’ column variable 
            // sample output    : <column_name>column_content</column_name> 
            echo "\n  <" . $C . ">" . $row[$C] . "</" . $C . ">"; 
        } 
        echo "\n </new_row>"; 
    }

    // close the current connection 
    sqlsrv_cancel($result); 
    sqlsrv_close($link); 
echo "\n</xml>"; 
?>

powoduje to jednak tylko wyświetlenie błędu: Notice: Trying to get property of non-object in C:\xampp5.5\htdocs\Hurtownik\test4.php on line 28

Z góry dziękuję za pomoc :)

0

angielski znasz?

Trying to get property of non-object - próba odczytu właściwości nie-obiektu

skoro to nie jest obiekt, to warto by się zainteresować co zwraca funkcja sqlsrv_field_metadata

po szybkiej wizycie w dokumentacji http://php.net/manual/en/function.sqlsrv-field-metadata.php dowiadujemy się, że zwraca TABLICE

no to teraz zostaje wygooglować (jeżeli nie umiemy) jak odczytać wartość z tablicy w php. zwróć uwagę też, że dostaniesz tablicę tablic, a nie samą tablicę (to while PRAWDOPODOBNIE niepotrzebne, nie wiem, nigdy nie używałem tej funkcji)

edit: no i masz tu dziurę XSS, co raczej szybko wyjdzie, jak zaczniesz dostawać niepoprawny XML

i jeszcze jedno - php ma jakieś tam wbudowane funkcje do generowania XML - nigdy z nich nie korzystałem, ale warto się pewnie zainteresować

0

Dzięki za odpowiedź. Niestety, nie udało mi się rozwiązać problemu.
Próbowałem przyjrzeć się funkcjom, które generują xml, jednak nie są one w stanie tego zrobić.
Generalnie, tablica, którą otrzymuję w rezultacie wykonania zapytania wygląda tak:

 Array
(
    [0] => Array
        (
            [0] => 1
            [ID] => 1
            [1] => Nowe
            [nazwa] => Nowe
        )

    [1] => Array
        (
            [0] => 2
            [ID] => 2
            [1] => W trakcie realizacji
            [nazwa] => W trakcie realizacji
        )
)

Dziwią mnie tutaj te zdublowane pola...

W momencie, kiedy próbuję wygenerować z tego xml, na wyjściu otrzymuję:

<5>0<5>ID1nazwa

mój kod:

<?php

error_reporting(E_ALL);

$myServer = " ";
$myUser = " ";
$myPass = " ";
$myDB = " "; 
$connectionInfo = array("UID" => $myUser, "PWD" => $myPass, "Database"=>$myDB);
 
 $query = "SELECT * FROM stanZamowienia"; 
    // connection open to MSSQL 
$link = sqlsrv_connect($myServer, $connectionInfo) or die("Could not connect to host.");

    // get the query result 
    $result = sqlsrv_query($link, $query)or die ("Could not find or access the database."); 
 
 $i =0;
$wynik =array();
while($row= sqlsrv_fetch_array($result)){
	$wynik[$i] = $row;
	$i++;
}
$toXML = array();
foreach($wynik as $k => $v)
{
	foreach($v as $key => $val)
	{
		$toXML[$key] = $val;
	}

}
$xml = new SimpleXMLElement('<root/>');
array_walk_recursive($toXML, array ($xml, 'addChild'));
print $xml->asXML();

//echo '<pre>';
//print_r($wynik);
//echo '</pre>';
//exit;

    // close the current connection 
sqlsrv_cancel($result); 
sqlsrv_close($link); 

 
?>

1 użytkowników online, w tym zalogowanych: 0, gości: 1