Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL mengambil variabel dari Stored Procedure di PHP PDO

Ternyata ini adalah bug yang sudah terjadi sejak lama... sejak tahun 2005!

Berikut adalah laporan bug asli:2005 hingga 2013 . Dan inilah laporan bug baru:Dari 2013 hingga sekarang .

Ada berbagai pendekatan untuk mendapatkan jawaban kembali, saya menemukan salah satunya dan menunjukkannya...

'Trik' adalah untuk mendapatkan output dari prosedur 'mysql'. Ini adalah proses 'dua tahap'.

  • Bagian pertama adalah menjalankan prosedur dengan input Anda, dan juga memberi tahu variabel MYSQL untuk menyimpan hasilnya.

  • Kemudian, Anda menjalankan kueri terpisah untuk 'memilih' variabel 'mysql' tersebut.

Ini dijelaskan dengan cukup jelas di sini:php-calling-mysql-stored-procedures

Pembaruan (Jan 2017):

Berikut adalah contoh yang menunjukkan penggunaan variabel untuk parameter prosedur Mysql 'IN', 'INOUT' dan 'OUT'.

Sebelum kita mulai, berikut beberapa tipsnya:

  • Saat mengembangkan:Jalankan PDO dalam 'mode emulasi' karena lebih andal dalam menentukan kesalahan dalam panggilan prosedur.
  • Hanya ikat variabel PHP ke parameter prosedur 'IN'.

Anda akan mendapatkan beberapa kesalahan runtime yang sangat aneh ketika Anda mencoba mengikat variabel ke parameter INOUT dan OUT.

Seperti biasa saya cenderung memberikan lebih banyak komentar daripada yang dibutuhkan;-/

Lingkungan Waktu Proses (XAMPP):

  • PHP:5.4.4
  • Mysql:5.5.16

Kode Sumber:

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

Kode PHP:

Koneksi 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);

Catatan:Outputnya sama dengan EMULATE_PREPARES =salah.

Set semua Variabel PHP yang akan digunakan:

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

Tentukan dan Siapkan panggilan prosedur 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);

Mengikat Variabel PHP dan Mengatur Variabel SQL:

  • 1) ikat variabel PHP

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

  • 2) Atur variabel INOUT Pengguna SQL

    $db->exec("SET @varInOutParam =$phpInOutParam"); // Ini aman karena hanya menetapkan nilai ke dalam variabel MySql.

Jalankan prosedurnya:

$allOk = $stmt->execute();

Masukkan Variabel SQL ke dalam variabel PHP:

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

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

Catatan:mungkin bukan cara terbaik;-/

Menampilkan variabel 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. MySQL bergabung dengan klausa where

  2. MySQL – Bagaimana Cara Melepas Tabel Jika Ada di Database?

  3. Cara menghitung item dalam daftar yang dipisahkan koma MySQL

  4. MySQL mendapatkan ID yang hilang dari tabel

  5. COUNT(*) dari beberapa tabel di MySQL