ステートメント要素の生成
一般的な方法でMSSQLプリペアドステートメントを作成しようとしています。
基本的に、フィールドをループして、準備されたSQL文字列と参照パラメーターに追加します(下にスクロールしてコードを表示します)。
これにより、(名前が削除されます):
準備されたクエリ::
INSERT INTOテーブル([field]、[field]、[field]、[field]、[field]、[field]、[field]、[field]、[field]、[field]、[field]、[field ]、[field]、[field]、[field]、VALUES(?、?、?、?、?、?、?、?、?、?、?、?、?、?、?)
および sPrepStatement:
return array(&$aLine[0],&$aLine[1],&$aLine[2],&$aLine[3],&$aLine[4],&$aLine[5],&$aLine[6],&$aLine[7],&$aLine[8],&$aLine[9],&$aLine[10],&$aLine[11],&$aLine[12],&$aLine[13],&$aLine[14]);
ステートメントの準備
これをsqlsrv_prepareステートメントで機能させるために、次の4つのアプローチを試しました。
$oSQLStmnt = sqlsrv_prepare($dbhandle, $sPreppedSQL, eval($sPrepStatement));
$fReturnPrepVals = function(){ return eval($sPrepStatement); } ;
$oSQLStmnt = sqlsrv_prepare($dbhandle, $sPreppedSQL, $fReturnPrepVals);
$oSQLStmnt = sqlsrv_prepare($dbhandle, $sPreppedSQL,$aPrepValues);
$oSQLStmnt = call_user_func_array('sqlsrv_prepare',array($dbhandle,$sPreppedSQL, eval($sPrepStatement)));
これは機能しないか、データベースに空白を挿入します。
これは、SQLを実行するループです。
foreach ($aLines as $iLineNum => $sLine) {
$aLine = explode('|', $sLine);
print_r($aPrepValues);
print_r(eval($sPrepStatement));
sqlsrv_execute($oSQLStmnt);
}
うまく機能します。eval($sPrepStatement)
これは理にかなっています。しかし、prepareステートメントで機能するには「解析が早すぎます」と思います。実際には、クエリの実行時にのみ解析する必要がありますが、それを実現する方法がわかりません。
SQLステートメントを生成するためのコード:
<?php
//Setup the basic query
$sSql = "INSERT INTO " . $sQName . "\n";
$sFieldNames = "(";
$sValues = "VALUES(";
//This will be evalled to prepare the query, so inserting will be easy.
$sPrepStatement = "return array(";
//FieldIndex to keep track of the current column number
$iFI = 0;
$aLine = array();
foreach ($aSQLQueries[$sQName]['fields'] as $sFieldName => $sQ) {
$sFieldNames .= "[" . $sFieldName . "],";
$sValues .= "?,";
//Init the $aLine var to prevent errors
$aLine[$iFI] = '';
//This will be evalled, so no "" as that would parse it directly
//The values wil be passed by reference
$sPrepStatement .= '&$aLine[' . $iFI . '],';
//Different approach
$aPrepValues[] = &$aLine[$iFI];
$iFI++;
}
$sFieldNames = substr($sFieldNames, 0, -1) . ")";
$sValues = substr($sValues, 0, -1) . ")";
$sPrepStatement = substr($sPrepStatement, 0, -1) . ");";
$sPreppedSQL = $sSql . $sFieldNames . " " . $sValues;