Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL truy xuất biến từ Thủ tục được lưu trữ trong PHP PDO

Hóa ra đây là một lỗi đã xảy ra trong một thời gian dài ... từ năm 2005!

Đây là báo cáo lỗi ban đầu: từ 2005 đến 2013 . Và đây là báo cáo lỗi mới: Từ năm 2013 đến nay .

Có nhiều cách tiếp cận khác nhau để nhận được câu trả lời, tôi đã tìm thấy một trong số chúng và chứng minh nó ...

'Bí quyết' là lấy đầu ra từ thủ tục 'mysql'. Đó là một quá trình 'hai giai đoạn'.

  • Phần đầu tiên là chạy thủ tục với đầu vào của bạn và cũng cho nó biết biến MYSQL nào để lưu trữ kết quả.

  • Sau đó, bạn chạy một truy vấn riêng để 'chọn' các biến 'mysql' đó.

Nó được mô tả khá rõ ràng ở đây: php-call-mysql-Managed-procedure

Cập nhật (tháng 1 năm 2017):

Đây là một ví dụ cho thấy việc sử dụng các biến cho các tham số thủ tục Mysql 'IN', 'INOUT' và 'OUT'.

Trước khi chúng ta bắt đầu, đây là một số mẹo:

  • Khi phát triển:Chạy PDO ở 'chế độ giả lập' vì nó đáng tin cậy hơn trong việc xác định lỗi trong lệnh gọi thủ tục.
  • Chỉ liên kết các biến PHP với các tham số 'IN' của thủ tục.

Bạn sẽ nhận được một số lỗi thời gian chạy thực sự kỳ lạ khi bạn thử liên kết các biến với các tham số INOUT và OUT.

Như thường lệ, tôi có xu hướng cung cấp nhiều nhận xét hơn là bắt buộc; - /

Môi trường thời gian chạy (XAMPP):

  • PHP:5.4.4
  • Mysql:5.5.16

Mã nguồn:

Mã SQL:

CREATE PROCEDURE `demoSpInOutSqlVars`(IN     pInput_Param  INT, /* PHP Variable will bind to this*/   
                                      /* --- */  
                                      INOUT  pInOut_Param  INT, /* contains name of the SQL User variable that will be read and set by mysql */
                                      OUT    pOut_Param    INT) /* contains name of the SQL User variable that will be set by mysql */
BEGIN
    /*
     * Pass the full names of SQL User Variable for these parameters. e.g. '@varInOutParam'
     * These 'SQL user variables names' are the variables that Mysql will use for:
     *    1) finding values
     *    2) storing results
     *
     * It is similar to 'variable variables' in PHP.  
     */
     SET pInOut_Param      := ABS(pInput_Param) + ABS(pInOut_Param); /* always positive sum  */
     SET pOut_Param        := ABS(pInput_Param) * -3;                /* always negative * 3  */ 
END$$

Mã PHP:

Kết nối DB:

$db = appDIC('getDbConnection', 'default'); // get the default db connection
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);    
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

Lưu ý:Đầu ra giống nhau với EMULATE_PREPARES =sai.

Đặt tất cả các Biến PHP sẽ được sử dụng:

$phpInParam     = 5;                  
$phpInOutParam  = 404;          /* PHP InOut variable  ==> read and should be changed  */
$phpOutParam    = null;         /* PHP Out   variable  ==> should be changed           */

Xác định và Chuẩn bị lệnh gọi thủ tục SQL:

$sql = "call demoSpInOut(:phpInParam, 
                         @varInOutParam, /* mysql variable name will be read and updated */
                         @varOutParam)"; /* mysql variable name that will be written to  */

$stmt = $db->prepare($sql);

Liên kết các biến PHP và đặt các biến SQL:

  • 1) liên kết các biến PHP

    $ stmt-> bindParam (':phpInParam', $ phpInParam, PDO ::PARAM_INT);

  • 2) Đặt biến INOUT của người dùng SQL

    $ db-> execute ("SET @varInOutParam =$ phpInOutParam"); // Điều này an toàn vì nó chỉ đặt giá trị vào biến MySql.

Thực hiện quy trình:

$allOk = $stmt->execute();

Lấy Biến SQL vào các biến PHP:

$sql = "SELECT @varInOutParam AS phpInOutParam,
               @varOutParam   AS phpOutParam
        FROM dual";
$results = current($db->query($sql)->fetchAll());

$phpInOutParam = $results['phpInOutParam'];
$phpOutParam   = $results['phpOutParam'];

Lưu ý:có thể không phải là cách tốt nhất; - /

Hiển thị các biến PHP

"$phpInParam:"     => "5"
"$phpInOutParam:"  => "409"
"$phpOutParam:"    => "-15"


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gặp sự cố với các hàng khớp trong cơ sở dữ liệu bằng cách sử dụng PDO

  2. Làm thế nào để chèn một tệp trong cơ sở dữ liệu MySQL?

  3. MySQL chọn với điều kiện CONCAT

  4. Cách xác định phiên bản MySQL

  5. SQL là gì? Cơ sở dữ liệu là gì? Giải thích hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS) bằng tiếng Anh thuần túy.