2015-05-15 4 views
14

Я пытаюсь создать хранимую процедуру в CakePHP. Я создал процедуру в MYSQL и создал глобальную функцию в AppModel.php, чтобы выполнить процедуру. Функция в AppModel - это sProcedure. Теперь у меня есть два условия: у меня может быть переменная для возврата из процедуры или, возможно, прямой набор результатов, например. Я создал для Pagination. Хотя он снимает мою процедуру, но не возвращает никакого результата. Является ли моя функция изменением?CakePHP с сохраненной процедурой

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

вы получаете любую ошибку –

+0

я не получаю сообщение об ошибке, моя процедура выполняется так же. Но я хочу знать, как вывести результаты из процедуры. Использование одной и той же функции. Независимо от того, у меня есть выходной набор результатов или переменные. – Sankalp

+0

@Sankalp - это процедура, возвращающая законные значения при вызове непосредственно из MySQL (не используя PHP)? Кроме того, $ this-> query выполняет переданную строку запроса и возвращает (если не сбой) ресурс, который должен быть повторен. – sitilge

ответ

12

Ломая сниппете

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

вызовы хранимой процедуры. Давайте предположим, что тело процедура, является простым SELECT

SELECT table.* FROM table; 

Эта процедура возвращает набор результатов. Возьмите быстрый взгляд на код вы предоставили

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

Да, процедура называется, но результат/resource не присваивается переменной iterate более.

$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 
} 

Связанная документация: connector-cpp-tutorials-stored-routines-statements

+0

Привет, вы взяли первый сценарий, случай, когда у меня нет выходных переменных, значит, у меня есть простой запрос записи SELECT. Я сомневаюсь в этом: «mysqli_fetch_array» соответствует стандарту CakePHP, который я работаю, и я хочу следовать стандарту Framework. Дело II: Я выбрал вары для результата. Я бы поставил запрос таким образом. $ proc_result = $ this-> query ("CALL' $ name' ($ parameter); "); if ($ outputParam) { $ result = $ this-> query ("SELECT $ outputParam"); } else { while ($ proc_row = mysqli_fetch_array ($ proc_result)) { $ proc_data [] = $ proc_row; } } Правильно? – Sankalp

+0

Ну, CakePHP - это фреймворк - то, что строится на существующей части кода. Это не значит, что он скроет все аспекты фундаментального кода, который является PHP. Я хочу сказать, что вам нужно будет написать что-то в «чистом» PHP, поскольку инфраструктура может не предоставлять такую ​​функциональность. TLDR; вот хорошая статья из документов CakePHP: http://book.cakephp.org/2.0/ru/models/retrieving-your-data.html. Тем не менее, совершенно правильно использовать неструктурные методы. :) – sitilge

+0

Пожалуйста, проверьте мой код, который я приложил для окончательного теста. – Sankalp

4

Используйте следующий код для вызова хранимой процедуры CakePHP 3

Его работа для меня .....

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

Ребят DONT Баша СВОИХ головки

ch eck эти две линии:

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

гарантированно работает. GetDataSource возвращает объект $ Mysqli так вы можете использовать его

проверка на PHP руководства для зра Calling a stored procedure in php

Смежные вопросы