web-dev-qa-db-fra.com

tableau javascript sous forme de liste de chaînes (en préservant les guillemets)

J'ai un tableau de chaînes. Lorsque j'utilise .toString () pour le sortir, 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.

24
Anthony Webb

Les guillemets ne sont pas conservés car ils ne font pas réellement partie de la valeur de chaîne. Ils sont simplement 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 le faire 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 contenant tous les éléments du tableau concaténés en une seule chaîne avec un séparateur (facultatif) entre chaque élément. Ainsi, si vous spécifiez un séparateur qui inclut les guillemets et les virgules, vous devez simplement ajouter manuellement un devis de début et de fin pour le premier et le dernier élément.

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

EDIT: pour permettre 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 serait peut-être plus approprié d'avoir une if (arr.length===0) pour effectuer une autre action plutôt que d'exécuter l'instruction SELECT.)

62
nnnnnn

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

Utilisez Array.map pour entourer chaque élément de guillemets:

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

Le code devient plus simple avec les fonctionnalités ES6 - fonctions de flèche 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(',')
1
Lukasz Wiktor
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')"

0