我希望使用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的详细信息。
提前感谢您的支持。
答案 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> </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存储过程中找到一些代码示例。