NodeJS mysql如果为null或为空

时间:2015-08-23 18:36:22

标签: mysql node.js

我有代码,如果表不在mysql或" NULL"或空。

mysqlConnection.query('SELECT `something` FROM `here` WHERE `dog` = \'' +info+ '\'', function(err, row, fields) {
  if(err) {
    console.log('Error1');
    return;
  }
  else if (!row.length) {                                                   
    console.log('Error2');
    return;
  }
  else if (row[0].something == 'NULL' || row[0].something == '') {
    console.log('Error3');
    return;
  }
  console.log('Works');
});

所以事情是,如果"某事"不是在mysql中,控制台显示Error2,但是如果"某些东西"是在mysql中,但如果它是NULL,控制台显示Works,那么问题是什么?我检查是否有东西,但它不会显示Error3。如果table为空,则显示Error3。谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

我会尝试这样的事情:

:after

它正在使用" falsy"检查row [0] .something,如果值未定义,则返回false,null或空字符串。它还修复了t.niese提到的注入攻击向量。

答案 1 :(得分:0)

如果您认为在运行类似Array<any>的SQL时收到select name from employee的情况下,您应该有三个问题:

  1. 如果您的陈述确实遗漏了某些内容
  2. 如果您要寻找的房产存在
  3. 如果属性的内容为null并且您期望为null
  4. 由于这些问题会发生数百次,我使用以下方法(在TypeScript中):

    let ret: Array<any> = connection.query('select name from employee',...);
    
    for (let r of ret) {
       name = getValueColumn(r,'name','This will be thrown if content is null');
    };
    
    export function getValueColumn(obj: any, fieldName: string, messageIfNull: string = null): any {
        fieldName = fieldName.toLocaleLowerCase();
        if (!obj) {
            throw new CustomError(errorCodes.connection.rowNull, 'Linha nula e sem campos');
        } else if (!obj.hasOwnProperty(fieldName)) {
            throw new CustomError(errorCodes.connection.fieldDoesNotExist, 'Campo não existe -> ' + fieldName);
        } else {
            if (!obj[fieldName]) {
                if (messageIfNull) {
                    throw new CustomError(errorCodes.connection.fieldWithNullValue, messageIfNull + '\n' + fieldName +
                    ' com valores nulos ou campo invalido\n' + obj);
                };
                return null;
            }; 
            return obj[fieldName];
        };
    };
    

    如果您仅使用if (!ret) {...}检查结果,则它将始终为false,因为空数组不为空。所以你必须检查if(!ret[0]) {..} 因此,处理所有三个问题,并且每次要解析查询时都不必担心。

答案 2 :(得分:0)

我知道我迟到了 5 年零 9 个月,但对于那些为此苦苦挣扎的人, 这是一个解决方案。表为空时的值不是 NULL。我遇到了类似的问题,我想在表为空时将 AUTO_INCREMENT 重置为 1。要检测它何时为空,我们必须查看它是否有任何索引为 0 的元素。如果它有一个元素,它将返回类似:RowDataPacket { // data } 的内容。如果没有,它将返回 undefined。看看我要做什么?只需添加一个条件来查看 result[0] 是否未定义。想要一些代码来更好地理解它吗?当然!这是:

  db.query("SELECT * FROM tablename", (err, result) => {
    if (err) throw err;
    else {
      // If the first element does not exist
      if (result[0] == undefined) {
        db.query("yourquery", (err) => {
          if (err) throw err;
        });
      } else {
        res.send(result);
      }
    }
  });