0

我正在寻找使用 SQLSRV 生成最后插入的 id。不过,我需要使用准备好的语句。 我在这里看到了一个答案(参见下面代码后面的链接),显示了如何做到这一点,但该语句不是为反 sql 注入目的而准备的。

//Prep the variables for insert
$p1 = $_POST['description'];
$p2 = intval($_POST['visible']);
$p3 = strval($_POST['whoToShow']);

//Build an array with those variables
$params = array(&$p1, &$p2, &$p3);

//Build the SQL
$sql = "INSERT INTO notifications (description, visible, whoToShow) VALUES (?, ?, ?)";

//Execute the sql using a prepared statement, passing the variables in an array
$stmt = sqlsrv_prepare($conn, $sql, $params) or die(FormatErrors(sqlsrv_errors())); 

请查看Microsoft 的 sqlsrv 驱动程序以了解在 Stack Overflow 上查询“SELECT SCOPE_IDENTITY() AS id”时未返回任何结果的 PHP 驱动程序,以获取有关使用未准备好的语句获取最后插入的 ID 的详细信息。

预先感谢您对我们的支持。

4

1 回答 1

1

考虑使用存储过程而不是直接的 INSERT 语句。使用存储过程更好,因为您可以从存储过程中返回一个记录集,其中包含插入记录的 ID。

我将 Microsoft SQL Server 与我的 PHP 一起使用。我正在使用 mssql_query 库连接到 SQL 服务器。不确定它是否有所作为,但我看到您使用不同的库进行连接。我们所做的每一个查询都是通过存储过程。它的效率更高,而且绝对更安全。

$myServer = "xxxxxxx";
$myUser = "xxxxxxxx";
$myPass = "xxxxxxx";
$myDB = "myDatabase";
//connection to the database
$dbhandle = mssql_connect($myServer, $myUser, $myPass)
or die("Couldn't connect to SQL Server on $myServer");
//select a database to work with
$selected = mssql_select_db($myDB, $dbhandle)
or die("Couldn't open database $myDB");

$query = "exec eCommerce.dbo.cart_GET_Detail    @sid = ".$_SESSION['sid']." , @cc = '".$_SESSION['cc']."'";

$result = mssql_query($query);
$numRows = mssql_num_rows($result);
$hasItems = (($numRows == 0) ? 'N' : 'Y');

while ($RSLoop = mssql_fetch_array($result)) {
    //var_dump($RSLoop);  //var_dump will show you everything in the recordset
    echo '<tr><td colspan=6 width=720 class=cartDivider>&nbsp;</td></tr>';
    echo '<form name=frmProduct'.$idx.' method=POST action=_action.asp>';
    echo '<input type=hidden name=pid value="'.$RSLoop['product_id'].'">';
}

这是对存储过程的调用,以获取存储在 SQL 表中的购物车内容。对存储过程执行插入操作是类似的。您应该能够在 SQL Server 存储过程中找到一些代码示例。

于 2012-09-14T19:15:40.633 回答