Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 缩短循环的动态SQL查询_Javascript_Sql - Fatal编程技术网

Javascript 缩短循环的动态SQL查询

Javascript 缩短循环的动态SQL查询,javascript,sql,Javascript,Sql,我有一个函数,它构建一个sql查询,然后将其插入到客户端轻型sql中 我想我已经习惯了很多for循环,我该如何缩短它呢 function insert(dataBase,table,row){ var j = 0; var sqlQueryArray = []; sqlQueryArray[j++] = 'INSERT INTO '; sqlQueryArray[j++] = table sqlQueryArray[j++] = ' (' f

我有一个函数,它构建一个sql查询,然后将其插入到客户端轻型sql中

我想我已经习惯了很多for循环,我该如何缩短它呢

function insert(dataBase,table,row){
    var j = 0;

    var sqlQueryArray = [];

    sqlQueryArray[j++] = 'INSERT INTO ';
    sqlQueryArray[j++] = table
    sqlQueryArray[j++] = ' ('

    for (var i = row.length - 2; i >= 0; i--){
        sqlQueryArray[j++] = row[i].id + ',';
    };

    sqlQueryArray[j++] = row[(row.length - 1)].id + '';
    sqlQueryArray[j++] = ')'
    var sqlQueryString = ' VALUES ';

    for (var i = row.length - 2; i >= 0; i--){
        sqlQueryArray[j++] = '?, ';
    };

    sqlQueryArray[j++] = '?';
    sqlQueryArray[j++] = ');'

    for (var i = 0; i < sqlQueryArray.length; i++){
        sqlQueryString += sqlQueryArray[i];
    }
    var rowArray = []
    for (var i = row.length - 1; i >= 0; i--){
        rowArray[i] = row[i].val;
    };

    dataBase.openDatabase.transaction(
        function (transaction) {
            transaction.executeSql(sqlQueryString,
                rowArray,
                dataBase.nullSQLHandler, dataBase.QueryError);
        }
    );
}
函数插入(数据库、表、行){
var j=0;
var sqlQueryArray=[];
sqlQueryArray[j++]='插入';
sqlQueryArray[j++]=表
sqlQueryArray[j++]='('
对于(var i=row.length-2;i>=0;i--){
sqlQueryArray[j++]=行[i].id+',';
};
sqlQueryArray[j++]=row[(row.length-1)].id++;
sqlQueryArray[j++]=')'
var sqlQueryString='VALUES';
对于(var i=row.length-2;i>=0;i--){
sqlQueryArray[j++]='?,';
};
sqlQueryArray[j++]='?';
sqlQueryArray[j++]=');'
对于(var i=0;i=0;i--){
行数组[i]=行[i].val;
};
dataBase.openDatabase.transaction(
职能(事务){
executeSql(sqlQueryString,
行数组,
dataBase.nullSQLHandler,dataBase.QueryError);
}
);
}

当在应用程序中创建动态SQL时,会释放一些东西,吃掉孩子


出于许多安全性和性能原因(更不用说可读性/可维护性),您确实应该为此使用参数化SP。

首先,我认为您最好不要手动跟踪索引(
j++
)。使用sqlQueryArray.push()在
sqlQueryArray
的末尾插入元素


然后,为了简化代码,您可以创建一个函数,该函数返回一个自定义SQL,将
行作为参数传递给您,使用该函数,您可以生成带有所有
标记的
INSERT INTO
子句。

假设您使用的是相对较新的浏览器,您可以执行以下操作:

var insertStatement =
   'INSERT INTO ' + table +
   ' (' + rows.map(function (row) { return row.id; }).join(', ') + ')' +
   ' VALUES (' + rows.map(function () { return '?'; }).join(', ') + ')';
您是否应该这样做留给读者作为练习:)


编辑:我刚刚在对另一个答案的评论中注意到,您正在将此消息发送到服务器执行。您绝对不应该这样做,因为用户可以轻松提交自己的SQL并对您的数据库造成各种破坏。您不应该信任通过网络接收的任何数据。

您的权利我可能会将查询大楼更多地发送到服务器。这将使sql更加异步。哦。。。您正在将查询发送到服务器以执行?现在我正在客户端执行,但服务器是node.js服务器。因此,我可能只发送(表、行)并获取一个带有值数组的字符串。进入客户端sql的大多数信息都是通过ssl套接字从服务器发送的。我试图使它非常自动化,加上客户端将是一个移动电话。我认为将大部分繁重的工作发送到服务器可能会占用客户机的负载。