sourcecode

1개의 쿼리로 여러 개의 문을 노드 검출

copyscript 2022. 9. 24. 10:12
반응형

1개의 쿼리로 여러 개의 문을 노드 검출

사용하고 있다nodejs 10.26+express 3.5+node-mysql 2.1.1+MySQL-Server Version: 5.6.16.

4개의 DELETE가 있고 데이터베이스 요청은 1개뿐이기 때문에 DELETE 명령어를 ";"로 연결했지만 항상 실패합니다.

var sql_string = "DELETE FROM user_tables WHERE name = 'Testbase';";
sql_string += "DELETE FROM user_tables_structure WHERE parent_table_name = 'Testbase';";
sql_string += "DELETE FROM user_tables_rules WHERE parent_table_name = 'Testbase';";
sql_string += "DELETE FROM user_tables_columns WHERE parent_table_name = 'Testbase';";

connection.query(sql_string, function(err, rows, fields) {
   if (err) throw err;
   res.send('true');
});

다음의 에러가 발생합니다.

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELETE FROM user_tables_structure WHERE parent_table_name = 'Testbase';DELETE FR' at line 1

그러나 이 SQL을 PhpMyAdmin에 붙여넣으면 항상 성공합니다.

내가 한 번에 쓴다면 그것 역시 성공입니다.

        connection.query("DELETE FROM user_tables WHERE name = 'Testbase'", function(err, rows, fields) {
        if (err) throw err;

        connection.query("DELETE FROM user_tables_structure WHERE parent_table_name = 'Testbase'", function(err, rows, fields) {
            if (err) throw err;


            connection.query("DELETE FROM user_tables_rules WHERE parent_table_name = 'Testbase'", function(err, rows, fields) {
                if (err) throw err;

                connection.query("DELETE FROM user_tables_columns WHERE parent_table_name = 'Testbase'", function(err, rows, fields) {
                    if (err) throw err;

                    res.send('true');
                });
            });
        });
    });

도와줘서 고마워요!

node-mysql을 사용하고 있다고 생각합니다.(단, node-mysql2에서도 동작합니다.)

문서는 다음과 같이 기술되어 있습니다.

여러 문의 지원은 보안상의 이유로 디세블로 되어 있습니다(값이 올바르게 이스케이프되지 않은 경우 SQL 주입 공격을 허용합니다).

다중 스테이트먼트 쿼리

이 기능을 사용하려면 연결을 위해 이 기능을 활성화해야 합니다.

var connection = mysql.createConnection({multipleStatements: true});

활성화되면 각 문을 세미콜론으로 구분하여 여러 문을 사용하여 쿼리를 실행할 수 있습니다.;. 결과는 각 스테이트먼트의 배열이 됩니다.

connection.query('SELECT ?; SELECT ?', [1, 2], function(err, results) {
  if (err) throw err;

  // `results` is an array with one element for every statement in the query:
  console.log(results[0]); // [{1: 1}]
  console.log(results[1]); // [{2: 2}]
});

이 기능을 유효하게 했을 경우,multipleStatements첫 번째 코드가 작동해야 합니다.

아래와 같은 "multiplacements: true"를 사용하는 것이 효과적이었다.

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: '',
    multipleStatements: true
});
connection.connect();
 
var sql = "CREATE TABLE test(id INT DEFAULT 1, name VARCHAR(50));ALTER TABLE test ADD age VARCHAR(10);";
 
connection.query(sql, function(error, results, fields) {
    if (error) {
        throw error;
    }
});

DB(SQL)에서 데이터를 가져오려면 다음 함수가 올바르게 작동합니다.

router.getflash/', 함수 메시지함수(req, res){ //res.send('안녕하세요 Rasikh님, 테스트 페이지에 오신 것을 환영합니다.' //=> 단방향 dbConn.query('SELECT COUNT(이름)'를 카운트한 값, 이름, 성, 전화, 학생의 이메일, 함수(err, 행, 필드) {// (err) throw err의 경우 다른 방법

  dbConn.query('SELECT name, author from books',
  function (err, rowsBook, fields) { // another Way
      if (err) throw err
    // console.log('The counted is: ', rows[0].counted);    //=> Display in console
    // res.send('Hi Dear Rasikh, Welcome to Test Page.'+ rows[0].counted)  //=> Display in blank page
    
    res.render('main/index',{data:rows, myData:rowsBook});
  })

}); });

언급URL : https://stackoverflow.com/questions/23266854/node-mysql-multiple-statements-in-one-query

반응형