Saya memiliki bidang tabel dalam database MySQL:
userid INT(11)
Jadi saya memanggilnya ke halaman saya dengan pertanyaan ini:
"SELECT userid FROM DB WHERE name='john'"
Kemudian untuk menangani hasil yang saya lakukan:
$row=$result->fetch_assoc();
$id=$row['userid'];
Sekarang jika saya lakukan:
echo gettype($id);
Saya mendapatkan string. Bukankah ini bilangan bulat?
$conn->query("your query")
saya mendapat bidang bilangan bulat sebagai string tetapi ketika saya menggunakan$conn->prepare("your query")
saya mendapat parameter karena mereka dalam databaseJawaban:
Ketika Anda memilih data dari database MySQL menggunakan PHP, tipe data akan selalu dikonversi ke string. Anda dapat mengubahnya kembali menjadi integer menggunakan kode berikut:
Atau dengan menggunakan fungsi
intval()
:sumber
Gunakan mysqlnd (driver asli) untuk php.
Jika Anda menggunakan Ubuntu:
Jika Anda menggunakan Centos:
Pengandar asli mengembalikan tipe integer dengan tepat.
Edit:
Seperti @Jeroen telah tunjukkan, metode ini hanya akan bekerja di luar kotak untuk PDO.
Seperti yang ditunjukkan oleh @LarsMoelleken, metode ini akan berfungsi dengan mysqli jika Anda juga mengatur opsi MYSQLI_OPT_INT_AND_FLOAT_NATIVE menjadi true.
Contoh:
sumber
$link = mysqli_connect('localhost', 'root', ''); mysqli_set_charset($link,'utf8'); $result = mysqli_query($link,'SELECT CAST(\'3.51\' AS DECIMAL(3,2))'); $row = mysqli_fetch_assoc($result); var_dump($row);
pengembalian:array(1) { ["CAST('3.51' AS DECIMAL(3,2))"]=> string(4) "3.51" }
Solusi termudah yang saya temukan:
Anda bisa memaksa json_encode untuk menggunakan angka aktual untuk nilai yang terlihat seperti angka:
(sejak PHP 5.3.3).
Atau Anda bisa memasukkan ID Anda ke int.
sumber
json_encode
string untuk melemparkan ke int jika memungkinkan seperti menggunakan mikroskop untuk mencekik kuku.UNIX_TIMESTAMP()
, misalnya.Solusi saya adalah untuk melewatkan hasil permintaan
$rs
dan mendapatkan array assoc dari data yang dicor sebagai pengembalian:Contoh penggunaan:
sumber
Tidak. Terlepas dari tipe data yang didefinisikan dalam tabel Anda, pengandar MySQL PHP selalu menyajikan nilai baris sebagai string.
Anda perlu memberikan ID Anda ke int.
sumber
Saya suka jawaban Chad, terutama ketika hasil kueri akan diteruskan ke javascript di browser. Javascript berurusan dengan entitas numerik seperti sebagai angka tetapi membutuhkan kerja ekstra untuk berurusan dengan entitas seperti numerik sebagai string. yaitu harus menggunakan parseInt atau parseFloat pada mereka.
Membangun pada solusi Chad Saya menggunakan ini dan sering kali persis apa yang saya butuhkan dan membuat struktur yang dapat dikodekan JSON agar mudah berurusan dengan javascript.
Menambahkan string numerik ke 0 menghasilkan tipe numerik dalam PHP dan mengidentifikasi tipe tersebut dengan benar sehingga angka floating point tidak akan terpotong menjadi bilangan bulat.
sumber
Ini terjadi ketika
PDO::ATTR_EMULATE_PREPARES
diatur ketrue
pada koneksi.Hati-hati, mengaturnya untuk
false
melarang penggunaan parameter lebih dari sekali. Saya percaya ini juga mempengaruhi kualitas pesan kesalahan yang datang kembali.sumber
Anda dapat melakukan ini dengan ...
... tergantung pada ekstensi yang ingin Anda gunakan. Yang pertama tidak direkomendasikan karena ekstensi mysql sudah usang. Yang ketiga masih eksperimental.
Komentar di hyperlink ini berfungsi dengan baik untuk menjelaskan cara mengatur tipe Anda dari string lama polos ke tipe aslinya dalam database.
Beberapa kerangka kerja juga mengabstraksi ini (CodeIgniter menyediakan
$this->db->field_data()
).Anda juga bisa melakukan menebak - seperti perulangan di baris yang dihasilkan dan menggunakan is_numeric () pada masing-masing. Sesuatu seperti:
Ini akan mengubah apa pun yang terlihat seperti angka menjadi satu ... pasti tidak sempurna.
sumber
if (is_float()) { $value = (float)$value; }
Dalam proyek saya, saya biasanya menggunakan fungsi eksternal yang "menyaring" data yang diambil
mysql_fetch_assoc
.Anda bisa mengganti nama bidang di tabel Anda sehingga intuitif untuk memahami tipe data mana yang disimpan.
Misalnya, Anda dapat menambahkan akhiran khusus untuk masing-masing bidang numerik: jika
userid
adalahINT(11)
Anda dapat mengubah nama ituuserid_i
atau jika itu adalahUNSIGNED INT(11)
Anda dapat mengubah namauserid_u
. Pada titik ini, Anda dapat menulis fungsi PHP sederhana yang menerima sebagai input array asosiatif (diambil denganmysql_fetch_assoc
), dan menerapkan casting ke "nilai" yang disimpan dengan "kunci" khusus itu.sumber
Jika pernyataan yang disiapkan digunakan, jenisnya akan int jika perlu. Kode ini mengembalikan array baris, di mana setiap baris adalah array asosiatif. Seperti jika
fetch_assoc()
dipanggil untuk semua baris, tetapi dengan info jenis yang diawetkan.sumber
MySQL memiliki driver untuk banyak bahasa lain, mengonversi data menjadi string "membakukan" data dan menyerahkannya kepada pengguna untuk mengetikkan nilai cast ke int atau lainnya
sumber
Dalam kasus saya
mysqlnd.so
ekstensi telah diinstal. TAPI saya belum melakukannyapdo_mysqlnd.so
. Jadi, masalah telah diselesaikan dengan menggantipdo_mysql.so
denganpdo_mysqlnd.so
.sumber
Saya suka teknik mastermind , tetapi codingnya bisa lebih sederhana:
Saya juga menambahkan memeriksa permintaan yang mengembalikan false daripada set hasil.
Dan memeriksa baris dengan bidang yang memiliki nilai nol.
Dan jika tipe yang diinginkan adalah string, saya tidak membuang waktu untuk itu - itu sudah menjadi string.
Saya tidak repot menggunakan ini di sebagian besar kode php; Saya hanya mengandalkan konversi tipe otomatis php. Tetapi jika meminta banyak data, untuk kemudian melakukan perhitungan aritmatika, masuk akal untuk menggunakan tipe optimal di muka.
sumber