Hướng dẫn php pdo( sqlsrv prepare) - php pdo (chuẩn bị sqlsrv)

Chuyển đến nội dung chính

Trình duyệt này không còn được hỗ trợ nữa.

Hãy nâng cấp lên Microsoft Edge để tận dụng các tính năng mới nhất, bản cập nhật bảo mật và hỗ trợ kỹ thuật.

Thực thi câu lệnh trực tiếp và thực thi câu lệnh đã chuẩn bị trong trình điều khiển PDO_SQLSRV

  • Bài viết
  • 09/09/2022
  • 2 Phú

Trong bài viết nào

Hướng dẫn php pdo( sqlsrv prepare) - php pdo (chuẩn bị sqlsrv)
Tải xuống trình điều khiển PHP

Chủ đề này thảo luận về việc sử dụng thuộc tính PDO :: SQLSRV_ATTR_DIRECT_Query để chỉ định thực thi câu lệnh trực tiếp thay vì mặc định, được thực thi câu lệnh được chuẩn bị. Sử dụng một câu lệnh đã chuẩn bị có thể dẫn đến hiệu suất tốt hơn nếu câu lệnh được thực thi nhiều lần bằng cách sử dụng liên kết tham số.

Nhận xét

Nếu bạn muốn gửi câu lệnh Transact-SQL trực tiếp đến máy chủ mà không cần chuẩn bị câu lệnh của trình điều khiển, bạn có thể đặt thuộc tính PDO :: SQLSRV_ATTR_DIRECT_QUERY với PDO :: SetAttribution (hoặc dưới dạng tùy chọn trình điều khiển được chuyển cho PDO :: __ Bạn gọi PDO :: Chuẩn bị. Theo mặc định, giá trị của PDO :: SQLSRV_ATTR_DIRECT_Query là sai (sử dụng thực thi câu lệnh đã chuẩn bị).

Nếu bạn sử dụng PDO :: Truy vấn, bạn có thể muốn thực hiện trực tiếp. Trước khi gọi PDO :: Truy vấn, gọi PDO :: SetAttribution và Set PDO :: SQLSRV_ATTR_DIRECT_Query thành true. Mỗi cuộc gọi đến PDO :: Truy vấn có thể được thực thi với một cài đặt khác nhau cho PDO :: SQLSRV_ATTR_DIRECT_Query.

Nếu bạn sử dụng PDO :: Chuẩn bị và PDostatement :: Thực thi để thực thi truy vấn nhiều lần bằng cách sử dụng các tham số ràng buộc, thực thi câu lệnh đã chuẩn bị tối ưu hóa việc thực thi truy vấn lặp lại. Trong tình huống này, hãy gọi PDO :: Chuẩn bị với PDO :: SQLSRV_ATTR_DIRECT_Query thành Sai trong tham số mảng tùy chọn trình điều khiển. Khi cần thiết, bạn có thể thực hiện các câu lệnh đã chuẩn bị với PDO :: SQLSRV_ATTR_DIRECT_Query được đặt thành Sai.

Sau khi bạn gọi PDO :: Chuẩn bị, giá trị của PDO :: SQLSRV_ATTR_DIRECT_Query không thể thay đổi khi thực hiện truy vấn đã chuẩn bị.

Nếu một truy vấn yêu cầu bối cảnh được đặt trong truy vấn trước đó, thì hãy thực hiện các truy vấn của bạn bằng PDO :: SQLSRV_ATTR_DIRECT_Query được đặt thành true. Ví dụ: nếu bạn sử dụng các bảng tạm thời trong các truy vấn của mình, PDO :: SQLSRV_ATTR_DIRECT_Query phải được đặt thành True.

Mẫu sau đây cho thấy rằng khi ngữ cảnh từ câu lệnh trước đó là bắt buộc, bạn cần đặt PDO :: SQLSRV_ATTR_DIRECT_Query thành true. Mẫu này sử dụng các bảng tạm thời, chỉ có sẵn cho các câu lệnh tiếp theo trong chương trình của bạn khi các truy vấn được thực thi trực tiếp.

Ghi chú

Nếu truy vấn được gọi một thủ tục được lưu trữ và các bảng tạm thời được sử dụng trong quy trình được lưu trữ này, hãy sử dụng PDO :: Exec thay thế.

setAttribute(constant('PDO::SQLSRV_ATTR_DIRECT_QUERY'), true);  
  
   $stmt1 = $conn->query("DROP TABLE #php_test_table");  
  
   $stmt2 = $conn->query("CREATE TABLE #php_test_table ([c1_int] int, [c2_int] int)");  
  
   $v1 = 1;  
   $v2 = 2;  
  
   $stmt3 = $conn->prepare("INSERT INTO #php_test_table (c1_int, c2_int) VALUES (:var1, :var2)");  
  
   if ($stmt3) {  
      $stmt3->bindValue(1, $v1);  
      $stmt3->bindValue(2, $v2);  
  
      if ($stmt3->execute())  
         echo "Execution succeeded\n";       
      else  
         echo "Execution failed\n";  
   }  
   else  
      var_dump($conn->errorInfo());  
  
   $stmt4 = $conn->query("DROP TABLE #php_test_table");  
?>  

Xem thêm

Lớp PDO

PDO

Nhận xét

Người giữ chỗ trùng lặp cho một tham số được mã hóa nhị phân sẽ không hoạt động

Xem thêm

Lớp PDO

PDO::prepare

  • Bài báo
  • 09/09/2022
  • 7 phút để đọc

Trong bài viết này

Tải xuống trình điều khiển PHP

Chuẩn bị một tuyên bố để thực hiện.

Cú pháp

PDOStatement PDO::prepare ( $statement [, array(key_pair)] )

Thông số

Tuyên bố $: Một chuỗi chứa câu lệnh SQL.

key_pair: một mảng chứa một tên và giá trị thuộc tính. Xem phần Nhận xét để biết thêm thông tin.

Giá trị trả về

Trả về một đối tượng pdostatement về thành công. Khi thất bại, trả về một đối tượng PDOException hoặc sai tùy thuộc vào giá trị của

PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
6.

Nhận xét

Trình điều khiển Microsoft cho PHP cho SQL Server không đánh giá các câu lệnh đã chuẩn bị cho đến khi thực hiện.

Bảng sau liệt kê các giá trị key_pair có thể.

Chìa khóaSự mô tả
PDO :: attr_cursorChỉ định hành vi con trỏ. Mặc định là
PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
7, một con trỏ chuyển tiếp không thể cuộn được.
PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
8 là một con trỏ có thể cuộn.

Ví dụ,

PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
9.

Khi được đặt thành

PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
8, sau đó bạn có thể sử dụng
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
1 để đặt loại con trỏ có thể cuộn, được mô tả bên dưới.

Xem các loại con trỏ (trình điều khiển PDO_SQLSRV) để biết thêm thông tin về các bộ kết quả và con trỏ trong trình điều khiển PDO_SQLSRV.

PDO :: attr_emulation_preparesTheo mặc định, thuộc tính này là sai, có thể được thay đổi bởi
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
2 này. Xem mô phỏng Chuẩn bị để biết chi tiết và ví dụ.
PDO :: SQLSRV_ATTR_CURSOR_SCROLL_TYPEChỉ định loại con trỏ có thể cuộn. Chỉ hợp lệ khi
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
3 được đặt thành
PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
8. Xem bên dưới để biết các giá trị Thuộc tính này có thể lấy.
PDO :: SQLSRV_ATTR_DECIMAL_PLACESChỉ định số lượng vị trí thập phân khi định dạng giá trị tiền được lấy. Tùy chọn này chỉ hoạt động khi
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
5 là đúng. Để biết thêm thông tin, hãy xem định dạng chuỗi thập phân và giá trị tiền (trình điều khiển PDO_SQLSRV).
PDO :: SQLSRV_ATTR_DIRECT_QueryKhi đúng, chỉ định thực thi truy vấn trực tiếp. Sai nghĩa là thực thi tuyên bố đã chuẩn bị. Để biết thêm thông tin về
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
6, hãy xem thực thi câu lệnh trực tiếp và thực thi câu lệnh đã chuẩn bị trong trình điều khiển PDO_SQLSRV.
PDO :: SQLSRV_ATTR_ENCODINGPDO :: SQLSRV_ENCODING_UTF8 (mặc định)

PDO::SQLSRV_ENCODING_SYSTEM

PDO::SQLSRV_ENCODING_BINARY

PDO :: SQLSRV_ATTR_FETCHES_DATETIME_TYPEChỉ định xem có nên truy xuất các loại ngày và thời gian làm đối tượng DateTime PHP hay không. Để biết thêm thông tin, hãy xem Cách: Truy xuất các loại ngày và giờ làm đối tượng DateTime PHP bằng trình điều khiển PDO_SQLSRV.
PDO :: SQLSRV_ATTR_FETCHES_NUMERIC_TYPEXử lý các số tìm nạp từ các cột với các loại SQL số. Để biết thêm thông tin, xem PDO :: SetAttribution.
PDO :: SQLSRV_ATTR_FORMAT_DECIMALSChỉ định xem có nên thêm số 0 hàng đầu vào các chuỗi thập phân khi thích hợp hay không. Nếu được đặt, tùy chọn này cho phép tùy chọn
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
7 để định dạng các loại tiền. Để biết thêm thông tin, hãy xem định dạng chuỗi thập phân và giá trị tiền (trình điều khiển PDO_SQLSRV).
PDO :: SQLSRV_ATTR_Query_TimeoutĐể biết thêm thông tin, xem PDO :: SetAttribution.

Khi sử dụng

array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
8, bạn có thể sử dụng
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
1 để chỉ định loại con trỏ. Ví dụ: chuyển mảng sau cho PDO :: Chuẩn bị để đặt con trỏ động:

array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));

Bảng sau đây cho thấy các giá trị có thể cho

array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
1. Để biết thêm thông tin về con trỏ có thể cuộn, hãy xem các loại con trỏ (trình điều khiển PDO_SQLSRV).

Giá trịSự mô tả
PDO :: SQLSRV_CURSOR_BUFFEREDTạo con trỏ tĩnh phía máy khách (bộ đệm), bộ đệm kết quả đặt trong bộ nhớ trên máy khách.
PDO :: SQLSRV_CURSOR_DYNAMICTạo một con trỏ động bên máy chủ (không bị trói), cho phép bạn truy cập các hàng theo bất kỳ thứ tự nào và sẽ phản ánh các thay đổi trong cơ sở dữ liệu.
PDO :: SQLSRV_CURSOR_KEYSETTạo một con trỏ phím phía máy chủ. Một con trỏ phím không cập nhật số lượng hàng nếu một hàng bị xóa khỏi bảng (một hàng bị xóa được trả về không có giá trị).
PDO :: SQLSRV_CURSOR_STATICTạo một con trỏ tĩnh phía máy chủ, cho phép bạn truy cập các hàng theo bất kỳ thứ tự nào nhưng sẽ không phản ánh các thay đổi trong cơ sở dữ liệu.

array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_DYNAMIC));
8 ngụ ý
unset($stmt);
2.

Bạn có thể đóng một đối tượng pdostatement bằng cách gọi

unset($stmt);
3:

unset($stmt);

Ví dụ về phía trước

Ví dụ này cho thấy cách sử dụng PDO :: Chuẩn bị với các điểm đánh dấu tham số và con trỏ chỉ về phía trước.

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);
?>

Ví dụ con trỏ tĩnh

Ví dụ này cho thấy cách sử dụng PDO :: Chuẩn bị với con trỏ tĩnh phía máy chủ. Để biết ví dụ hiển thị con trỏ phía máy khách, hãy xem các loại con trỏ (trình điều khiển PDO_SQLSRV).

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);
?>

Ví dụ mục tiêu

Hai đoạn sau đây cho thấy cách sử dụng PDO :: Chuẩn bị với dữ liệu được nhắm mục tiêu cho các cột char/varchar. Vì mã hóa mặc định cho PDO :: Chuẩn bị là UTF-8, người dùng có thể sử dụng tùy chọn

unset($stmt);
4 để tránh chuyển đổi ngầm.

lựa chọn 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);

Lựa chọn 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);

Chuẩn bị ví dụ

Ví dụ này cho thấy cách sử dụng PDO :: Chuẩn bị với

unset($stmt);
5 được đặt thành True.

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);
?>

Trình điều khiển PDO_SQLSRV thay thế nội bộ thay thế tất cả các trình giữ chỗ bằng các tham số được ràng buộc bởi pdostatement :: bindparam (). Do đó, một chuỗi truy vấn SQL không có người giữ chỗ được gửi đến máy chủ. Xem xét ví dụ này,

$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();

Với

unset($stmt);
5 được đặt thành false (trường hợp mặc định), dữ liệu được gửi đến cơ sở dữ liệu là:

PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
0

Máy chủ sẽ thực thi truy vấn bằng tính năng truy vấn được tham số hóa của nó để tham số liên kết. Mặt khác, với

unset($stmt);
5 được đặt thành True, truy vấn được gửi đến máy chủ về cơ bản là:

PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
1

Cài đặt

unset($stmt);
5 thành true có thể bỏ qua một số hạn chế trong SQL Server. Ví dụ: SQL Server không hỗ trợ các tham số được đặt tên hoặc vị trí trong một số mệnh đề Transact-SQL. Hơn nữa, SQL Server có giới hạn liên kết 2100 tham số.

Ghi chú

Với việc mô phỏng các chuẩn bị được đặt thành TRUE, bảo mật của các truy vấn được tham số hóa không có hiệu lực. Do đó, ứng dụng của bạn phải đảm bảo rằng dữ liệu được liên kết với (các) tham số không chứa mã Transact-SQL độc hại.

Mã hóa

Nếu người dùng muốn liên kết các tham số với các mã hóa khác nhau (ví dụ, UTF-8 hoặc nhị phân), người dùng nên chỉ định rõ ràng mã hóa trong tập lệnh PHP.

Trình điều khiển PDO_SQLSRV trước tiên kiểm tra mã hóa được chỉ định trong

unset($stmt);
9 (ví dụ:
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);
?>
0).

Nếu không tìm thấy, trình điều khiển kiểm tra xem có mã hóa nào được đặt trong

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);
?>
1 hoặc
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);
?>
2. Mặt khác, trình điều khiển sẽ sử dụng mã hóa được chỉ định trong
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);
?>
3 hoặc
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);
?>
4.

Ngoài ra, bắt đầu bằng phiên bản 5.8.0, khi sử dụng PDO :: Chuẩn bị với

unset($stmt);
5 được đặt thành TRUE, người dùng có thể sử dụng các loại chuỗi mở rộng được giới thiệu trong Php 7.2 để đảm bảo sử dụng tiền tố
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);
?>
6. Các đoạn dưới đây hiển thị các lựa chọn thay thế khác nhau.

Ghi chú

Với việc mô phỏng các chuẩn bị được đặt thành TRUE, bảo mật của các truy vấn được tham số hóa không có hiệu lực. Do đó, ứng dụng của bạn phải đảm bảo rằng dữ liệu được liên kết với (các) tham số không chứa mã Transact-SQL độc hại.

Mã hóa

PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
2

Nếu người dùng muốn liên kết các tham số với các mã hóa khác nhau (ví dụ, UTF-8 hoặc nhị phân), người dùng nên chỉ định rõ ràng mã hóa trong tập lệnh PHP.

PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
3

Trình điều khiển PDO_SQLSRV trước tiên kiểm tra mã hóa được chỉ định trong

unset($stmt);
9 (ví dụ:
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);
?>
0).

PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
4

Nếu không tìm thấy, trình điều khiển kiểm tra xem có mã hóa nào được đặt trong

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);
?>
1 hoặc
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);
?>
2. Mặt khác, trình điều khiển sẽ sử dụng mã hóa được chỉ định trong
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);
?>
3 hoặc
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);
?>
4.

PDOStatement PDO::prepare ( $statement [, array(key_pair)] )
5

Ngoài ra, bắt đầu bằng phiên bản 5.8.0, khi sử dụng PDO :: Chuẩn bị với unset($stmt); 5 được đặt thành TRUE, người dùng có thể sử dụng các loại chuỗi mở rộng được giới thiệu trong Php 7.2 để đảm bảo sử dụng tiền tố 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); ?> 6. Các đoạn dưới đây hiển thị các lựa chọn thay thế khác nhau.

Theo mặc định, việc chuẩn bị mô phỏng được đặt thành sai, trong trường hợp đó, các hằng số chuỗi PDO mở rộng sẽ bị bỏ qua.

  • Nó không hoạt động cho các tham số bị ràng buộc là
    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);
    ?>
    
    7.
    • Khi người dùng chỉ định
      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);
      ?>
      
      7 trong
      unset($stmt);
      
      9, ngoại lệ PDO bị ném.
  • Nó không hoạt động cho các tham số bị ràng buộc dưới dạng tham số đầu ra.
    • Khi người dùng tạo một câu lệnh đã chuẩn bị với các trình giữ chỗ có nghĩa là cho các tham số đầu ra (nghĩa là có một dấu hiệu bằng nhau ngay sau khi giữ chỗ, như
      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);
      ?>
      
      0), ngoại lệ PDO bị ném.
    • Khi một câu lệnh đã chuẩn bị gọi một quy trình được lưu trữ với trình giữ chỗ làm đối số cho tham số đầu ra, không có ngoại lệ nào được ném vì trình điều khiển không thể phát hiện tham số đầu ra.Tuy nhiên, biến mà người dùng cung cấp cho tham số đầu ra sẽ không thay đổi.
  • Người giữ chỗ trùng lặp cho một tham số được mã hóa nhị phân sẽ không hoạt động

Xem thêm

Lớp PDO

PDO

Nhận xét

Gửi và xem phản hồi cho