sqlsrv_prepare

(无版本信息可用,可能仅存在于 Git 中)

sqlsrv_prepare准备执行查询

描述

sqlsrv_prepare(
    资源 $conn,
    字符串 $sql,
    数组 $params = ?,
    数组 $options = ?
): 混合

准备执行查询。此函数非常适合准备将使用不同参数值多次执行的查询。

参数

conn

sqlsrv_connect() 返回的连接资源。

sql

定义要准备和执行的查询的字符串。

params

在执行参数化查询时指定参数信息的数组。数组元素可以是以下任何一种

  • 字面量值
  • PHP 变量
  • 具有以下结构的数组:array($value [, $direction [, $phpType [, $sqlType]]])
下表描述了上面数组结构中的元素

数组结构
元素 描述
$value 字面量值、PHP 变量或 PHP 按引用变量。
$direction (可选) 以下 SQLSRV 常量之一,用于指示参数方向:SQLSRV_PARAM_IN、SQLSRV_PARAM_OUT、SQLSRV_PARAM_INOUT。默认值为 SQLSRV_PARAM_IN。
$phpType (可选) 一个 SQLSRV_PHPTYPE_* 常量,它指定返回值的 PHP 数据类型。
$sqlType (可选) 一个 SQLSRV_SQLTYPE_* 常量,它指定输入值的 SQL Server 数据类型。
options

指定查询属性选项的数组。支持的键在下表中描述

查询选项
描述
QueryTimeout 一个正整数。 设置查询超时(以秒为单位)。默认情况下,驱动程序将无限期地等待结果。
SendStreamParamsAtExec (默认值为 将驱动程序配置为在执行时发送所有流数据(),或以块形式发送流数据()。默认情况下,该值设置为 。有关更多信息,请参见 sqlsrv_send_stream_data()
Scrollable SQLSRV_CURSOR_FORWARD、SQLSRV_CURSOR_STATIC、SQLSRV_CURSOR_DYNAMIC 或 SQLSRV_CURSOR_KEYSET 请参见 Microsoft SQLSRV 文档中的 » 指定游标类型并选择行

返回值

成功时返回语句资源,如果发生错误则返回

示例

示例 #1 sqlsrv_prepare() 示例

此示例演示如何使用 sqlsrv_prepare() 准备语句,并使用 sqlsrv_execute() 多次重新执行它(使用不同的参数值)。

<?php
$serverName
= "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if(
$conn === false) {
die(
print_r( sqlsrv_errors(), true));
}

$sql = "UPDATE Table_1
SET OrderQty = ?
WHERE SalesOrderID = ?"
;

// 初始化参数并准备语句。
// 变量 $qty 和 $id 绑定到语句 $stmt。
$qty = 0; $id = 0;
$stmt = sqlsrv_prepare( $conn, $sql, array( &$qty, &$id));
if( !
$stmt ) {
die(
print_r( sqlsrv_errors(), true));
}

// 设置 SalesOrderDetailID 和 OrderQty 信息。
// 此数组以键=>值对的形式映射订单 ID 到订单数量。
$orders = array( 1=>10, 2=>20, 3=>30);

// 为每个订单执行语句。
foreach( $orders as $id => $qty) {
// 因为 $id 和 $qty 绑定到 $stmt1,所以它们的更新
// 值在每次执行语句时都会使用。
if( sqlsrv_execute( $stmt ) === false ) {
die(
print_r( sqlsrv_errors(), true));
}
}
?>

备注

当您准备使用变量作为参数的语句时,这些变量会绑定到该语句。这意味着,如果您更新变量的值,下次执行语句时,它将使用更新后的参数值运行。对于仅计划执行一次的语句,请使用 sqlsrv_query()

参见

添加备注

用户贡献的备注 2 个备注

4
tuxedobob
9 年前
在将变量绑定到使用 sqlsrv_prepare 准备的语句时,请小心处理您的变量。

请考虑以下情况

<?php
$dude
= '';
$time = new DateTime();
$sql = "INSERT INTO my_table (person, timein) VALUES (?, ?)";
$stmt = sqlsrv_prepare($conn, $sql, array(&$dude, &$time));

...
// 许多行之后

foreach ($times as &$time) {
// 做一些事情
}

// 稍后...
$time = $times['start'];
if(
sqlsrv_execute( $stmt ) === false ) {
die(
print_r( sqlsrv_errors(), true));
}
?>

我做了类似的事情。我在开始时准备了一个语句,在中间再次使用了这个变量,然后在运行查询之前设置了我想使用的值。

问题是,我将这个变量用作迭代器而不是简单的标量。这导致 PHP 使用了内存中的不同位置,而它之前绑定的位置无效。因此 SQL 只是插入了一个默认日期/时间。

更糟糕的是,由于 SQL 只是插入了一个默认值,它没有抛出任何错误,并且在尝试调试时,我做了类似的事情

<?php
var_dump
($time);
sqlsrv_execute($stmt);
$q = "SELECT * FROM my_table WHERE id=@@IDENTITY";
$r = sqlsrv_query($conn, $q);
$row = sqlsrv_fetch_array($r); $id = $row[0];
var_dump($row['time']);
?>

看起来你正在向 SQL 发送正确的数据,然后看到它返回了一些完全不同的东西,这绝对让人抓狂。

因此,如果 SQL 似乎使用准备好的语句插入了垃圾数据,请确保你没有在任何其他地方使用这些变量。
-2
matt at bigbadweb dot co dot uk
10 年前
如何正式指定参数和获取输出的示例。
<?php

// 设置连接
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if(
$conn === false) {
die(
print_r( sqlsrv_errors(), true));
}

// 指定参数 - 必须是可以按引用传递的变量!
$myparams['Item_ID'] = intval(-2);
$myparams['Item_Name'] = "Foo";

// 设置过程参数数组 - 确保按引用传递参数
$procedure_params = array(
array(&
$myparams['Item_ID'], SQLSRV_PARAM_OUT),
array(&
$myparams['Item_Name'], SQLSRV_PARAM_OUT)
);

// 执行过程,{call stp_Create_Item (@Item_ID = ?, @Item_Name = ?)} 在我的实验中似乎会遇到各种错误
$sql = "EXEC stp_Create_Item @Item_ID = ?, @Item_Name = ?";

$stmt = sqlsrv_prepare($conn, $sql, $procedure_params);

if( !
$stmt ) {
die(
print_r( sqlsrv_errors(), true));
}

if(
sqlsrv_execute($stmt)){
while(
$res = sqlsrv_next_result($stmt)){
// 确保遍历所有结果集,因为输出参数可能要到此才会设置
}
// 输出参数现在已设置,
print_r($params);
print_r($myparams);
}else{
die(
print_r( sqlsrv_errors(), true));
}
?>
To Top