Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Datenbankzugriff PHP MS SQL Server (SQLServer)





Frage

Hallo an alle, ich habe seit einigen tagen ein Problem. [b]Wie erstelle ich unter PHP einen Datenbankzugriff zu MS SQL Server 2000 ?[/b] (Bitte den Hinweis im Code "//Hiermit komm ich nicht klar" beachten) [code] <? /* showforen.php */ //Herstellen der MySQL verbindung //Hiermit komm ich nicht klar :-( //$con = mysql_connect($host, $user, $pass); //$con = mssql_connect ("<ip of the server SQL>", "sa", ""); $con = mssql_connect("127.0.0.1", "mein login Name unter Windows?", ""); $db = mssql_select_db("Forum_mit_MSSQLServer", $con); //Herauslesen der Foren $res = mysql_query("select * from foren"); //Ausgeben der Foren mit Hyperlink while($row = mysql_fetch_array($res)) { echo "<a href=\"showthreads.php?fid=".$row["id"]."\">"; echo $row["name"]."</a><br>"; } ?> [/code] Ich habe immer nur Tips zu PHP und MySQL gefunden. Aber dieses brauch ich ja nicht. Hilfee ... und danke dafür.

Antwort 1 von DrGonzo

Hallo,

in der Variable $con wird der DB-Zugriff konfiguriert. Angegeben werden Servername/IP, Benutzername und Passwort der gewünschten DB. Eventuell muss noch eine ODBC Schnittstelle konfiguriert werden.

In Deinem Script scheint der SQL-Server auf Deinem lokalen Rechner zu laufen - daher 127.0.0.1. Als Zweites kommt nicht Dein Anmeldename unter Windows, sondern der Benutzername der DB (=sa?). Wenn Du kein Passwort vergibst, bleibt der dritte Parameter leer.
Die Benutzerdaten werden im SQL-Server konfiguriert (Benutzername, Passwort, Rechte für jeweilige DB, etc.).

Gruß

Antwort 2 von Jule2

Danke für deine Zeit.
Deine Hilfe hat mir ein wenig geholfen.

Ja, alles ist zu Testzwecken noch lokal installiert: MS SQL Server, Apache2, PHP 4

Ich habe eine ODBC-Schnittstelle zu der Datenbank eingerichtet. Diese Schnittstelle funktioniert jetzt auch über PHP.
Also, es wird eine Verbindung erzeugt.
Bei dem ODBC-Treiber habe ich angegeben, dass die WinNT-Authentifizierung genutzt werden soll. Somit wird das Passwort und der User von Windows genutzt.
Diese ODBC-Verbindung heißt "PHP_MSSQLServer_ODBC"

Nur, es werden keineDaten der Tabelle ´foren´ ausgegeben.
Ich habe einmal zu Testzwecken einen Counter in die Schleife gestellt.
Er gibt mir auch genau so viel Zahlen aus, wie Zeilen in der Tabelle vorhanden sind.

Warum gibt er denn keine Werte aus?


-------------------------------------------------------------------------

<?
/* showforen.php */


  //---Herstellen der MSSQLServer über ODBC---
  //SERVER=HNPC4                    =  Name des lokalen Servers(evtl. Rechnername)
  //DATABASE=Forum_mit_MSSQLServer  =  Name der unter MSSQLServer angelegten Datenbank
  //die letzten beiden Werte ´´,´´  =  User und Passwort
  //                                   (können freigelassen werden, wenn bei der ODBC-Konfiguration die WinNT-Authentifizierung eingestellt ist)
  $con = odbc_connect(´DRIVER={SQL Server};SERVER=HNPC4;DATABASE=Forum_mit_MSSQLServer´,´´,´´);

  if ($con)
  {
    echo "odbc connected<br>";
    $rs = odbc_exec($con,´SELECT * FROM foren´);

    $i = 1;
    while($row = odbc_fetch_row($rs) )
    {
      echo $i++." ";
      echo $row->fo_id."<br>";
      
    }

/*
    while($row = odbc_fetch_row($rs))
    {
      //echo ´geht das nun?´;
      //echo $row->fo_id."<br>";
        echo "<a href=\"showthreads.php?fo_id=".$row["fo_id"]."\">";
        echo $row[´fo_name´].´</a><br>´;
      //echo $row->fo_name."<br>";
    }
*/


  }
  else {
    echo "odbc not connected<br>";
  }
?>


Antwort 3 von DrGonzo

Hm, sieht eigentlich OK aus. Probier mal anstatt
echo $row->fo_id."<br>";



echo $row["fo_id"]."<br>"; 

oder:
echo ($row["fo_id"]."<br>"); 


Normalerweise mache ich immer Klammern um zusammengesetzte, längere echo Befehle.

...dass es an den Style-Sheets liegt (weisse Schrift auf weissem Hintergrund), schliesse ich jetzt mal aus...
;-)

Gruß

Antwort 4 von Jule2

Hab es ausprobiert ... keine Wirkung.

Die Bildschirmausgabe:

odbc connected
1
2
3
4

Genau so viele Werte/Zeilen/Tupel sind in der Datenbank gespeichert.


--------------------------------------------------------------------

So wie ich gelesen habe, bedeutet ´odbc_fetch_row´ nur, dass eine DatensatzReihe bereitgestellt wird.
Danach sollte man dieses anwenden:

$name=odbc_result(´fo_name´); // angenommen die
//Datenbank hat eine Spalte namens fo_name
echo " $name ";

Nur, dieses geht auch nicht. Es wird ein Fehler ausgespuckt:
"Wrong parameter count for odbc_result()"

Es sollte in diesem Fall eine Ausgabe im IE erfolgen:

odbc connected
1 (Inhalt der Spalte fo_name / erste Zeile)
2 (Inhalt der Spalte fo_name / zweite Zeile)
3 (Inhalt der Spalte fo_name / dritte Zeile)
4 (Inhalt der Spalte fo_name / vierte Zeile)


--------------------------------------------------------------------

Wenn jemand noch eine Hilfe oder einen noch so kleinen Ratschlag hat, wäre ich sehr dankbar.

Antwort 5 von Jule2

Es wird definitiv nichts aus der Datenbank ausgelesen.
Daran hapert es.

Wie bekomme ich dieses in den Griff ... wenn jemand Vorschläge in jeder Hinsicht entgegen.

Einen Gruß, Julia

Antwort 6 von rabies

Hey,

Leider hab´sch nicht wirklich groß Plan von MsSQL-Servern in Verbindung mit PHP... oder gar noch einer ODBC-Schnittstelle, die das ganze regelt.
Aber ich würde noch einmal so weit zurückgehen, mir den Datenbankserver direkt anzuschauen, .. und ihn dann auch direkt anzusprechen... via mssql_connect() ...

und dann, wenn die Verbindung steht, halt mit den üblichen Sachen rumspielen. D.h.: mssql_fetch_array und so weiter... Da oben sprichst du die Spalten ja auch mim Namen an .. also würd ich dann bei mssql_fetch_array noch als Ergebnis-Typen MSSQL_ASSOC angeben, was dir nen assoziatives Array zurückgibt.

PHP-Referenz zu MsSQL -> lesen. Das könnte Dir sicher nen ganzes Stück weiterhelfen.

Greets,
Sven.

Antwort 7 von DrGonzo

Hi Julia,

ich denke, dass die DB schon richtig ausgelesen wird, da ja die Anzahl der Ausgabezeilen richtig ist. Es hapert meiner Meinung nach an der Ausgabe der Inhalte.

Probiere doch mal folgendes: Mach aus dieser Zeile
while($row = odbc_fetch_row($rs)) 

zwei Zeilen:
$row = odbc_fetch_row($rs);
while($row)


oder schau mal hier:
Hier gibts Tips und ein Beispiel

Gruß
Christian

Antwort 8 von Jule2

habe mal mit "$s = mssql_connect($myServer, $myUser, $myPass);" experimentiert.

Da kommt jedesmal folgende Fehlermeldung:
Call to undefined function: mssql_connect()

Ich finde ja auch immer wieder in den Hilfen, dass mit mssql_connect() gearbeitet wird.
Nur bei mir ... ?

Meine bisher installierte Versionen:
-Apache_2.0.44-win32-x86-no_ssl.msi
-php-4.3.3-Win32.zip
-MSSQLServer2000

Vielleicht hat jemand Tips zur Einrichtung des Apache-Servers und das bekanntmachen von PHP?

Oder gibt es irgend etwas ...

Antwort 9 von rabies

Da kommt jedesmal folgende Fehlermeldung:
Call to undefined function: mssql_connect()

deutet stark darauf hin, dass die Extension nicht in php "eingebettet" ist... dazu musst du die php.ini öffnen (liegt wahlweise im Windows-Verzeichnis, oder in dem Verzeichnis, in dem Du PHP liegen hast) ... dort sind dann irgendwo die ganzen extensions gelistet... Vor denen, die deaktiviert sind, ist dann ein Simikolon. Dieses musst Du entfernen - danach sollte das auch funktionieren, und PHP sollte dann auch die Funktion kennen. ... evtl. musst Du auch noch angeben, in welchem Verzeichnis die extensions liegen.

Sven.

Antwort 10 von DrGonzo

Wenn Du Dir nicht sicher bist, ob Deine jetzige Konfiguration richitg eingerichtet ist, schau mal hier. Bei dem Paket ist allerdings eine MySQL DB dabei und kein MS SQL-Server. Aber warum nutzt Du eigentlich den MS SQL-Server? PHP wird meistens mit MySQL benutzt.

Antwort 11 von Jule2

Hallo Christian,

bei deinem Tip schmeist er mir ca. 13000 Zeilen raus und bricht dann ab:

Fehlermelfung:
Fatal error: Maximum execution time of 30 seconds exceeded in C:\php\Apache Group 2044\Apache2\htdocs\Forum mit MSSQLServer\showforen.php on line 35

In dieser 35.Zeile steht:
echo $row["fo_name"]."<br>";

----------------

wenn ich statt dieser 35 Zeile dieses schreibe:
echo $row."<br>";

zeigt er mir 130000 mal den Flag 1 (true) an, den ja $row = odbc_fetch_row($rs); liefert.

Das true steht dafür, dass er Zeilen in der Datenbank gefunden hat. Und zwar 4 Stück und keine 130000.

Wie bekomm ich den Inhalt dieser Datenbank angezeigt?

Gruß Julia

Antwort 12 von rabies

Probier mal print_r($row) aus.. dann sollte Dir die Struktur des Arrays angezeigt werden... und welche Daten sich darin befinden.

Antwort 13 von Jule2

@ DrGonzo
Weil ich den SQLSERVER instralliert habe ... wollte nicht extra den MySQL auch drauf spielen.

Ich studiere mal deinen Link.

Aber, das muss doch gehen!?!?

Aber danke Jungs, dass ihr mir versucht zu helfen, danke.

Antwort 14 von Jule2

@rabies

getestet

da gibt er mir 4mal den flag 1 aus ... was ja für true, da gibt es eine Zeile steht.

Antwort 15 von hxx

Hallo Julia,
ersetze doch einmal die while-Schleife zum auslesen der Arrays $row durch den den Code hier:

foreach ($row as $key=>$value) {
echo "$key . ´= ´ . $value;
}

PS.: wampp kann ich nur empfehlen.

Antwort 16 von rabies

mhm... klingt sehr wunderlich. Wo hast Du das hingepackt? Innerhalb von der While-Schleife?

Ansonsten sollte der eigentlich den Inhalt ausgeben... und nicht, ob das nun passt, oder nicht.

Antwort 17 von rabies

Ach... und noch dazu:
Das true steht dafür, dass er Zeilen in der Datenbank gefunden hat. Und zwar 4 Stück und keine 130000.

Gibt der nicht eigentlich auch true zurück, wenn er keinen Datensatz gefunden hat? Ich GLAUBE, false (also 0) wird nur zurückgegeben, wenn da die ganze Abfrage falsch gelaufen ist.

Ich bitte um Aufklärung, falls ich jetzt Schwachsinn erzähle.

Sven.

Antwort 18 von DrGonzo

Hey Jule,

puh, jetzt musst Du mir etwas auf die Sprünge helfen, da ich in letzter Zeit nur in ASP geschrieben habe. Da ist es so, dass man in der Ausgabeschleife den "DB-Zeiger" um eins erhöhen muss (rs.movenext), da sonst eine Endlosschleife rauskommt (was bei Dir passiert ist, deshalb der Timeout-Fehler). Ist das bei PHP auch so?
Alternativ, und um das zu umgehen, siehe Antwort 15. Ein foreach Konstrukt liefert keine Endlosschleife!

Wäre doch gelacht, wenn wir das nicht hinkriegen... :-)

Gruß,
Christian

Antwort 19 von Jule2

@hxx (Antwort15)
wenn ich die while-Schleife duch diesem

$row = odbc_fetch_row($rs);
print_r($row)."<br>";

foreach ($row as $key=>$value) {
echo $key . ´= ´ . $value;
}

ersetzte, dann erscheint folgende Fehlermeldung.
"Warning: Invalid argument supplied for foreach()"

Was passiert in foreach eigendlich?

--------------------------------------------------------------
@rabies (Antwort 16)
ja, hatt ich innerhalb von while

@rabies (Antwort 17)
weiß ich auch nicht mehr genau ...
Aber, wenn der Select falsch ist, gibts eine andere Fehlermeldung.
Aber der Wert 1 (geliefert von $row = odbc_fetch_row($rs))
ist schon OK ... es stehen ja 4 Zeilen in der DB.

------------------------------------------------------------
@DrGonzo (Antwort 18)
habe davon, dass der Zeiger um eins erhöt werden muss bisher nichts gelesen.
Alle BSP´s waren ohne Zeigerincrementierung ++

Antwort 20 von Jule2

Wenn es mit dem MS SQL Server nicht geht, dann werd ich mal den MySQL installieren.

(Nicht, dass es dann Schwierigkeiten mit dem MSSQLS. gibt)

Antwort 21 von DrGonzo

@rabies (Antwort 17)
True gibt er zurück, wenn Datensätze gefunden wurden. False, wenn keine gefunden wurden. Bei einem Fehler kommt ne Meldung, oder es passiert gar nix.

@jule (Antwort 19)
Bei foreach werden genau soviele Durchgänge gemacht, wie Ergebnisse vorhanden sind.

@jule (Antwort 20)
Never change a running system...!
Denke, es liegt nur an einem blöden Fehler in der Programmierung! Ich guck mal bei mir zuhause im PHP-Quelltext. Da poste ich dann mal die DB-Ausgabe. Wird aber wahrscheinlich Samstag werden, da wir durch eine Server-Migration heute lange schuften müssen.

Antwort 22 von Jule2

@rabies (Antwort 17)

Hallo Sven, folgendes hab ich gefunden ...

The odbc_fetch_rows() function is used to return records from the result-set. This function returns true if it is able to return rows, otherwise false.

The function takes two parameters: the ODBC result identifier and an optional row number:
odbc_fetch_row($rs)

Antwort 23 von Jule2

@DrGonzo (A21)

Macht nichts wenn es erst Samstag wird ... ich verzweifle deswegen schon 3 Tage ;-)

Ich kann es nur noch einmal sagen, danke für eure Zeit und Mühe.



Folgende PHP-Version gibt mir dieses im IE aus:

--------
odbc connected
1 |1
2 |1
3 |1
4 |1
---------
In der SQL Server - Datenbank steht die Tabelle:

fo_ID fo_name
1 Forum01
2 Forum02
3 Forum03
4 Forum04
---------

<?
/* showforen.php */


  //---Herstellen der MSSQLServer über ODBC---
  //SERVER=HNPC4                    =  Name des lokalen Servers(evtl. Rechnername)
  //DATABASE=Forum_mit_MSSQLServer  =  Name der unter MSSQLServer angelegten Datenbank
  //die letzten beiden Werte ´´,´´  =  User und Passwort
  //                                   (können freigelassen werden, wenn bei der ODBC-Konfiguration die WinNT-Authentifizierung eingestellt ist)

  $con = odbc_connect(´DRIVER={SQL Server};SERVER=HNPC4;DATABASE=Forum_mit_MSSQLServer´,´´,´´);

  if ($con)
  {
    echo "odbc connected<br>";
    $rs = odbc_exec($con,´SELECT * FROM foren´);

    $i = 1;


    while($row = odbc_fetch_row($rs))
    {
      echo $i++." |";
      echo $row."<br>";
    }

/***************
$row = odbc_fetch_row($rs);
//print_r($row)."<br>";

foreach ($row as $key=>$value) { 
echo $key . ´= ´ . $value; 
} 
//hier gibts die Fehlermeldung: Invalid argument supplied for foreach()
**************/

    }
    else {
      echo "odbc not connected<br>";
    }
?>

---------



Ziel ist: den Inhalt der gesamten Spalte fo_name im IE auszugeben.
----------
Forum01 <Link zur entsprechenden Seite>
Forum02 <Link zur entsprechenden Seite>
Forum03 <Link zur entsprechenden Seite>
Forum04 <Link zur entsprechenden Seite>
----------

Antwort 24 von DrGonzo

Hi Jule,

versuchs mal so:


$con = odbc_connect("DRIVER={SQL Server};SERVER=HNPC4;DATABASE=Forum_mit_MSSQLServer","","");
if ($con)
{
	echo "odbc connected<br>";
	$rs = odbc_exec($con,"SELECT fo_name FROM foren");
	//$i = 1;
	//while($row = odbc_fetch_row($rs))
	//{
	//echo $i++." |";
	//echo $row."<br>";
	//}
	$row = odbc_fetch_row($rs);
	foreach($row as $name){
	echo $name;
		}
	}
else 
{
	echo "odbc not connected<br>";
}


Antwort 25 von Jule2

Hallo ... ich bin wieder da ... hat ja eine Weile gedauert.

Ich habe einmal die Antwort 24 von DrGonzo genau so übernommen.

Und das selbe Resultat wie oben - Fehlermeldung in der Zeile :

foreach($row as $name){

Warning: Invalid argument supplied for foreach() in C:\php\Apache Group 2044\Apache2\htdocs\Forum mit MSSQLServer\3showforen.php on line 25

Bei dir geht es? Ich kann nicht nachvollziehen, warum bei mir nicht. Nutze den IE.

Meine bisher installierte Versionen:
-Apache_2.0.44-win32-x86-no_ssl.msi
-php-4.3.3-Win32.zip
-MSSQLServer2000

-------------------------------------------------------------------

Aber dafon abgesehen, es kann doch nicht an der Schleife liegen, dass er den Inhalt der Datenbank nicht ausgibt?

DrGonzo - Bei dir geht Antwort 24?

Einen Gruß an alle, Julia

Antwort 26 von DrGonzo

Hallo,

ich habe bei mir mal in einen (funktionierenden) Quelltext geguckt und dann auf Deinen angepasst. Tja, im Moment bin ich auch ratlos. Ich denke, dass der Fehler nicht direkt was mit der Scheife zu tun hat, sondern eher mit der Ausgabe der DB/Variablen.

Gruß

Antwort 27 von Jule2

Ja, da sind wir beide auf einem Nenner.

Nur, überall im Netzt finde ich diese Art der Datenausgabe.

Ich werde mich zu späterer Zeit noch einmal darum kümmern.
Aber wenn du oder jemand anderes einen Ratschlag hat ... ich werde immer wieder einmal hier vorbeischauen.

Und vielleicht kommt mir ja über nacht eine neue Idee.

Die Hoffnung stirbt zuletzt.

Antwort 28 von f_mal

hi,

vieleicht hilft dir das weiter:


<?php
$host= "WATCHDOG\ADMINDB";
$user= "sa";
$password= "pw";
$db_name = "SKDatabase";
// Database Verbindung mit MSSQL-Server
$conn_id = mssql_connect($host,$user,$password);
mssql_select_db($db_name,$conn_id);


/* mssql_connect ($host, $user, $password);
mssql_select_db ("SKDatabase"); */
$Qry = "SELECT Distinct
MachineGroup.MachineID,
Machine.DomainName,
Machine.MachineName,

FROM
MachineGroup

ORDER by Machine.MachineName";

//DS auslesen in tabelarisches form.
$result= mssql_query($Qry);
while($row= mssql_fetch_assoc($result)){
$publisher = $row[Publisher];
$ver = $row[VersionString];
$prodname = $row[ProductName];
$machinename = $row[MachineName];
$domain = $row[DomainName];


print"<tr width = 100%>
<td width = 100%>$domain</td>
<td width = 100%>$machinename</td>
<td width = 100%>$publisher</td>
<td width = 100%>$prodname</td>
<td width = 100%>$ver</td>
</tr>";
}
?>


viel spass. f_mal

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: