Saya menyadari bahwa sudah lama tidak ada kegiatan baru tentang pertanyaan ini. Namun, seperti yang dikomentari oleh poster lain - get_result()
sekarang hanya tersedia dalam PHP dengan menginstal driver asli MySQL (mysqlnd), dan dalam beberapa kasus, mungkin atau tidak diinginkan untuk menginstal mysqlnd. Jadi, saya pikir akan sangat membantu untuk memposting jawaban ini dengan info tentang bagaimana mendapatkan fungsionalitas yang get_result()
menawarkan - tanpa menggunakan get_result()
.
get_result()
is / sering dikombinasikan dengan fetch_array()
to loop melalui kumpulan hasil dan menyimpan nilai dari setiap baris kumpulan hasil dalam array yang diindeks secara numerik atau array asosiatif. Misalnya, kode di bawah ini menggunakan get_result () dengan fetch_array () untuk mengulang melalui set hasil, menyimpan nilai dari setiap baris dalam array $ data [] yang diindeks secara numerik:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$result = $stmt->get_result();
while($data = $result->fetch_array(MYSQLI_NUM)) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
Namun, jika get_result()
tidak tersedia (karena mysqlnd tidak diinstal), maka ini mengarah pada masalah bagaimana menyimpan nilai dari setiap baris hasil yang ditetapkan dalam sebuah array, tanpa menggunakan get_result()
. Atau, bagaimana cara memigrasi kode lama yang digunakan get_result()
untuk berjalan tanpanya (mis. Menggunakan bind_result()
sebagai gantinya) - sambil sesedikit mungkin memengaruhi sisa kode.
Ternyata menyimpan nilai dari setiap baris dalam array yang diindeks secara numerik tidak begitu mudah digunakan bind_result()
. bind_result()
mengharapkan daftar variabel skalar (bukan array). Jadi, dibutuhkan beberapa upaya untuk membuatnya menyimpan nilai dari setiap baris hasil yang ditetapkan dalam sebuah array.
Tentu saja, kodenya dapat dengan mudah dimodifikasi sebagai berikut:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$stmt->bind_result($data[0], $data[1]);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
Tapi, ini mengharuskan kita untuk secara eksplisit mencantumkan $ data [0], $ data [1], dll. Secara individual dalam panggilan ke bind_result()
, yang tidak ideal. Kami menginginkan solusi yang tidak mengharuskan kami harus secara eksplisit mencantumkan $ data [0], $ data [1], ... $ data [N-1] (di mana N adalah jumlah bidang dalam pernyataan pilih) dalam panggilan ke bind_results()
. Jika kita memigrasi aplikasi lawas yang memiliki banyak query, dan setiap query mungkin berisi jumlah field yang berbeda dalam select
klausa, migrasi akan sangat padat karya dan rawan kesalahan jika kita menggunakan solusi seperti di atas .
Idealnya, kami menginginkan potongan kode 'drop-in replacement' - untuk mengganti hanya baris yang berisi get_result()
fungsi dan while () loop di baris berikutnya. Kode pengganti harus memiliki fungsi yang sama dengan kode yang digantikannya, tanpa memengaruhi baris mana pun sebelumnya, atau baris apa pun setelahnya - termasuk baris di dalam perulangan while (). Idealnya, kami ingin kode pengganti menjadi sekadat mungkin, dan kami tidak ingin harus menyesuaikan kode pengganti berdasarkan jumlah kolom dalam select
klausa kueri.
Mencari di internet, saya menemukan sejumlah solusi yang digunakan bind_param()
dengan call_user_func_array()
(misalnya, secara dinamis mengikat parameter mysqli_stmt dan kemudian mengikat hasil (PHP) ), tetapi sebagian besar solusi yang saya temukan pada akhirnya mengarah pada hasil yang disimpan dalam array asosiatif, bukan array yang diindeks secara numerik, dan banyak dari solusi ini tidak sekompak seperti yang saya inginkan dan / atau tidak cocok sebagai 'pengganti drop-in'. Namun, dari contoh yang saya temukan, saya dapat menggabungkan solusi ini, yang sesuai dengan tagihan:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$data=array();
for ($i=0;$i<$mysqli->field_count;$i++) {
$var = $i;
$$var = null;
$data[$var] = &$$var;
}
call_user_func_array(array($stmt,'bind_result'), $data);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
Tentu saja, perulangan for () bisa diciutkan menjadi satu baris agar lebih kompak.
Saya harap ini membantu siapa saja yang mencari solusi yang digunakan bind_result()
untuk menyimpan nilai dari setiap baris dalam array yang diindeks secara numerik dan / atau mencari cara untuk memigrasi kode warisan menggunakan get_result()
. Komentar diterima.
$stmt = $conn->mysqli->stmt_init();
?