PDO::prepare
Menyiapkan pernyataan untuk eksekusi.
Sintaks
PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
Parameter
$pernyataan: String yang berisi pernyataan SQL.
key_pair: Array yang berisi nama dan nilai atribut. Lihat bagian Keterangan untuk informasi selengkapnya.
Tampilkan Nilai
Mengembalikan objek PDOStatement saat berhasil. Jika gagal, mengembalikan objek PDOException, atau false tergantung pada nilai PDO::ATTR_ERRMODE
.
Keterangan
Driver Microsoft untuk PHP untuk SQL Server tidak mengevaluasi pernyataan yang disiapkan hingga eksekusi.
Tabel berikut ini mencantumkan kemungkinan nilai key_pair .
Kunci | Deskripsi |
---|---|
PDO::ATTR_CURSOR | Menentukan perilaku kursor. Defaultnya adalah PDO::CURSOR_FWDONLY , kursor maju yang tidak dapat digulir. PDO::CURSOR_SCROLL adalah kursor yang dapat digulirkan.Contohnya: array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY ) Ketika diatur ke PDO::CURSOR_SCROLL , Anda kemudian dapat menggunakan PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE untuk mengatur jenis kursor yang dapat digulir, yang dijelaskan di bawah ini.Lihat Jenis Kursor (driver PDO_SQLSRV) untuk informasi selengkapnya tentang kumpulan hasil dan kursor di driver PDO_SQLSRV. |
PDO::ATTR_EMULATE_PREPARES | Secara default, atribut ini adalah false, yang dapat diubah oleh ini PDO::ATTR_EMULATE_PREPARES => true . Lihat Meniru Persiapan untuk detail dan contoh. |
PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE | Menentukan tipe kursor yang dapat digulir. Hanya valid ketika PDO::ATTR_CURSOR diatur ke PDO::CURSOR_SCROLL . Lihat di bawah ini untuk nilai yang dapat diambil atribut ini. |
PDO::SQLSRV_ATTR_DECIMAL_PLACES | Menentukan jumlah tempat desimal saat memformat nilai uang yang diambil. Opsi ini hanya berfungsi jika PDO::SQLSRV_ATTR_FORMAT_DECIMALS benar. Untuk informasi selengkapnya, lihat Memformat String Desimal dan Nilai Uang (PDO_SQLSRV Driver). |
PDO::SQLSRV_ATTR_DIRECT_QUERY | Saat True, menentukan eksekusi kueri langsung. False berarti eksekusi pernyataan yang disiapkan. Untuk informasi selengkapnya tentang PDO::SQLSRV_ATTR_DIRECT_QUERY , lihat Eksekusi Pernyataan Langsung dan Eksekusi Pernyataan yang Disiapkan di Driver PDO_SQLSRV. |
PDO::SQLSRV_ATTR_ENCODING | PDO::SQLSRV_ENCODING_UTF8 (default) PDO::SQLSRV_ENCODING_SYSTEM PDO::SQLSRV_ENCODING_BINARY |
PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE | Menentukan apakah akan mengambil jenis tanggal dan waktu sebagai objek DateTime PHP . Untuk informasi selengkapnya, lihat Cara: Mengambil Jenis Tanggal dan Waktu sebagai Objek DateTime PHP Menggunakan Driver PDO_SQLSRV. |
PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE | Menangani pengambilan numerik dari kolom dengan jenis SQL numerik. Untuk informasi selengkapnya, lihat PDO::setAttribute. |
PDO::SQLSRV_ATTR_FORMAT_DECIMALS | Menentukan apakah akan menambahkan nol di depan ke string desimal jika sesuai. Jika diatur, opsi ini mengaktifkan PDO::SQLSRV_ATTR_DECIMAL_PLACES opsi untuk memformat jenis uang. Untuk informasi selengkapnya, lihat Memformat String Desimal dan Nilai Uang (PDO_SQLSRV Driver). |
PDO::SQLSRV_ATTR_QUERY_TIMEOUT | Untuk informasi selengkapnya, lihat PDO::setAttribute. |
Saat menggunakan PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
, Anda dapat menggunakan PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE
untuk menentukan jenis kursor. Misalnya, teruskan array berikut ke PDO::p repare untuk mengatur kursor dinamis:
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
Tabel berikut ini memperlihatkan nilai yang mungkin untuk PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE
. Untuk informasi selengkapnya tentang kursor yang dapat digulir, lihat Jenis Kursor (driver PDO_SQLSRV).
Nilai | Deskripsi |
---|---|
PDO::SQLSRV_CURSOR_BUFFERED | Membuat kursor statis sisi klien (buffered), yang buffer hasilnya diatur dalam memori pada komputer klien. |
PDO::SQLSRV_CURSOR_DYNAMIC | Membuat kursor dinamis sisi server (tidak dibuffer), yang memungkinkan Anda mengakses baris dalam urutan apa pun dan akan mencerminkan perubahan dalam database. |
PDO::SQLSRV_CURSOR_KEYSET | Membuat kursor set kunci sisi server. Kursor set kunci tidak memperbarui jumlah baris jika baris dihapus dari tabel (baris yang dihapus dikembalikan tanpa nilai). |
PDO::SQLSRV_CURSOR_STATIC | Membuat kursor statis sisi server, yang memungkinkan Anda mengakses baris dalam urutan apa pun tetapi tidak akan mencerminkan perubahan dalam database.PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL menyiratkan PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_STATIC . |
Anda dapat menutup objek PDOStatement dengan memanggil unset
:
unset($stmt);
Contoh teruskan-saja
Contoh ini menunjukkan cara menggunakan PDO::p repare dengan penanda parameter dan kursor khusus maju.
<?php
$database = "Test";
$server = "(local)";
$conn = new PDO( "sqlsrv:server=$server ; Database = $database", "", "");
$col1 = 'a';
$col2 = 'b';
$query = "insert into Table1(col1, col2) values(?, ?)";
$stmt = $conn->prepare( $query, array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY, PDO::SQLSRV_ATTR_QUERY_TIMEOUT => 1 ) );
$stmt->execute( array( $col1, $col2 ) );
print $stmt->rowCount();
echo "\n";
$query = "insert into Table1(col1, col2) values(:col1, :col2)";
$stmt = $conn->prepare( $query, array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY, PDO::SQLSRV_ATTR_QUERY_TIMEOUT => 1 ) );
$stmt->execute( array( ':col1' => $col1, ':col2' => $col2 ) );
print $stmt->rowCount();
unset($stmt);
?>
Contoh kursor statis
Contoh ini menunjukkan cara menggunakan PDO::p repare dengan kursor statis sisi server. Misalnya memperlihatkan kursor sisi klien, lihat Jenis Kursor (driver PDO_SQLSRV).
<?php
$database = "AdventureWorks";
$server = "(local)";
$conn = new PDO( "sqlsrv:server=$server ; Database = $database", "", "");
$query = "select * from Person.ContactType";
$stmt = $conn->prepare( $query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt->execute();
echo "\n";
while ( $row = $stmt->fetch( PDO::FETCH_ASSOC ) ){
print "$row[Name]\n";
}
echo "\n..\n";
$row = $stmt->fetch( PDO::FETCH_BOTH, PDO::FETCH_ORI_FIRST );
print_r($row);
$row = $stmt->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_REL, 1 );
print "$row[Name]\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT );
print "$row[1]\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR );
print "$row[1]..\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_ABS, 0 );
print_r($row);
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_LAST );
print_r($row);
?>
Contoh yang ditargetkan
Dua cuplikan berikut menunjukkan cara menggunakan PDO::p repare dengan data yang ditargetkan untuk kolom CHAR/VARCHAR. Karena pengodean default untuk PDO::p repare adalah UTF-8, pengguna dapat menggunakan opsi PDO::SQLSRV_ENCODING_SYSTEM
untuk menghindari konversi implisit.
Opsi 1
$options = array(PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_SYSTEM);
$statement = $pdo->prepare(
'SELECT *
FROM myTable
WHERE myVarcharColumn = :myVarcharValue',
$options
);
$statement->bindValue(':myVarcharValue', 'my data', PDO::PARAM_STR);
Opsi 2
$statement = $pdo->prepare(
'SELECT *
FROM myTable
WHERE myVarcharColumn = :myVarcharValue'
);
$p = 'my data';
$statement->bindParam(':myVarcharValue', $p, PDO::PARAM_STR, 0, PDO::SQLSRV_ENCODING_SYSTEM);
Contoh persiapan
Contoh ini menunjukkan cara menggunakan PDO::p repare dengan PDO::ATTR_EMULATE_PREPARES
diatur ke true.
<?php
$serverName = "yourservername";
$username = "yourusername";
$password = "yourpassword";
$database = "tempdb";
$conn = new PDO("sqlsrv:server = $serverName; Database = $database", $username, $password);
$pdo_options = array();
$pdo_options[PDO::ATTR_EMULATE_PREPARES] = true;
$pdo_options[PDO::SQLSRV_ATTR_ENCODING] = PDO::SQLSRV_ENCODING_UTF8;
$stmt = $conn->prepare("CREATE TABLE TEST([id] [int] IDENTITY(1,1) NOT NULL,
[name] nvarchar(max))",
$pdo_options);
$stmt->execute();
$prefix = '가각';
$name = '가각ácasa';
$name2 = '가각sample2';
$stmt = $conn->prepare("INSERT INTO TEST(name) VALUES(:p0)", $pdo_options);
$stmt->execute(['p0' => $name]);
unset($stmt);
$stmt = $conn->prepare("SELECT * FROM TEST WHERE NAME LIKE :p0", $pdo_options);
$stmt->execute(['p0' => "$prefix%"]);
foreach ($stmt as $row) {
echo "\n" . 'FOUND: ' . $row['name'];
}
unset($stmt);
unset($conn);
?>
Driver PDO_SQLSRV secara internal menggantikan semua tempat penampung dengan parameter yang terikat oleh PDOStatement::bindParam(). Oleh karena itu, string kueri SQL tanpa tempat penampung dikirim ke server. Pertimbangkan contoh ini,
$statement = $PDO->prepare("INSERT into Customers (CustomerName, ContactName) VALUES (:cus_name, :con_name)");
$statement->bindParam(:cus_name, "Cardinal");
$statement->bindParam(:con_name, "Tom B. Erichsen");
$statement->execute();
Dengan PDO::ATTR_EMULATE_PREPARES
diatur ke false (kasus default), data yang dikirim ke database adalah:
"INSERT into Customers (CustomerName, ContactName) VALUES (:cus_name, :con_name)"
Information on :cus_name parameter
Information on :con_name parameter
Server akan menjalankan kueri menggunakan fitur kueri parameternya untuk parameter pengikatan. Di sisi lain, dengan PDO::ATTR_EMULATE_PREPARES
diatur ke true, kueri yang dikirim ke server pada dasarnya adalah:
"INSERT into Customers (CustomerName, ContactName) VALUES ('Cardinal', 'Tom B. Erichsen')"
Pengaturan PDO::ATTR_EMULATE_PREPARES
ke true dapat melewati beberapa batasan dalam SQL Server. Misalnya, SQL Server tidak mendukung parameter bernama atau posisi dalam beberapa klausa Transact-SQL. Selain itu, SQL Server memiliki batas pengikatan 2100 parameter.
Catatan
Dengan persiapan emulasi diatur ke true, keamanan kueri berparameter tidak berlaku. Oleh karena itu, aplikasi Anda harus memastikan bahwa data yang terikat ke parameter tidak berisi kode Transact-SQL berbahaya.
Pengodean
Jika pengguna ingin mengikat parameter dengan pengodean yang berbeda (misalnya, UTF-8 atau biner), pengguna harus dengan jelas menentukan pengodean dalam skrip PHP.
Driver PDO_SQLSRV pertama kali memeriksa pengodean yang ditentukan dalam PDO::bindParam()
(misalnya, $statement->bindParam(:cus_name, "Cardinal", PDO::PARAM_STR, 10, PDO::SQLSRV_ENCODING_UTF8)
).
Jika tidak ditemukan, driver memeriksa apakah ada pengodean yang diatur di PDO::prepare()
atau PDOStatement::setAttribute()
. Jika tidak, driver akan menggunakan pengodean yang ditentukan di PDO::__construct()
atau PDO::setAttribute()
.
Selain itu, dimulai dengan versi 5.8.0, saat menggunakan PDO::p repare dengan PDO::ATTR_EMULATE_PREPARES
diatur ke true, pengguna dapat menggunakan jenis string yang diperluas yang diperkenalkan di PHP 7.2 untuk memastikan bahwa N
awalan digunakan. Cuplikan di bawah ini menampilkan berbagai alternatif.
Catatan
Secara default, persiapan emulasi diatur ke false, dalam hal ini konstanta string PDO yang diperluas akan diabaikan.
Menggunakan opsi driver PDO::SQLSRV_ENCODING_UTF8 saat mengikat
$p = '가각';
$sql = 'SELECT :value';
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
$stmt = $conn->prepare($sql, $options);
$stmt->bindParam(':value', $p, PDO::PARAM_STR, 0, PDO::SQLSRV_ENCODING_UTF8);
$stmt->execute();
Menggunakan atribut PDO::SQLSRV_ATTR_ENCODING
$p = '가각';
$sql = 'SELECT :value';
$options = array(PDO::ATTR_EMULATE_PREPARES => true, PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8);
$stmt = $conn->prepare($sql, $options);
$stmt->execute([':value' => $p]);
Menggunakan konstanta PDO PDO::P ARAM_STR_NATL
$p = '가각';
$sql = 'SELECT :value';
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
$stmt = $conn->prepare($sql, $options);
$stmt->bindParam(':value', $p, PDO::PARAM_STR | PDO::PARAM_STR_NATL);
$stmt->execute();
Mengatur jenis param string default PDO::P ARAM_STR_NATL
$conn->setAttribute(PDO::ATTR_DEFAULT_STR_PARAM, PDO::PARAM_STR_NATL);
$p = '가각';
$sql = 'SELECT :value';
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
$stmt = $conn->prepare($sql, $options);
$stmt->execute([':value' => $p]);
Batasan
Seperti yang Anda lihat, pengikatan dilakukan secara internal oleh pengemudi. Kueri yang valid dikirim ke server untuk dieksekusi tanpa parameter apa pun. Dibandingkan dengan kasus reguler, beberapa keterbatasan menghasilkan ketika fitur kueri berparameter tidak digunakan.
- Ini tidak berfungsi untuk parameter yang terikat sebagai
PDO::PARAM_INPUT_OUTPUT
.- Ketika pengguna menentukan
PDO::PARAM_INPUT_OUTPUT
dalamPDO::bindParam()
, pengecualian PDO dilemparkan.
- Ketika pengguna menentukan
- Ini tidak berfungsi untuk parameter yang terikat sebagai parameter output.
- Ketika pengguna membuat pernyataan yang disiapkan dengan tempat penampung yang dimaksudkan untuk parameter output (yaitu, memiliki tanda sama dengan segera setelah tempat penampung, seperti
SELECT ? = COUNT(*) FROM Table1
), pengecualian PDO dilemparkan. - Ketika pernyataan yang disiapkan memanggil prosedur tersimpan dengan tempat penampung sebagai argumen untuk parameter output, tidak ada pengecualian yang dilemparkan karena driver tidak dapat mendeteksi parameter output. Namun, variabel yang disediakan pengguna untuk parameter output akan tetap tidak berubah.
- Ketika pengguna membuat pernyataan yang disiapkan dengan tempat penampung yang dimaksudkan untuk parameter output (yaitu, memiliki tanda sama dengan segera setelah tempat penampung, seperti
- Tempat penampung duplikat untuk parameter yang dikodekan biner tidak akan berfungsi
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk