PDO::prepare
Menyiapkan pernyataan untuk eksekusi.
Sintaks
PDOStatement PDO::prepare ( $statement [ , array(key_pair) ] )
Parameter
$statement
String yang berisi pernyataan SQL.
key_pair
Array yang berisi nama dan nilai atribut. Untuk informasi selengkapnya, lihat bagian Keterangan.
Nilai hasil
Mengembalikan objek pada PDOStatement
keberhasilan. Jika gagal, mengembalikan PDOException
objek, 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 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 digulir.Contohnya, array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY ) .Saat diatur ke PDO::CURSOR_SCROLL , Anda kemudian dapat menggunakan PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE untuk mengatur jenis kursor yang dapat digulir, yang dijelaskan nanti dalam artikel ini.Lihat Jenis Kursor (driver PDO_SQLSRV) untuk informasi selengkapnya tentang kumpulan hasil dan kursor di PDO_SQLSRV driver. |
PDO::ATTR_EMULATE_PREPARES |
Secara default, atribut ini 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 nanti di artikel 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 (driver PDO_SQLSRV). |
PDO::SQLSRV_ATTR_DIRECT_QUERY |
Ketika 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 memungkinkan PDO::SQLSRV_ATTR_DECIMAL_PLACES opsi untuk memformat jenis uang. Untuk informasi selengkapnya, lihat Memformat String Desimal dan Nilai Uang (driver PDO_SQLSRV). |
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 untuk PDO::prepare
mengatur kursor dinamis:
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
Tabel berikut ini memperlihatkan kemungkinan nilai 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 menyangga hasil yang 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 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 mencerminkan perubahan dalam database.PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL menyiratkan PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_STATIC . |
Anda dapat menutup PDOStatement
objek dengan memanggil unset
:
unset($stmt);
Contoh forward-only
Contoh ini menunjukkan cara menggunakan PDO::prepare
dengan penanda parameter dan kursor hanya-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::prepare
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::prepare
dengan data yang ditargetkan untuk kolom char / varchar . Karena pengodean default untuk PDO::prepare
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 mengganti 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 menjalankan kueri menggunakan fitur kueri berparameternya 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 di SQL Server. Misalnya, SQL Server tidak mendukung parameter bernama atau posisi dalam beberapa klausa Transact-SQL. Selain itu, SQL Server memiliki batas pengikatan 2.100 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-tama 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 menggunakan pengodean yang ditentukan dalam 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 berikut menampilkan berbagai alternatif.
Catatan
Secara default, persiapan emulasi diatur ke false, dalam hal ini konstanta string PDO yang diperluas akan diabaikan.
Gunakan 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();
Gunakan 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]);
Gunakan 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();
Atur 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 driver. 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 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 berfungsi.