【问题标题】:Using BETWEEN Clause in NodeJS在 NodeJS 中使用 BETWEEN 子句
【发布时间】:2017-12-29 06:25:19
【问题描述】:

我想使用 BETWEEN 子句从 MySql 数据库中获取数据。

在客户端,我使用 JQuery 创建了 2 个内联日历,并使用 socket.io 发出选定的 date 值;

$('#fromDate').datepicker({
    inline: true,
    altField: '#d',
    dateFormat: "dd-mm-yy",
    altFormat: "yy-mm-dd",
    monthNames: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
    dayNamesMin: ["Pa", "Pt", "Sl", "Ça", "Pe", "Cu", "Ct"],
    firstDay: 1,
    numberOfMonths: 1,
    onSelect: function(dateText, inst) {
      var dateAsString = dateText; //the first parameter of this function
      var dateAsObject = $(this).datepicker('getDate'); //the getDate method
      console.log(dateAsString);
      socket.emit('socketfromDate', $('#d').val());
    }
  });

  $('#toDate').datepicker({
    inline: true,
    altField: '#x',
    dateFormat: "dd-mm-yy", 
    altFormat: "yy-mm-dd", 
    monthNames: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
    dayNamesMin: ["Pa", "Pt", "Sl", "Ça", "Pe", "Cu", "Ct"],
    firstDay: 1,
    numberOfMonths: 1,
    onSelect: function(dateText, inst) {
      var dateAsString = dateText; //the first parameter of this function
      var dateAsObject = $(this).datepicker('getDate'); //the getDate method
      console.log(dateAsString);
      socket.emit('sockettoDate', $('#x').val());
    }
  });

在服务器端,如果我在 'fromDate' 值之后收到 'toDate' 值,MySql 查询必须在这几天之间获取数据。

 var  fromDate_query,
      toDate_query;

io.on('connection', function(socket) {

      socket.on('socketfromDate', function(fromDate) {
        console.log();
        console.log("----------------------------------");
        console.log("Selected dateTime 'from': " + fromDate); //output: Selected dateTime 'from': 2017-07-01 
        console.log("----------------------------------");
        console.log();
        fromDate_query = fromDate;
      });

      socket.on('sockettoDate', function(toDate) {
        console.log();
        console.log("----------------------------------");
        console.log("Selected dateTime 'to': " + toDate); //output: Selected dateTime 'to': 2017-07-13
        console.log("----------------------------------");
        console.log();
        toDate_query = toDate;

        connection.query("SELECT * FROM report WHERE date BETWEEN ? AND  ?", [fromDate_query, toDate_query], function(err, rows) {
          if (err) console.log(err);
          else {
            for (var i = 0; i < rows.length; i++) {
              var row = rows[i];
              console.log("**********************************");
              console.log("Possible machine: " + row.machine); //output: nothing
              console.log("**********************************");
            }
          }
        });
      });
    });

问题是,什么都没有发生。

两天之间查询的最佳方法是什么?

【问题讨论】:

    标签: javascript jquery mysql node.js socket.io


    【解决方案1】:

    您的代码存在三个问题:

    1. 使用两个事件分别发送 to 和 from 日期,而您需要两个数据来处理 SQL 查询。

    2. 既然可以使用套接字,为什么还要使用 / 最好将 http 请求用于事务性内容。

    3. 查询应在事件内部完成,因为当您从客户端发出数据时,数据将出现在该事件中。

    回答你的问题。您将不得不重构您的代码以将两个单独的事件删除为一个事件,该事件将接收您的日期和日期,如下所示:

       socket.on('dates', function(dateData) {
    
            var toDate_query = dateData.toDate;
            var fromDate_query = dateData.fromDate;
            connection.query("SELECT * FROM report WHERE date BETWEEN ? AND  ?", [fromDate_query, toDate_query], function(err, rows) {
              if (err) console.log(err);
              else {
                for (var i = 0; i < rows.length; i++) {
                  var row = rows[i];
                  console.log("**********************************");
                  console.log("Possible machine: " + row.machine); //output: nothing
                  console.log("**********************************");
                }
              }
            });
    

    除此之外,您必须重构前端以仅在两个日期都被选中时才发出事件。

    编辑: BONUS POINT -> 收到查询数据后请释放SQL连接

    【讨论】:

    • 我无法重构我的客户端,但是当我尝试时,我发现了问题所在;我选择的日期没有记录,这就是为什么它什么也没显示。 :) 而且我不想刷新页面,这就是我使用 socket.io 的原因。感谢您的宝贵时间。
    • @erayaras 即使它确实有任何记录,您的代码也不会按预期工作。请仔细查看我上面列出的要点,并可能阅读 socket.io 事件侦听器和事件侦听器内的对象范围。
    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多