Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

PHP - MSSQL - Keine Daten bei gespeicherter Prozedur

Frage Entwicklung PHP

Mitglied: reboot

reboot (Level 1) - Jetzt verbinden

23.04.2012, aktualisiert 16:21 Uhr, 3910 Aufrufe, 15 Kommentare

Bei dem Aufruf einer gespeicherten Prozedur werden mir keine Daten zurückgeliefert.

Hallo zusammen

Das Problem habe ich bereits längere Zeit, doch langsam beginnt es echt zu nerven.

Wir arbeiten hier mit PHP und MSSQL. Für die Verbindung zwischen PHP und MSSQL habe ich vor einiger Zeit den SQL-Treiber für PHP heruntergeladen und installiert (http://msdn.microsoft.com/de-de/library/cc296170%28v=sql.90%29.aspx)

Nur haben wir seither folgendes Problem. Nehmen wir an, wir haben folgende Prozedur:
ALTER PROCEDURE [dbo].[meineProzedur] 
	@parameter INT, 
	@parameter2 VARCHAR(30)       
AS 
BEGIN	 
 
	DECLARE @count INT 
	 
	SET @count = ( 
		SELECT	COUNT(spalte) AS c 
		FROM	tabelle 
		WHERE	spalte1 = @parameter 
		 
	IF @count = 0 
		BEGIN 
			SELECT 'empty' AS response 
			RETURN 
		END 
		 
	UPDATE tabelle 
	SET spalteXY = @parameter2 
	WHERE spalte1 = @parameter 
 
	SELECT 'success' AS response 
 
RETURN
Wenn ich diese im Management Studio ausführe, bekomme ich je nach Wahl der Parameter die Rückgabe "success" oder "empty".
Aber im PHP kommt jeweils nichts zurück! An PHP werden so wie es aussieht kein Resultat/keine Daten gesendet.

Eine kleine Prozedur wie z.B. nur einen Select funktioniert problemlos. Andernfalls bekomme ich bei folgender Prozedur auch keinen Wert zurück:
ALTER PROCEDURE [dbo].[meineProzedur] 
	@parameter INT, 
	@parameter2 VARCHAR(30)       
AS 
BEGIN	 
		 
	UPDATE tabelle 
	SET spalteXY = @parameter2 
	WHERE spalte1 = @parameter 
 
	SELECT 'success' AS response 
 
RETURN
Hatte jemand bereits das gleiche Problem? Woran könnte es liegen?
Wäre sehr dankbar um Hilfe.

Ich nutze PHP in der Version: 5.2.9
Und MSSQL 2008


Vielen Dank
Gruss reboot
Mitglied: ITSchlumpf
23.04.2012 um 16:30 Uhr
Hey Reboot,

bin da jetzt kein Profi drinne, aber es kann sein, dass die Statements im PHP ein wenig anderst aussehen müssen.
Funktionieren denn andere Abfragen?


Gruß
Schlumpf
Bitte warten ..
Mitglied: reboot
23.04.2012 um 16:44 Uhr
Hey ITSchlumpf

Ja, da hast du recht... aber das hier oben ist auch T-SQL und nicht PHP. Die gespeicherten Prozeduren werden auf dem SQL-Server gespeichert/geschrieben und von PHP nur aufgerufen.

Ja, andere Abfragen wie z.B. ein ganz normaler Select funktionieren.



Gruss reboot
Bitte warten ..
Mitglied: ITSchlumpf
23.04.2012 um 16:53 Uhr
Kannst du vll mal deinen PHP-Code posten, vll ist dort ein fehler drinne.

Gruß
Schlumpf
Bitte warten ..
Mitglied: Biber
23.04.2012 um 17:40 Uhr
Moin reboot,

wenn deine StP Rückgabewerte nach außen liefern soll, dann musst du diese auch angeben.

Falls also "response" nach aussen/zum Aufrufer gelangen soll, dann solltest du eine Variable @response mit dem Schlüsselwert OUTPUT deklariren.

Beispiel:
@response varchar(10) OUTPUT

Befüllen kannst du sie in der StP mit
SELECT @response = 'success' oder ähnliches.

Ich kann auf Anhieb nicht erkennen, was genau den Charme einer Text-Rückgabe 'success' bzw. 'empty' ausmacht.
Meine Mädels hätten wahrscheinlich eher 0 und 1 genommen.

Grüße
Biber
Bitte warten ..
Mitglied: reboot
24.04.2012 um 08:24 Uhr
Hallo ITSchlumpf

Ok. Ich habe den Code nun aus meinen Klassen herausgesucht und eine Test-Datei erstellt, die folgendermassen aussieht.

01.
$info = array
02.
	'username' => 'xxxx'
03.
	'password' => 'xxxx'
04.
	'host' => 'xxxx, 
05.
	'database' => 'xxxx' 
06.
); 
07.
 
08.
$connection = sqlsrv_connect( 
09.
	$info['host'], 
10.
	array
11.
		'UID' => $info['username'], 
12.
		'PWD' => $info['password'], 
13.
		'Database' => $info['database'
14.
15.
); 
16.
 
17.
$query = "meineProzedur 'parameter'"
18.
$result = sqlsrv_query($connection, $query); 
19.
 
20.
while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) 
21.
22.
	var_dump($row); 
23.
	echo '<hr />'
24.
}
So wird mir nichts ausgegeben. Wenn ich aber bei der oben geposteten Prozedur folgendes einfüge, bekomme ich "test" in der Spalte "response" zurück.
Es ist sobald ich einen Select, ein Update oder ein Delete durchführe, werden die unteren Selects nicht mehr beachtet/an PHP zurückgegeben...

 
	... 
 
	SELECT 'test' AS response 
 
	SET @count = (  
		SELECT	COUNT(spalte) AS c  
		FROM	tabelle  
		WHERE	spalte1 = @parameter  
	)  
 
	...

Gruss reboot
Bitte warten ..
Mitglied: reboot
24.04.2012 um 08:30 Uhr
Hallo Biber

Danke für den Tipp, aber wenn ich versuche die Variable zu deklarieren kommt bei mir ein Syntaxfehler.

DECLARE @response VARCHAR(30) OUTPUT
Fehler: Falsche Syntax in der Nähe von 'OUTPUT'

Zum Charme meiner Text-Rückgabe.
Klar könnte ich 0 oder 1 verwenden. Aber bei komplexeren Prozeduren gibt es z.B. 4 oder 5 mögliche Rückgaben.
Und da ich kein Fan bin von nicht aussagekräftigen Zahlen nutze ich Strings.
Wenn ich von einer Prozedur "error" oder "no access" zurück bekomme, sagt mir das viel mehr als z.B. "3" oder "4".


Gruss reboot
Bitte warten ..
Mitglied: ITSchlumpf
24.04.2012 um 10:48 Uhr
Moin Reboot,

funktioniert die Abfrage wenn du sie direkt im PHP schreibst und dann ausführst?
Bsp. :

01.
$dbconnect = mssql_connect($SQL_Server, $SQL_User, $SQL_Pw); 
02.
mssql_select_db($SQL_db); 
03.
$sql = "Select blalbalbla"; 
04.
$result = mssql_query($sql); 
05.
$row = mssql_fetch_array($result, MSSQL_ASSOC);
Wäre das evtl. eine Möglichkeit?

Gruß
Bitte warten ..
Mitglied: reboot
24.04.2012 um 13:53 Uhr
Tag ITSchlumpf

Nein, das geht leider auch nicht. Kommt auch kein Resultat zurück. Allgemein ist mir jetzt folgendes nochmals klar geworden.

Sobald ein UPDATE, INSERT oder DELETE-Befehl ausgeführt wurde, wird ein sich darunter befindender SELECT nicht mehr an PHP zurückgeliefert.
Als ob ein UPDATE-Befehl etc.. einen RETURN verursachen würde. Was natürlich schwachsinn ist, denn wenn ich das ganze im Management Studio ausführe funktioniert alles tadellos.

Sprich folgendes funktioniert nicht:
1. Update
2. Select

Folgendes funktioniert:
1. Select
2. Update


Gruss reboot
Bitte warten ..
Mitglied: ITSchlumpf
24.04.2012 um 14:24 Uhr
Kann es sein, dass er die Verbidung schließt und deswegen den zweiten SQL-Befehl garnicht mehr erhällt?

Ist echt ein komischer Fehler.

Gruß
Bitte warten ..
Mitglied: reboot
24.04.2012 um 16:03 Uhr
Ja, irgendwie so muss es fast sein. Anders kann ich mir das auch nicht erklären.
Aber es darf doch eigentlich nicht sein. Man muss doch das gleiche zurückbekommen, wie wenn man die Prozedur auf dem SQL resp. Management Studio ausführt...


Gruss reboot
Bitte warten ..
Mitglied: ITSchlumpf
24.04.2012 um 16:34 Uhr
Und wenn du nach dem Update nochmal ne Verbindung zum Server aufmachst?

Gruß
Bitte warten ..
Mitglied: reboot
25.04.2012 um 08:28 Uhr
Sorry, aber wie stellst du dir das vor?

Ich schliesse die Verbindung sowieso nicht. Die Verbindung bleibt bestehen.


Gruss
Bitte warten ..
Mitglied: ITSchlumpf
25.04.2012 um 08:49 Uhr
Morgen,

naja aber aus irgendeinem Grund bekommst du keine Antwort von deinem SQL-Server. Dachte halt, dass die Verbindung aus irgendeinem Grund vll geschlossen wird und du Sie wieder öffnen müsstest.

Hast du schonmal geschaut, ob deine Variablen an den entsprechenden Stellen noch die richtigen Werte haben oder ob sie ihre Werte verlieren?!

Gruß
Bitte warten ..
Mitglied: reboot
25.04.2012 um 10:09 Uhr
Ich hab des Rätels Lösung gefunden!!!
Unglaublich. Nach weiteren Stunden des Suchens.

Also es ist folgendermassen.

Wenn man in der gespeicherten Prozedur (GSP) nur einen SELECT stehen hat wie hier:
SELECT * 
FROM tabelle 
WHERE spalte = @param
Dann reicht folgender PHP-Code, um alle Werte, die der SELECT zurückliefert zu durchlaufen.
01.
$query = "deine_prozedur 'bla bla'"
02.
$result = sqlsrv_query($connection, $query); 
03.
 
04.
while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) 
05.
06.
	// mach was mit $row 
07.
}
Wenn man nun aber zuerst ein UPDATE, ein NSERT oder ein DELETE Befehl ausführt, muss man das ganze um eine Zeile erweitern.

SQL:
UPDATE tabelle 
SET spalte1 = @param1 
WHERE spalte2 = @param2 
 
SELECT * 
FROM tabelle 
WHERE spalte2 = @param2
PHP:
01.
$query = "deine_prozedur 'bla bla'"
02.
$result = sqlsrv_query($connection, $query); 
03.
 
04.
sqlsrv_next_result($result); /* WICHTIG!!! *
05.
while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) 
06.
07.
	// mach was mit $row 
08.
}

Vielen Dank für eure Unterstützung.

Gruss reboot
Bitte warten ..
Mitglied: ITSchlumpf
25.04.2012 um 10:20 Uhr
Immer wieder gerne.

So kleine Fehler sind die schlimmsten ^^

Have a nice day ;)

Gruß
Schlumpf
Bitte warten ..
Ähnliche Inhalte
PHP
Probleme mit PHP und mssql
Frage von InvisanPHP2 Kommentare

Hi zusammen, ich versuche derzeit auf eine mssql Datenbank mittels PHP zuzugreifen und eine Oberfläche zu schreiben. Generell klappt ...

Windows Server
PDF Formular - Daten können nicht gespeichert werden
gelöst Frage von el-capitano86Windows Server5 Kommentare

Hallo zusammen, kurz zur Umgebung: 1x SBS 2008 und 1x Terminalserver unter 2008. Die User arbeiten alle ausschließlich auf ...

Datenbanken
MSSQL Daten in Zeitraum eingrenzen und addieren
gelöst Frage von nutzloser-userDatenbanken3 Kommentare

Hallo Community, ich habe ein kleines Projekt angenommen und versuche mich derzeit ein bisschen damit zurecht zu finden. Leider ...

Vmware
Vmdk windows daten dürfen nicht gespeichert werden
Frage von zarazamVmware8 Kommentare

hallo gemeinde, ich habe virtualbox im einsatz. es werden für die festplatte vmdk dateien erzeugt. ich möchte das der ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 1 TagWindows 103 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 1 TagSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 1 TagInternet5 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 1 TagDSL, VDSL2 Kommentare

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Windows Server
GPO nur für bestimmte Computer
Frage von Leo-leWindows Server13 Kommentare

Hallo Forum, gern würde ich ein Robocopy script per Bat an eine GPO hängen. Wichtig wäre aber dort der ...

Windows Server
KMS Facts for Client configuration
Frage von winlinWindows Server13 Kommentare

Hey Leute, wir haben in unserem Netz nun einen neuen KMS Server. Haben Bestands-VMs die noch nicht aktiviert sind. ...

Router & Routing
OpenWRT bzw. L.E.D.E auf Buffalo WZR-HP-AG300H - update
gelöst Frage von EpigeneseRouter & Routing11 Kommentare

Guten Tag, ich habe auf einem Buffalo WZR-HP-AG300H die alternative Firmware vom L.E.D.E Projekt geflasht. Ich bin es von ...

Windows Tools
Software-Tool zum Entfernen von bösartigem Windows
Frage von emeriksWindows Tools11 Kommentare

Hi, siehe Betreff hat das jemals irgendjemand schonmal sinnvoll eingesetzt? (MRT) E.