This post is also available in: English

This post is also available in: English
Dari kasus yang dikemukakan oleh mahasiswa saya, result-set yang diberikan stored procedure dari MySQL tidak dapat diakses dari PHP sehingga menggunakan Function, well sebetulnya bisa saja. Ada dua cara mengakses result-set yang dikembalikan oleh stored procedure, menggunakan MySQL extension dengan client_flag untuk dukungan multi statement dan multi result atau menggunakan MySQLi extension.
Kasus yang digunakan di bawah menggunakan database dari WordPress.
Stored Procedure yang digunakan:
CREATE PROCEDURE `GetPost`(IN limitCount INTEGER(11)) BEGIN set @limitCount=limitCount; set @sql="select post_title, display_name from wp_posts p join wp_users u on p.post_author=u.id where p.post_type='post' and post_status='publish' order by post_date desc"; if (not isnull(limitCount)) then set @sql=concat(@sql, " limit 0,?"); end if; prepare stmt from @sql; if (isnull(limitCount)) then execute stmt; else execute stmt using @limitCount; end if; deallocate prepare stmt; END;
- Menggunakan MySQL extensionMySQL Extension pada PHP merupakan extension untuk MySQL 4 walaupun masih dapat digunakan untuk MySQL 5 namun ada keterbatasan. MySQL extension untuk PHP tersedia hanya untuk procedural tidak untuk object-oriented. Untuk mengakses stored procedure diperlukan mengeset
client_flags
untukmulti statement (nilai=65536)
danmulti results (nilai=131072)
pada saat koneksi database.Contohnya adalah sebagai berikut (prosedural).$sql = "call GetPost(5)"; //query untuk panggil stored procedure // koneksi mysql, untuk mengakses stored procedure // client flags diset untuk multi statement dan multi result // 196608 = 65536 + 131072 $mysql = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD, false, 196608); if (!$mysql){ printf("connect failed: %s\n", mysql_error()); } else { mysql_select_db(DB_NAME,$mysql); $result = mysql_query($sql); if ($result) { while ($row = mysql_fetch_object($result)) { printf("%s : %s ", $row->display_name, $row->post_title); } mysql_free_result($result); //free result set } } mysql_close($mysql);
- Menggunakan MySQLi extensionMySQLi Extension merupakan extension untuk mengakses fungsionalitas MySQL 4.1 ke atas. Extension ini tersedia baik untuk procedural maupun object-oriented. Untuk mengakses stored procedure “tidak diperlukan” untuk mengeset client flags.Contohnya adalah sebagai berikut (object-oriented).
$sql = "call GetPost(5)"; //query untuk panggil stored procedure $mysqli = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME); //koneksi mysqli if (mysqli_connect_errno()){ printf("connect failed: %s\n", mysqli_connect_error } else { if ($result = $mysqli->query($sql)) { while ($row = $result->fetch_object()) { printf("%s : %s ", $row->display_name, $row->post_title); } $result->close(); //free result set } } $mysqli->close();
Contoh screenshotnya: