Bisakah saya mencampur MySQL API di PHP?

106

Saya telah mencari di internet dan sejauh ini yang saya lihat adalah Anda dapat menggunakan mysql_dan mysqli_bersama - sama artinya:

<?php
$con=mysqli_connect("localhost", "root" ,"" ,"mysql");

if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysql_close($con);
echo "Done";
?>

atau

<?php
$con=mysql_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysqli_close($con);
echo "Done";
?>

Apakah valid tetapi ketika saya menggunakan kode ini yang saya dapatkan adalah:

Connected
Warning: mysql_close() expects parameter 1 to be resource, object given in D:\************.php on line 9
Done

Untuk yang pertama dan sama kecuali dengan mysqli_close(). Untuk yang kedua.

Apa masalahnya? Tidak bisakah saya menggunakan mysql_dan mysqlibersama - sama? Atau apakah itu normal? Apakah cara saya dapat memeriksa apakah koneksi benar-benar valid? (itu if(mysq...))

N3mo
sumber
5
mysql sudah tidak digunakan lagi, hanya masuk akal jika mereka tidak akan bekerja sama. Mengapa Anda mencoba melakukannya ..?
Sterling Archer
7
Anda harus menghindari penggunaan mysql_*fungsi sama sekali. Mereka rawan kesalahan dan tidak aman, dan akan segera dihapus dari PHP (saat ini ditandai sebagai usang ). [Jawaban bagus ini] [0] menjelaskan lebih detail mengapa itu buruk. [0]: stackoverflow.com/a/12860046/1055295
Andrei Bârsan
2
1) Anda bersikeras menggunakan antarmuka lama yang jelek (mysql) yang ditandai sebagai usang di dokumen sejak ribuan tahun ke-2) karena beberapa alasan aneh Anda ingin mencampurnya dengan penggantinya daripada melakukan hal yang benar dan mengonversinya ke yang baru 3 ) Anda sangat terkejut sehingga tidak berhasil sehingga Anda bertanya kepada SO tentang hal itu, meskipun seharusnya cukup jelas bahwa yang Anda lakukan adalah omong kosong.
fvu
1
Ini bukan takhayul. Tentu saja Anda dapat menulis kode buruk dengan mysqli_*fungsi dan kode bagus dengan fungsi mysql_*. Tetapi kategori terakhir ditandai sebagai usang karena ini adalah kumpulan fungsi yang lebih rendah, tidak dapat mendukung pemanggilan gaya-OO atau bahkan pernyataan yang disiapkan (untuk menyebutkan hanya dua contoh). Jika diberi pilihan dua alat untuk melakukan pekerjaan yang sama, salah satunya jelas lebih baik dalam jangka panjang dan lebih fleksibel, bukankah jawaban yang benar sudah jelas?
Andrei Bârsan
1
Tentu saja tidak. Namun, mengingat opsi untuk memilih antara fungsionalitas yang tidak digunakan lagi dan yang didukung secara aktif untuk, katakanlah, menggulirkan abstraksi Anda sendiri, mengapa menggunakan fungsi lama?
Andrei Bârsan

Jawaban:

66

Tidak, Anda tidak dapat menggunakan mysqldan mysqlibersama - sama. Mereka adalah API terpisah dan sumber daya yang mereka buat tidak kompatibel satu sama lain.

Namun mysqli_close, ada.

Pil Ledakan
sumber
Meskipun Anda tidak perlu menutup koneksi; objek membersihkan dirinya sendiri saat tidak lagi direferensikan di mana pun. (Tidak yakin apakah sumber daya lama biasa melakukan itu, tetapi objek benar-benar dapat memanfaatkan RAII hingga tingkat yang tidak signifikan.)
cHao
@cHao tidak hanya itu, tetapi PHP akan menutup semua koneksi MySQL yang terbuka ketika skrip keluar
Pil Ledakan
1
Tapi tidak selalu, menurut pengalaman saya, jadi kami selalu menempatkan tutup di bagian bawah file.
RationalRabbit
14

Hanya untuk memberikan jawaban umum di sini tentang ketiga API MYSQL dengan referensi:

Anda tidak dapat mencampur salah satu dari tiga ( mysql_*, mysqli_*, PDO) MYSQL API dari PHP bersama-sama, itu hanya tidak bekerja. Bahkan ada di FAQ manual :

Tidak mungkin mencampur ekstensi . Jadi, misalnya, meneruskan koneksi mysqli ke PDO_MySQL atau ext / mysql tidak akan berfungsi .


Anda perlu menggunakan MySQL API yang sama dan fungsi terkaitnya, mulai dari koneksi hingga kueri.

Rizier123
sumber
Beberapa orang mencoba memberi tahu saya hari ini bahwa mereka tidak ada masalah / kesalahan saat bercampur mysql_real_escape_string()dengan kode lainnya yang merupakan PDO. Apakah ada sesuatu yang tidak saya dapatkan di sini pada waktu saya bekerja dengan API yang berbeda ini? Apakah saya yang bodoh di sini? Ini adalah untuk pertanyaan "sekarang dihapus" stackoverflow.com/q/34209127 hanya dapat dilihat oleh 10K + anggota jika ada yang bertanya-tanya. Ini terkait dengan $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))- Apakah saya melewatkan sesuatu di sini?
Funk Forty Niner
1
@ Fred-ii- Anda benar :) Membaca manual menunjukkan bahwa Anda benar . Apa yang mungkin terjadi adalah, yang mysql_real_escape_string()secara diam - diam akan mencoba membuat koneksi dengan parameter default yang kemudian bekerja untuk OP. Jadi itu hanya membuat koneksi untuk mendapatkan set karakter. Jadi OP memiliki 2 koneksi
Rizier123
Jika OP telah setidaknya memberitahu saya / kami bahwa mereka mungkin memiliki 2 koneksi terpisah, saya mungkin setuju; mereka memutuskan sebaliknya. Namun, saya masih tidak bisa melihat bagaimana itu akan tetap berhasil. Jika ya, saya bingung.
Funk Forty Niner
@ Fred- ii- Lihat: link_identifier Ini akan menggunakan pengaturan koneksi default, yang didapatnya ini_get(). Jadi mungkin hanya berfungsi untuk OP dengan pengaturan default. Saya hanya akan meninggalkannya dan mendapatkan kopi baru (☕☕☕).
Rizier123
Anda mungkin ingin menambahkan sesuatu tentang sqlsrv_query(). Saya baru saja menutup pertanyaan di sini stackoverflow.com/q/41263771
Funk Forty Niner
2

Secara teknis Anda dapat menggunakan koneksi terpisah sebanyak yang Anda inginkan, sementara masalah Anda disebabkan oleh kesalahan ketik - Anda hanya tidak dapat menggunakan sumber daya dari satu ekstensi dengan fungsi dari ekstensi lain, yang jelas sekali.

Namun, Anda harus menghindari beberapa koneksi dari skrip yang sama , tidak peduli dari API tunggal atau yang berbeda. Karena akan membebani server database Anda dan menghabiskan sumber dayanya. Jadi, meskipun secara teknis Anda bisa, Anda tidak boleh mencampur ekstensi yang berbeda dalam kode Anda, kecuali untuk periode refactoring yang singkat.

Akal Sehat Anda
sumber
Meskipun ini mungkin ide yang bagus, tetapi penggabungan koneksi dikembangkan karena alasan ini. Saat Anda memiliki beberapa permintaan web yang masuk ke server web, Anda tidak dapat dengan mudah menggunakan koneksi yang sama, jadi Anda membuka koneksi baru. Penggabungan koneksi menghemat biaya tambahan pada server aplikasi dan database.
Doug
-3

MySQLijauh lebih aman daripada MySQLyang sekarang sudah tidak digunakan lagi. Itulah mengapa Anda harus tetap menggunakan MySQLidan juga Anda tidak dapat mencampurnya karena keduanya berbeda.

senja -tidak aktif-
sumber