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

プリペアドステートメントを使用して最後に挿入されたIDを取得する方法の詳細については、 StackOverflowで「SELECTSCOPE_IDENTITY()AS id」をクエリしたときに、PHP用のMicrosoftのsqlsrvドライバーが結果を返さないことを確認してください。

よろしくお願いします。

4

1 に答える 1

1

直接INSERTステートメントの代わりにストアドプロシージャを使用することを検討してください。挿入されたレコードのIDを含むレコードセットをストアドプロシージャから返すことができるため、ストアドプロシージャを使用する方が適切です。

PHPでMicrosoftSQLServerを使用しています。私は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テーブルに保存されているショッピングカートの内容を取得するためのストアドプロシージャの呼び出しでした。ストアドプロシージャで挿入を行うのも同様です。SQLServerのストアドプロシージャでいくつかのコードサンプルを見つけることができるはずです。

于 2012-09-14T19:15:40.633 に答える