PDO::prepare

Unduh driver PHP

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 dalam PDO::bindParam(), pengecualian PDO dilemparkan.
  • 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.
  • Tempat penampung duplikat untuk parameter yang dikodekan biner tidak akan berfungsi

Lihat juga

Kelas PDO

PDO