PHP,MSSQL,SQLSRV(编写)驱动程序;如何获取刚刚插入的行的ID?

时间:2012-09-14 19:10:35

标签: php sql-server prepared-statement

我希望使用SQLSRV生成最后插入的id。我需要使用一个准备好的语句。我在这里看到了一个答案(请参阅下面的代码后面的链接),说明如何执行此操作,但该语句没有为反sql注入目的做好准备。 / p>

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

请查看Stack Overflow上的Microsoft´s sqlsrv driver for PHP not returning any result when querying "SELECT SCOPE_IDENTITY() AS id",了解使用未准备好的声明获取最后插入的ID的详细信息。

提前感谢您的支持。

1 个答案:

答案 0 :(得分:1)

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

我在PHP上使用Microsoft SQL Server。我使用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存储过程中找到一些代码示例。