Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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, 3796 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 ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
PHP
PHP Daten "Streamen" (3)

Frage von Roadrunner777 zum Thema PHP ...

VB for Applications
Excel VBA Sortierung von Daten (4)

Frage von easy4breezy zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (12)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...