MSSQL Datenbankabfrage über ODBC per PHP Script

preko

Erfahrenes Mitglied
Hi,

ich habe folgende Konstellation:

Entwicklungsumgebung für PHP auf SUSE Linux Server.
MS SQL Datenbank auf Microsoft SQL Server
ODBC
Zugriff auf Datenbank per FreeTDS.

Ich habe folgendes PHP-Script, mit dem ich vergeblich versuche Werte/Inhalt einer Tabelle innerhalb der MSSQL Datenbank abzufragen:
PHP:
<?php
// Connection Data
$odbc_server = '20.5.1.30,49000';
$odbc_database = 'clients';
$odbc_user = 'clients_user';
$odbc_password = 'clients_pass'; 

// Variablen für Datenbank-Tabellensuche
$personenNr = '00000015';
$beztyp = 'DEB';
$bezform = '001';

// Connectionstring
$conn = odbc_connect("Driver=FreeTDS;Server=$odbc_server;Database=$odbc_database;", $odbc_user, $odbc_password)
    or die('Fehler bei der Verbindung zum Server. Server sagt: '.htmlspecialchars(odbc_errormsg()));

// Query 
$mssql_query = "SELECT * FROM `clients-table` WHERE 'PER-NUM' = '".$personenNr."' AND 'BEZ-TYP' = '".$beztyp."' AND 'BEZ-FOR' = '".$bezform."' "; 

// Verbindung zur Datenbanktabelle mit Suchstring
$result = odbc_exec($conn, $mssql_query);    

// Ergebnisabfrage
while($row = odbc_fetch_array($result)) {
    echo "=> ".$row['PC-ANREDE']." ".$row['PC-VORNAME']." ".$row['PC-NAME']."<br />"."\n";
}

// Beenden der Datenbankverbindung
odbc_free_result($result);
?>

Irgendwie bekomme ich keinen Output. Die Felder innerhalb der Tabelle und Tabellenname, etc. sind korrekt geschrieben - habe ich überprüft, daran kann es also nicht liegen.

Führe ich folgende Codezeile (anstelle der o. g. Query) aus, bekomme ich eine korrekte Ausgabe der einzelnen Tabellen der Datenbank, d. h. es wird eine Verbindung zur Datenbank hergestellt und der Zugriff auf diese ist möglich:
PHP:
// Connection Data
$odbc_server = '20.5.1.30,49000';
$odbc_database = 'clients';
$odbc_user = 'clients_user';
$odbc_password = 'clients_pass'; 

// Variablen für Datenbank-Tabellensuche
$personenNr = '00000015';
$beztyp = 'DEB';
$bezform = '001';

// Connectionstring
$conn = odbc_connect("Driver=FreeTDS;Server=$odbc_server;Database=$odbc_database;", $odbc_user, $odbc_password)
    or die('Fehler bei der Verbindung zum Server. Server sagt: '.htmlspecialchars(odbc_errormsg()));

// Retrieves table list.
$result = odbc_tables($conn);
$tables = array();

   while (odbc_fetch_row($result))
     array_push($tables, odbc_result($result, "TABLE_NAME") );

// Begin table of names.
     echo "<table style='border: 1px solid #000000;'>";
     echo "   <tr>";
     echo "      <th>Nr.</th>";
     echo "      <th>Tabellenname</th>";
     echo "   </tr>";

// Create table rows with data.
   foreach( $tables as $tablename ) {
     $tablecount = $tablecount+1;
     echo "   <tr>";
     echo "      <td>".$tablecount."</td>";
     echo "      <td>".$tablename."</td>";
     echo "   </tr>";
   }

// End table.
     echo "</table>";

// Beenden der Datenbankverbindung
odbc_free_result($result);
?>

Hat jemand eventuell eine zündende Idee was ich übersehen haben könnte?

Beste Grüße!
 
Zuletzt bearbeitet:
Moin preko,

für mich sieht es so aus, als würde dieses hier
Code:
...
...= "SELECT * FROM `clients-table` WHERE 'PER-NUM' = '".$personenNr."' AND 'BEZ-TYP' = '".$beztyp."' AND 'BEZ-FOR' = '".$bezform."' ";         
...
... einen Stringvergleich von " ...'PER-NUM' ='00000015' AND 'BEZ-TYP' ='DEB' .." machen.

"PER-NUM" und "BEZ-TYP", sollten sie tatsächlich ein Minuszeichen im Namen haben, sind doch Tabellenfelder.
Wenn diese Sonderzeichen im Namen haben oder reservierte Worte sind, dann sollte dieses Feld in doppelten Anführungszeichen stehen oder auch mit den `-Zeichen, die die um clients-table verwendest (und möglichst auch mit einem Alias angegeben sein (so kenne ich es von anderen Datenbanken, die "FreeTDS" kenne ich nicht.

richtiger also vielleicht:
SQL:
SELECT * FROM `clients-table`  WHERE `PER-NUM` = '....' AND `BEZ-TYP`= '...'..
-- oder
SELECT * FROM `clients-table` c WHERE c."PER-NUM" = '....' AND c."BEZ-TYP"= '...'..

Grüße
Biber
 
Hi Biber,

zunächst einmal Danke für die Antwort.

Der erste Fehler ist jedoch mittlerweile entdeckt: es fehlt bei der Query das abschließende Semmikolon! ;-)

Deine Anregungen funktionieren nicht, habe alle Varianten von Hochkommata und Anführungszeichen oben (bereits vorher schon) ausprobiert. Generiert keine Datenausgabe. :(

Wenn ich jedoch die Query so formuliere:

SQL:
...
$mssql_query = "SELECT * FROM DAT_PSM; ";
...

dann wird tatsächlich der Datenbestand der Datenbank ausgelesen und kann ausgegeben werden! o_O Sobald also die WHERE-Bedingung(en) ins Spiel kommen, ist es aus...

Also wenn noch irgendwo Ideen herumirren, die mir helfen könnten...ich höre zu! ;)


Beste Grüße!
 
Hi,

In T-SQL verwendet man für Tabellen und Spaltennamen eckige Klammern. Ist die Option QUOTED_IDENTIFIER gesetzt, kann man auch doppelte Anführungszeichen verwenden.
Strings werden von einfachen Anführungszeichen eingeschlossen.
Die verwendung von ` in T-SQL ist mir nicht bekannt.

Tabellen und Spalten müssen immer dann begrenzt werden, wenn sie nicht eindeutig identifizierbar sind. Da du ein "-" im Spaltennamen hast, musst du da Begrenzungszeichen setzen.

Dein Query müsste also, wenn ich es richtig im Kopf habe, wie folgt aussehen:
PHP:
$mssql_query = "SELECT * FROM [clients-table] WHERE [PER-NUM] = '".$personenNr."' AND [BEZ-TYP] = '".$beztyp."' AND [BEZ-FOR] = '".$bezform."' ";

VG
Nino
 
Hi Nino14,

you made my day!!!! :D

Das war es - eckige Klammern!!! Wäre ich nie drauf gekommen.

Tatsächlich müsste noch das ganze so lauten (mit abschließendem Semmikolon):
SQL:
...
$mssql_query = "SELECT * FROM [clients-table] WHERE [PER-NUM] = '".$personenNr."' AND [BEZ-TYP] = '".$beztyp."' AND [BEZ-FOR] = '".$bezform."'; ";
...


Vielen, vielen Dank!!!

Beste Grüße!
 

Neue Beiträge

Zurück