0

この問題は node-mysql に関連しています。

次のコードに問題があるようで、ユーザー定義変数の使用に関連しているようです。レンダリングされたクエリは、任意の mysql IDE 内で正常に実行され、複数のレコードが返されます。ただし、node-mysql で実行すると、単一のレコードのみが返されます。

T3.gender_rank を指定する WHERE 句を削除すると、node-mysql と私の mysql IDE の両方で予測可能な結果が得られることを確認しました。

この問題は以前に提起されたことがありますか、それとも私が間違っているのでしょうか?

var mysql = require('mysql'); // Establish SQL Support
var sql =
    "select team, `div`, sum(points) AS teampoints "+
    "from ( "+
    "   select "+
    "       *, "+
    "       (@genderRank := CASE WHEN @genderTMP <> gender THEN 1 ELSE @genderRank+1 END) AS gender_rank, "+
    "       (@genderTMP := gender) AS _gt "+
    "   from ( "+
    "       select * "+
    "       from racepoints "+
    "       WHERE "+
    "           ltrim(rtrim(race)) = '"+data.eventName+"' AND "+
    "           racedate = '"+getSimpleDate(new Date(data.eventStart))+"' "+
    "       ORDER BY team,gender,points DESC "+
    "   ) T1, "+
    "   (select @genderRank:=0 AS gender_rank_start) T2 "+
    ") T3 "+
    "WHERE "+
    "   (T3.gender_rank <= 4 AND rtrim(ltrim(`div`)) = 'D2') OR "+
    "   (T3.gender_rank <= 3 AND rtrim(ltrim(`div`)) = 'D1') "+
    "GROUP BY team, `div` "+
    "ORDER BY `div`, teampoints DESC, team";


var db = new mysql.createConnection({
    host : 'localhost',
    user : 'root',
    password : 'admin',
    database : 'nps',
    multipleResults : true
});
db.connect();
db.query(
    sql,
    function(err,rows,fields){
        if(err){
            console.log(err);
            return;
        }
        console.log(rows);
    }
);
db.end();

SQL データベース ファイルは、https ://snipt.net/download/dde8b4b5ce8cd5fca21ac2334bae634f/-5369.sql からも入手できます。

4

1 に答える 1

1

変数を sql 文字列に直接追加する代わりに、mysql パッケージに任せてください。これは通常、このような問題を解決し、さらに SQL インジェクションから保護します。

これは、変数の配列が続く疑問符 (変数ごとに 1 つ) を使用して行われます。

例えば

connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {
  // ...
});
于 2013-07-06T18:14:08.240 に答える