2015-05-15 13 views
14

Ich versuche, gespeicherte Prozedur in CakePHP zu erstellen. Ich habe Prozedur in MYSQL erstellt und globale Funktion in AppModel.php zu Hit-Prozedur erstellt. Die Funktion in AppModel ist sProcedure. Jetzt habe ich 2 Bedingungen, die ich Variable haben könnte, um von der Prozedur zurückzukommen, oder kann direkt resultset haben zB. Ich habe für Paginierung erstellt. Obwohl es mein Verfahren schießt, aber kein Ergebnis zurückgibt. Muss meine Funktion geändert werden?CakePHP mit gespeicherter Prozedur

public function sProcedure($name = NULL, $inputParameter = array(), $outputParameter = array()) { 
     $this->begin(); 
     $parameter = ""; 
     $outputParam = ""; 
     foreach ($inputParameter as $params) { 
      $parameter .= $parameter == "" ? " '$params' " : ", '$params' "; 
     } 

     if (count($outputParameter) > 0) { 
      foreach ($outputParameter as $prm) { 
       $outputParam .= $outputParam == "" ? " @$prm " : ", @$prm "; 
      } 
     } 
     $parameter = ($outputParam) ? $parameter . ", " . $outputParam : $parameter; 
     $this->query("CALL `$name`($parameter);"); 
     $result = $this->query("SELECT $outputParam"); 
     $this->commit(); 
     return $result; 
    } 

    $sel_data = $this->ArticleNews->sProcedure("update_blank", $input_prameter, $output); 
    debug($sel_data); 
+0

erhalten Sie einen Fehler –

+0

Ich bin nicht immer Fehler, My Verfahren auch ausgeführt wird. Aber ich möchte wissen, wie man die Ausgabe von der Prozedur nimmt. Verwenden derselben Funktion. Egal, ob ich Resultset oder Variablen ausgegeben habe. – Sankalp

+0

@Sankalp ist die Prozedur, die legitime Werte zurückgibt, wenn sie direkt von MySQL aufgerufen werden (ohne PHP)? Außerdem führt $ this-> query den übergebenen Query String aus und gibt (falls nicht fehlgeschlagen) eine Ressource zurück, die iteriert werden soll. – sitilge

Antwort

12

Abbau der Schnipsel

$this->query("CALL `$name`($parameter);"); 

Anrufe gespeicherten Prozedur. Nehmen wir an, dass der Körper des Verfahrens SELECT ein einfaches

SELECT table.* FROM table; 

Diese Prozedur eine Ergebnismenge zurückgibt. Werfen Sie einen Blick auf den Code zur Verfügung gestellt Sie

$this->query("CALL `$name`($parameter);"); 

Ja, wird das Verfahren genannt, aber das Ergebnis/resource nicht einer Variablen zugewiesen iterate über.

$proc_result = $this->query("CALL `$name`($parameter);"); 

$proc_data = array(); 

if (false !== $proc_result) 
{ 
    while ($proc_row = mysqli_fetch_array($proc_result)) 
    { 
     $proc_data[] = $proc_row; 
    } 
} 

if (!empty($proc_data)) 
{ 
    //do whatever with procedure data 
} 

Verwandte Dokumentation: connector-cpp-tutorials-stored-routines-statements

+0

Hallo, Sie haben das erste Szenario, Case, wenn ich keine Ausgabevariablen habe, bedeutet, ich habe einfache SELECT-Recordset-Abfrage. Meine Zweifel damit, "mysqli_fetch_array" folgt dem Standard des CakePHP-Frameworks, an dem ich arbeite, ich möchte auch dem Framework-Standard folgen. Fall II: Ich habe vars für das Ergebnis ausgewählt. Ich würde auf diese Weise fragen. $ proc_result = $ this-> query ("CALL' $ name' ($ parameter); "); if ($ outputParam) { $ ergebnis = $ this-> query ("SELECT $ outputParam"); } else { while ($ proc_row = mysqli_fetch_array ($ proc_result)) { $ proc_data [] = $ proc_row; } } Richtig ?? – Sankalp

+0

Nun, CakePHP ist ein Framework - etwas, das auf einem vorhandenen Code basiert. Es bedeutet nicht, dass es alle Aspekte des grundlegenden Codes, der PHP ist, verdecken wird. Was ich sagen möchte ist, dass Sie etwas in "reinem" PHP schreiben müssen, da das Framework diese Funktionalität nicht bietet. TLDR; Hier ist ein nettes Artikel von CakePHP docs: http://book.cakephp.org/2.0/en/models/retrieving-your-data.html. Es ist jedoch völlig korrekt, Nicht-Framework-Methoden zu verwenden. :) – sitilge

+0

Bitte überprüfen Sie meinen Code, den ich für den letzten Testfall beigefügt habe. – Sankalp

4

Verwenden folgenden Code zu gespeicherten Nummern anrufen Verfahren cakephp 3

Sein für mich arbeiten .....

$this->connection = ConnectionManager::get('default'); 
$meritlists = $this->connection->execute("CALL generateMeritList()")->fetchAll('assoc'); 
0

Jungs DONT bash Ihre Köpfe

ch eck diese paar Linien:

$sql="CALL `delete_category`(".$id.");"; 
$db3= ConnectionManager::getDataSource('default'); 
$db3->query($sql); 

garantiert zu arbeiten. die GetDataSource gibt ein $ mysqli Objekt so u es

Überprüfung der PHP-Handbuch für sp verwenden können Calling a stored procedure in php

Verwandte Themen