J'ai un tableau de chaînes. Lorsque j'utilise .toString () pour le produire, les guillemets ne sont pas conservés. Cela rend difficile la construction de la requête mysql en utilisant un "in". Considérer ce qui suit:

SELECT * FROM Table WHERE column IN ('item1','item2','item3','item4')

toString is returning: IN (item1,item2,item3,item4)

Il doit y avoir une solution simple que je néglige ici.

33
Anthony Webb 13 déc. 2011 à 05:13

5 réponses

Meilleure réponse

Les guillemets ne sont pas conservés car ils ne font pas réellement partie de la valeur de chaîne, ils sont juste nécessaires pour indiquer les littéraux de chaîne dans votre code.

Donc, n'utilisez pas toString(). Au lieu de cela, une façon de procéder est la suivante:

var arr = ['item1','item2','item3','item4'];

var quotedAndCommaSeparated = "'" + arr.join("','") + "'";

// quotedAndCommaSeparated === "'item1','item2','item3','item4'"

La méthode Array.join () renvoie une chaîne qui est tout des éléments du tableau concaténés en une seule chaîne avec un séparateur (facultatif) entre chaque élément. Donc, si vous spécifiez un séparateur qui comprend les guillemets et les virgules, vous n'avez qu'à ajouter manuellement un devis de début et de fin pour le premier et le dernier élément (respectivement).

(Et s'il vous plaît dites-moi que vous n'utilisez pas JavaScript côté client pour former votre SQL.)

EDIT: pour autoriser un tableau vide, incluez une valeur par défaut pour la chaîne résultante, sinon (comme indiqué par missingno) la chaîne serait "''":

var newString = arr.length === 0 ? "" : "'" + arr.join("','") + "'";
// default for empty array here ---^^

(Il pourrait être plus approprié d'avoir un if (arr.length===0) pour effectuer une autre action plutôt que d'exécuter l'instruction SELECT.)

67
nnnnnn 13 déc. 2011 à 13:32

Utilisez Array.map pour encapsuler chaque élément avec des guillemets:

items.map(function(item) { return "'" + item + "'" }).join(',');

Le code devient plus simple avec les fonctionnalités ES6 - fonctions fléchées et chaînes de modèle (implémentées dans node.js 4.0 et versions supérieures):

items.map(i => `'${i}'`).join(',');

Vous pouvez également utiliser la liste blanche pour empêcher les injections SQL:

const validItems = new Set(['item1', 'item2', 'item3', 'item4']);

items
   .filter(i => validItems.has(i))
   .map(i => `'${i}'`)
   .join(',')
4
Lukasz Wiktor 7 janv. 2016 à 12:18

La solution simple consiste à ajouter les citations vous-même

for(var i=0; i<items.length; i++){
    items[i] = "'" + items[i] + "'";
}

var list_with_quotes = items.join(",");

Notez que j'ignore complètement les problèmes d'injection SQL ici.

5
hugomg 13 déc. 2011 à 01:16
let keys = ['key1','key2']
let keyWithQoutes = keys.map((it) => {return `'${it}'`})
let sql = `SELECT .... FROM ... WHERE id IN (${keyWithQoutes})`
console.log(sql)

Sortie: "SELECT .... FROM ... WHERE id IN ('key1', 'key2')"

1
Chakphanu Komasathit 8 oct. 2018 à 10:14

Stockez les devis:

var names = ["'item1'","'item1'","'item3'"];
alert('IN (' + names[1] + ')'); // IN ('item1')
-2
RobG 13 déc. 2011 à 01:42