Ini kode saya:
include 'conn.php';
$conn = new Connection();
$query = 'SELECT EmailVerified, Blocked FROM users WHERE Email = ? AND SLA = ? AND `Password` = ?';
$stmt = $conn->mysqli->prepare($query);
$stmt->bind_param('sss', $_POST['EmailID'], $_POST['SLA'], $_POST['Password']);
$stmt->execute();
$result = $stmt->get_result();
Saya mendapatkan kesalahan pada baris terakhir sebagai: Panggilan ke metode yang tidak ditentukan mysqli_stmt :: get_result ()
Berikut adalah kode untuk conn.php:
define('SERVER', 'localhost');
define('USER', 'root');
define('PASS', 'xxxx');
define('DB', 'xxxx');
class Connection{
/**
* @var Resource
*/
var $mysqli = null;
function __construct(){
try{
if(!$this->mysqli){
$this->mysqli = new MySQLi(SERVER, USER, PASS, DB);
if(!$this->mysqli)
throw new Exception('Could not create connection using MySQLi', 'NO_CONNECTION');
}
}
catch(Exception $ex){
echo "ERROR: ".$e->getMessage();
}
}
}
Jika saya menulis baris ini:
if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';
Ini mencetak 'Pernyataan TIDAK disiapkan' . Jika saya menjalankan kueri langsung di IDE menggantikan? menandai dengan nilai, itu berfungsi dengan baik. Harap dicatat bahwa objek $ conn berfungsi dengan baik di kueri lain dalam proyek ini.
Tolong bantu ...
$stmt = $conn->mysqli->stmt_init();
?$_POST['EmailID'], $_POST['SLA'], $_POST['Password']
dikirimkan dengan benar menggunakan formulir HTML dengan metode POSTJawaban:
Silakan baca catatan pengguna untuk metode ini:
http://php.net/manual/en/mysqli-stmt.get-result.php
Ini membutuhkan driver mysqlnd ... jika tidak diinstal pada ruang web Anda, Anda harus bekerja dengan BIND_RESULT & FETCH!
https://secure.php.net/manual/en/mysqli-stmt.bind-result.php
https://secure.php.net/manual/en/mysqli-stmt.fetch.php
sumber
mysqli_stmt::get_result()
hanya tersedia di PHP v5.3.0 atau lebih tinggi.php_mysqli_mysqlnd.dll
? Saya hanya punyaphp_mysqli.dll
diext
folder saya .Jadi jika driver MySQL Native Driver (mysqlnd) tidak tersedia, dan oleh karena itu menggunakan bind_result dan fetch alih-alih get_result , kodenya menjadi:
sumber
$EmailVerfied
dibuat dengan panggilan kebind_result()
.Sistem Anda kehilangan driver mysqlnd!
Jika Anda dapat menginstal paket baru di server (berbasis Debian / Ubuntu), instal driver:
lalu mulai ulang server web Anda:
sumber
bagi mereka yang mencari alternatif untuk
$result = $stmt->get_result()
saya telah membuat fungsi ini yang memungkinkan Anda untuk meniru$result->fetch_assoc()
tetapi menggunakan secara langsung objek stmt:seperti yang Anda lihat, ia membuat sebuah larik dan mengambilnya dengan data baris, karena ia menggunakan secara
$stmt->fetch()
internal, Anda dapat memanggilnya seperti yang Anda panggilmysqli_result::fetch_assoc
(pastikan saja bahwa$stmt
objeknya terbuka dan hasilnya disimpan):sumber
$statement->store_result();
diperlukan sebelum memanggil fungsi, mengapa tidak memasukkannya saja ke dalam fungsi?Dengan PHP versi 7.2 saya hanya menggunakan nd_mysqli daripada mysqli dan bekerja seperti yang diharapkan.
Langkah-langkah untuk mengaktifkannya ke server hosting GoDaddy-
sumber
Saya tahu ini sudah dijawab tentang masalah sebenarnya, namun saya ingin menawarkan solusi sederhana.
Saya ingin menggunakan metode get_results () namun saya tidak memiliki driver, dan saya tidak berada di suatu tempat untuk menambahkannya. Jadi, sebelum saya menelepon
Saya membuat array kosong, dan kemudian mengikat hasilnya sebagai kunci dalam array itu:
sehingga hasil tersebut dapat dengan mudah diteruskan ke metode atau dilemparkan ke objek untuk digunakan lebih lanjut.
Semoga ini membantu siapa saja yang ingin melakukan hal serupa.
sumber
Saya mendapatkan kesalahan yang sama di server saya - PHP 7.0 dengan ekstensi mysqlnd sudah diaktifkan.
Solusinya bagi saya (berkat halaman ini ) adalah membatalkan pilihan ekstensi mysqli dan memilih nd_mysqli sebagai gantinya.
NB - Anda mungkin dapat mengakses pemilih ekstensi di cPanel Anda. (Saya mengakses milik saya melalui opsi Pilih Versi PHP .)
sumber
session_start()
fungsi PHP membuat saya seperti nilai yang tidak ada. Kemudian saya meningkatkan ke versi7.2
PHP dan mengubah ekstensimysqli
menjadind_mysqli
(diperbaiki). Tapi, saya punya dua pertanyaan, apa perbedaan antara keduanya? dan apakah akan ada celah keamanan untuk menggunakan ekstensi itu?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 yangget_result()
menawarkan - tanpa menggunakanget_result()
.get_result()
is / sering dikombinasikan denganfetch_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: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 menggunakanget_result()
. Atau, bagaimana cara memigrasi kode lama yang digunakanget_result()
untuk berjalan tanpanya (mis. Menggunakanbind_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:
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 kebind_results()
. Jika kita memigrasi aplikasi lawas yang memiliki banyak query, dan setiap query mungkin berisi jumlah field yang berbeda dalamselect
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 dalamselect
klausa kueri.Mencari di internet, saya menemukan sejumlah solusi yang digunakan
bind_param()
dengancall_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: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 menggunakanget_result()
. Komentar diterima.sumber
Ini alternatif saya. Ini berorientasi objek dan lebih seperti mysql / mysqli.
Pemakaian:
sumber
Saya telah menulis dua fungsi sederhana yang memberikan fungsionalitas yang sama
$stmt->get_result();
, tetapi mereka tidak memerlukan driver mysqlnd.Anda cukup mengganti
$result = $stmt->get_result();
dengan$fields = bindAll($stmt);
dan
$row= $stmt->get_result();
dengan$row = fetchRowAssoc($stmt, $fields);
.(Untuk mendapatkan jumlah baris yang dikembalikan, Anda dapat menggunakan
$stmt->num_rows
.)Anda hanya perlu menempatkan dua fungsi ini yang telah saya tulis di suatu tempat di Script PHP Anda . (misalnya tepat di bawah)
Bagaimana cara kerjanya :
Kode saya menggunakan
$stmt->result_metadata();
fungsi untuk mengetahui berapa banyak dan bidang mana yang dikembalikan dan kemudian secara otomatis mengikat hasil yang diambil ke referensi yang dibuat sebelumnya. Bekerja seperti pesona!sumber