2011-01-16 4 views
0

Ich verbinde eine Verbindung zu einer SQL Server-Datenbank von PHP mit ADODB. Ich habe mehrere gespeicherte Prozeduren, die ich gerade ausgeführt habe. Der letzte Anruf, den ich aus irgendeinem Grund erstellt habe, scheitert immer wieder. Ich habe debug als wahr und es funktioniert gut. Ich habe keine Ahnung, warum das passieren würde.ADODB/SQL Server mssql_execute gespeicherte Prozedur schlägt fehl, funktioniert aber, wenn debug auf true gesetzt ist

hier ist der Fehler, den ich

bekommen
Error: mssql_execute() [<a href='function.mssql-execute'>function.mssql-execute</a>]:  stored procedure execution failed in /path/to/adodb/lib/adodb5/drivers/adodb-mssql.inc.php on line 768 

Hier ist die Methode Ich habe alle meine gespeicherten Prozeduren zu übergeben, wie ich schon sagte es mit anderen gespeicherten Prozeduren funktioniert gut, aber dieses und ich habe doppelt geprüft, dass Alle Schreibweisen der Parameter und der gespeicherten Prozedur sind korrekt.

protected function _getSpArray($db, $sp, array $spParams) { 
    try { 
     $stmt = $db->PrepareSP($sp); 
     foreach ($spParams as $param) { 
      $db->InParameter($stmt, $param[0], $param[1]); 
     } 
     $db->SetFetchMode(ADODB_FETCH_ASSOC); 
     $rs = $db->Execute($stmt); 
     $rsArray = array(); 
     if (!$rs) { 
      echo 'No records found \n'; 
      return; 
     } 
     else { 
      foreach ($rs as $k => $row) { 
       $rsArray[$k] = $row; 
      } 
     } 
     return $rsArray; 
    } catch (ErrorException $e) { 
     echo $e->getMessage(); 
    } 
} 

Es ist auf dieser Linie # 768 von adodb5/drivers/adodb-mssql.inc.php

$rez = mssql_execute($sql[1]); 

und die SQL-Array hat diese Werte

[0] stored_procedure_name 
[1] resource id='657' type='mssql statement' 

ich versagt haben habe die folgenden Kommentare auf PHP.net gesehen, ich habe meinen freetds Hostnamen geändert um etwas anderes als die IP Adresse zu sein und noch nichts. Ich bin mir über das freie Ergebnis nicht sicher, da ich adodb verwende.

http://www.php.net/manual/en/function.mssql-execute.php#93938

I adodb 5.11

+0

Vielleicht sollten Sie ein wenig mehr Fehlerinformationen geben? "Ausführung fehlgeschlagen" ist NICHT, was SQL Server sagt, es bietet eine viel bessere Erklärung. PHP sollte das irgendwie entlarven. – TomTom

+0

Ich schaue auf den SQL Server Profiler und es scheint nicht einmal dorthin zu gelangen. Ich bin mir nicht sicher, wie ich die Adodb-Bibliothek mehr debuggen soll als das, was ich habe.Ich wünschte, ich könnte mehr von einem Fehler finden, aber das ist alles, was ich finden kann –

+0

Sie sollten die Version von ADODB hinzufügen, die Sie verwenden. – DarkThrone

Antwort

2

Wenn Sie set debug als wahr ADODB verwendet andere Funktion, um die Anweisung auszuführen verwenden. In diesem Fall function _adodb_debug_execute(&$zthis, $sql, $inputarr)

Wenn debug auf false festgelegt ist, verwendet ADODB function &_Execute($sql,$inputarr=false). Wenn Sie die Quelle für beide Methoden überprüfen, können Sie den Unterschied deutlich sehen.

<?php 
function _adodb_debug_execute(&$zthis, $sql, $inputarr) 
{ 
    //ADODB prepares debug information dump... 

    $qID = $zthis->_query($sql,$inputarr); 

    //Here ADODB makes the difference 

    if ($zthis->databaseType == 'mssql') { 
    // ErrorNo is a slow function call in mssql, and not reliable in PHP 4.0.6 
     if($emsg = $zthis->ErrorMsg()) { 
      if ($err = $zthis->ErrorNo()) ADOConnection::outp($err.': '.$emsg); 
     } 
    } else if (!$qID) { 
     ADOConnection::outp($zthis->ErrorNo() .': '. $zthis->ErrorMsg()); 
    } 

    if ($zthis->debug === 99) _adodb_backtrace(true,9999,2); 
    return $qID; 
} 
?> 

Hier ist die _EXECUTE Funktion

<?php 
function &_Execute($sql,$inputarr=false){ 
     //Here ADODB chooses which fn to use 
     if ($this->debug) { 
      global $ADODB_INCLUDED_LIB; 
      if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); 
      $this->_queryID = _adodb_debug_execute($this, $sql,$inputarr); 
     } else { 
      $this->_queryID = @$this->_query($sql,$inputarr); 
     } 
     //... 

     if ($this->_queryID === false) { // error handling if query fails 
      //If debug ADODB prints backtrace regardless the result 
      if ($this->debug == 99) adodb_backtrace(true,5);  
      $fn = $this->raiseErrorFn; 
      if ($fn) { 
       $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this); 
      } 
      $false = false; 
      //Returns false no matter what... 
      return $false; 
     } 
     //... 
    } 
?> 

Versuchen, diese zu Ihrem Skript, das Verhalten des Skripts zu testen und im Auge behalten, wenn die Ausführungs versagt es wird einen false Wert zurück. Also pass auf den zurückgegebenen Wert auf.

protected function _getSpArray($db, $sp, array $spParams) { 
    try { 
     $stmt = $db->PrepareSP($sp); 
     foreach ($spParams as $param) { 
      $db->InParameter($stmt, $param[0], $param[1]); 
     } 
     $db->SetFetchMode(ADODB_FETCH_ASSOC); 
     $rs = $db->Execute($stmt); 
     $rsArray = array(); 
     if (!$rs) { 
      echo 'No records found \n'; 
      return; 
     } 
     else { 
      foreach ($rs as $k => $row) { 
       $rsArray[$k] = $row; 
      } 
     } 
     //add this line to free the resources after use. 
     mssql_free_result($rs); 
     return $rsArray; 
    } catch (ErrorException $e) { 
     echo $e->getMessage(); 
    } 
} 

Hoffe es hilft !!

+0

Ich habe versucht, das direkt nach der Ausführung hinzuzufügen, und es hat nichts getan. Ich werde versuchen zu debuggen und den Unterschied zu sehen. –

+0

Ok, zu Hause funktionierte es, aber als ich heute zur Arbeit kam, tut es das nicht. Ich verstehe das wirklich nicht. Es ist nur eine gespeicherte Prozedur von den 10, die ich angerufen habe. Ich verstehe nicht, warum es eine Freetd-Sache sein würde oder das Ergebnis befreien müsste, wenn ich nicht auf die anderen verzichten müsste. Ich sehe auch nicht den Unterschied in dem, was die zwei Methoden tun, offensichtlich druckt man die Information aus, aber sie rufen beide die gleiche Abfragemethode auf. –

+0

& _Execute gibt false für $ this zurück -> _ queryID === false (strenge Gleichheitsprüfung für Typ) prüft auf den Typ boolean und false. Der andere gibt _query value ohne Prüfung zurück, das ist der Unterschied. Was sind die Umweltunterschiede zwischen Ihrem Zuhause und Ihrer Arbeit? – DarkThrone

0

Ok, nachdem ich die php.net Kommentare gefunden habe, obwohl meine Freetds nicht mit dem richtigen Namen eingerichtet wurde, benutzte ich die IP Adresse. Ich benutzte auch nicht die V 8.0, die ich 7.0 verwendete und alles funktionierte bis zu diesem Punkt mit den Speicherprozeduren. Ich habe versucht, die mssql_free_result Lösung in den Kommentaren und DarkThrones Antwort bereitzustellen und das hat nicht funktioniert, aber wenn ich adodb die close() -Methode es funktioniert. Es verwendet freies Ergebnis und übergibt eine Abfrage-ID.

Wenn jemand kommentieren kann, warum das notwendig ist, wäre das toll. Liegt es daran, dass ich zu viel Speicher verwendete oder so?

Verwandte Themen