2015-05-15 42 views
14

Tôi đang cố tạo quy trình được lưu trữ trong CakePHP. Tôi đã tạo ra thủ tục trong MYSQL và tạo ra chức năng toàn cầu trong AppModel.php để nhấn thủ tục. Hàm trong AppModel là sProcedure. Bây giờ tôi có 2 điều kiện tôi có thể có biến để trở về từ thủ tục hoặc có thể có kết quả trực tiếp ví dụ. Tôi đã tạo cho Phân trang. Mặc dù nó bắn thủ tục của tôi nhưng không trả lại bất kỳ kết quả nào. Chức năng của tôi có cần sửa đổi không?CakePHP với thủ tục được lưu trữ

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

là bạn nhận được bất kỳ lỗi –

+0

tôi không nhận lỗi, thủ tục của tôi thực hiện là tốt. Nhưng tôi muốn biết cách lấy đầu ra từ thủ tục. Sử dụng cùng chức năng. Không có vấn đề nếu tôi có kết quả đầu ra hoặc biến. – Sankalp

+0

@Sankalp là thủ tục trả về giá trị hợp pháp khi được gọi trực tiếp từ MySQL (không sử dụng PHP)? Ngoài ra, $ this-> query thực hiện chuỗi truy vấn được truyền và trả về (nếu không thất bại) một tài nguyên cần được lặp lại. – sitilge

Trả lời

12

Breaking xuống đoạn

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

cuộc gọi thủ tục lưu trữ. Giả sử rằng phần thân của thủ tục đơn giản là SELECT

SELECT table.* FROM table; 

Quy trình này trả về tập hợp kết quả. Hãy xem lướt qua các mã mà bạn cung cấp

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

, thủ tục được gọi nhưng kết quả/resource không được gán cho một biến để iterate kết thúc.

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

tài liệu liên quan: connector-cpp-tutorials-stored-routines-statements

+0

Xin chào bạn đã lấy kịch bản đầu tiên, Trường hợp khi tôi không có biến đầu ra, có nghĩa là tôi có đơn giản SELECT recordset Query. Nghi ngờ của tôi với điều này, là 'mysqli_fetch_array' theo tiêu chuẩn của khung công tác CakePHP mà tôi đang làm việc, tôi cũng muốn tuân theo tiêu chuẩn của Framework. Trường hợp II: Tôi đã chọn các vars cho kết quả. Tôi sẽ đặt truy vấn theo cách này. $ proc_result = $ this-> truy vấn ("GỌI' $ name' (tham số $); "); if ($ outputParam) { $ result = $ this-> query ("SELECT $ outputParam"); } else { trong khi ($ proc_row = mysqli_fetch_array ($ proc_result)) { $ proc_data [] = $ proc_row; } } Đúng không ?? – Sankalp

+0

Vâng, CakePHP là một khung công tác - thứ được xây dựng dựa trên một đoạn mã hiện có. Nó không có nghĩa là nó sẽ bao quát tất cả các khía cạnh của mã cơ bản là PHP. Những gì tôi muốn nói là - bạn sẽ phải viết một cái gì đó trong 'thuần' PHP như khuôn khổ có thể không cung cấp chức năng như vậy. TLDR; đây là một nghệ thuật đẹp từ tài liệu CakePHP: http://book.cakephp.org/2.0/en/models/retrieving-your-data.html. Tuy nhiên, nó là hoàn toàn chính xác để sử dụng các phương pháp phi khung. :) – sitilge

+0

Vui lòng kiểm tra mã của tôi tôi đã đính kèm cho trường hợp kiểm tra cuối cùng. – Sankalp

4

Sử dụng đoạn mã sau để gọi thủ tục lưu trữ cakephp 3

của nó làm việc cho tôi .....

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

Guys DONT bash của bạn đứng đầu

ch eck vài dòng đó:

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

đảm bảo hoạt động. các getDatasource trả về một $ mysqli đối tượng như vậy có thể sử dụng nó

kiểm tra hướng dẫn PHP cho sp Calling a stored procedure in php

Các vấn đề liên quan