Instructions préparées dynamics avec sqlsrv (MSSQL) en PHP

Générer les éléments d'instruction

J'essaye de créer une instruction préparée par MSSQL d'une manière générique.

Fondamentalement, je boucle les champs, et les ajoute à la string SQL préparée et au paramètre de reference (faites défiler vers le bas pour voir le code).

Cela entraîne (noms supprimés):

Requête préparée:

INSERT INTO table ([champ], [champ], [champ], [champ], [champ], [champ], [champ], [champ], [champ], [champ], [champ ], [champ], [champ], [champ], VALEURS (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

et 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]); 

Préparer la déclaration

J'ai essayé les 4 approches suivantes pour que cela fonctionne avec l'instruction sqlsrv_prepare:

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

Cela ne fonctionne pas ou insère des espaces dans la database.

C'est la boucle qui exécute le SQL:

 foreach ($aLines as $iLineNum => $sLine) { $aLine = explode('|', $sLine); print_r($aPrepValues); print_r(eval($sPrepStatement)); sqlsrv_execute($oSQLStmnt); } 

L' eval($sPrepStatement) fonctionne très bien, ce qui est logique. Mais je suppose qu'il est «analysé trop tôt» pour travailler dans la déclaration de préparation. Il ne devrait en fait être analysé que lorsque la requête est exécutée, mais je ne sais pas comment y parvenir.


Code pour la génération d'instructions 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; 

J'ai fini par le faire fonctionner avec PDO, seulement pour find qu'il ne pouvait pas gérer des millions d'imports à la fois, donc j'ai finalement utilisé l'import CSV