Bagikan melalui


PDO::prepare

Unduh driver PHP

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 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 tetap tidak berubah.
  • Tempat penampung duplikat untuk parameter yang dikodekan biner tidak berfungsi.