簡體   English   中英

在PHP中使用sqlsrv(MSSQL)動態准備語句

[英]Dynamic prepared statements with sqlsrv (MSSQL) in PHP

生成語句元素

我試圖以一種通用的方式創建一個MSSQL准備好的語句。

基本上,我遍歷這些字段,然后將它們添加到准備的SQL字符串和引用參數中(向下滾動以查看代碼)。

結果(刪除名稱):

准備查詢:

插入表([字段],[字段],[字段],[字段],[字段],[字段],[字段],[字段],[字段],[字段],[字段],[字段],[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]); 

准備陳述

我嘗試了以下4種方法來使其與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)));

這要么不起作用,要么將空白插入數據庫。

這是執行SQL的循環:

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

eval($sPrepStatement)正常工作,這很有意義。 但是我認為在parse語句中工作“太早了”。 實際上,它僅應在執行查詢時進行解析,但是我不知該如何實現。


生成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;

我最終使它與PDO一起使用,卻發現它一次不能處理數百萬個導入,因此最終我使用了CSV導入

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM