
Envoyé par
karpe
Concernant ma vulnérabilité SQl ... Du coup ...comment devrais-je l'écrire ??
D’abord, une précaution simple : je suppose que produit_id est de type int, tu peux donc déjà diminuer le risque en convertissant explicitement la valeur avec intval.
$productId = intval($_POST['productId']);
Ensuite, le réflexe à adopter : utilise une requête préparée quand c’est possible.
SELECT ... WHERE produit_id = ?
Je crois deviner que tu utilises l’API mysqli, ce sera donc mysqli::prepare. Je te donne un exemple complet plus bas.

Envoyé par
karpe
Je génère cette foi-ci en effet une ligne correspondant à une des sous-catégories...mais seulement une ...
Oui, et c’est normal : ton script PHP fait exactement ce que tu lui dis de faire.
$row['souscategoriesN1'] = $result->fetch_array();
Cette instruction peut se décomposer en trois parties :
- $row[ ... ] = ... : comme la variable $row n’existe pas jusqu’alors, elle est créée. PHP détecte que tu veux l’utiliser en tant que tableau, il crée donc un tableau.
- ...['souscategoriesN1'] = ... : dans le tableau qui vient d’être créé, PHP ajoute un item donc la clé est 'souscategoriesN1'.
- ... = $result->fetch_array(); l’item de tableau reçoit la totalité de ce qui est renvoyé par fetch_array.
Si tu regardes, avec l’onglet réseau des outils F12, le contenu envoyé par ton serveur, tu verras quelque chose comme ceci :
1 2 3 4 5 6 7 8 9
| {
"souscategoriesN1": {
"produit_id": ... ,
"categories_id": ... ,
"souscategoriesN1_id": ... ,
"souscategories_nom": ...,
"souscategories_id": ...
}
} |
Encore une fois, ce n’est pas la structure attendue par ton JavaScript. Mais en réalité, il faudra aussi modifier le JavaScript.
Il faut bien comprendre que MySQL est fait pour renvoyer des lignes de tables. La structure des données est imposée au départ. Je te conseille d’utiliser un outil de gestion comme PHPMyAdmin ou Adminer pour mettre au point tes requêtes SQL et te familiariser avec la forme des résultats, avant d’intégrer ça dans tes scripts PHP.

Envoyé par
karpe
Je suis pas très calé en développement et n'est pas toujours le langage adapté. (Je viens de commander un bouquin JAVASCRIPT

)
Pas de problème, on a tous été débutants un jour 
La force d’un développeur ne repose pas seulement sur la connaissance des langages. Maîtriser les outils est tout aussi important. En l’occurence, je pense que tu as besoin de mieux connaître tes outils, et j’insiste : use et abuse du panneau F12. Regarde ce qu’il te propose, fais des tests, explore.
Idem pour ta base de données : choisis un outil de gestion SQL et apprends à en extraire le maximum.

Envoyé par
karpe
La finalité que je souhaite est tout simplement de lister toutes les sous-catégories de ma catégorie dans un SELECT.
La liste des sous-catégories se modifie en fonction de la donnée selectionner dans la première liste de catégorie. Celà fonctionne très bien d'ailleurs.
Le problème est donc de charger la liste des sous-catégories automatiquement lorsque l'on arrive sur la page de modification.
Si j’ai bien compris, tu as plusieurs entrées dans ta table souscategories pour une seule entrée correspondante dans produits. Ainsi, le résultat de ton INNER JOIN aura plusieurs lignes.
Actuellement, ton script PHP n’extrait que la première ligne du résultat. La solution est d’écrire une boucle pour extraire toutes les lignes.
En réalité ton script client n’a besoin que de deux informations pour chaque sous-catégorie : son nom et son id. On peut donc simplifier la requête :
1 2 3 4 5 6
| SELECT
souscategories.souscategories_nom,
souscategories.souscategories_id
FROM produits INNER JOIN souscategories
ON produits.categories_id = souscategories.categories_id
WHERE produits.produit_id = ? |
Après ça il faut écrire le code pour préparer la requête et extraire les données.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <?php
require_once 'core.php';
$productId = intval($_POST['productId']);
$sql = 'SELECT
souscategories.souscategories_nom,
souscategories.souscategories_id
FROM produits INNER JOIN souscategories
ON produits.categories_id = souscategories.categories_id
WHERE produits.produit_id = ?';
$stmt = $connect->prepare($sql);
$stmt->bind_param('i', $productId); // 'i' pour type int
$stmt->execute();
// déclare les variables qui recevront les valeurs à chaque tour de boucle
$stmt->bind_result($souscategories_nom, $souscategories_id);
// crée le tableau qui sera renvoyé
$tableau = [];
// quand fetch renvoie null, ça veut dire quil ny a plus de données
while ($stmt->fetch() !== null) {
$tableau[] = [
'souscategories_nom' => $souscategories_nom,
'souscategories_id' => $souscategories_id
];
} // if num_rows
$connect->close();
echo json_encode($tableau); |
Voir les docs :
Si j’avais eu le choix j’aurais opté pour PDO ; je n’aime pas trop mysqli, je trouve qu’il fait trop de « magie ». La liaison de variables avec bind_result, ce n’est pas ce qu’il y a de plus intuitif à mon avis. Mais je respecte ton choix de départ, je ne vais pas t’obliger à changer d’API.
(Note pour ceux qui connaissent : je n’utilise pas get_result car je connais au moins un environnement où cette fonction n’existe pas, parce que le pilote natif mysqlind n’est pas installé. Il s’agit d’un hébergement mutualisé chez OVH.)

Envoyé par
karpe
Saurais-tu m'aider à écrire cette boucle ?
En fait il faut retravailler la fonction entière, mais ne t’intquiète pas, je vais t’aider.
Pour commencer, je vais remplacer la construction de chaînes HTML par des méthodes jQuery.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var $testSSCATN1 = $("#edittestSSCATN1");
//lignes_AffSSCatN1 = '<select>';
var $select = $('<select>');
// lignes_AffSSCatN1 += '<option value="-1">~~Aucune~~</option>';
$('<option>')
.val('-1')
.text('~~Aucune~~')
.appendTo($select);
// ...
// lignes_AffSSCatN1 += '</select>';
// $testSSCATN1.html(lignes_AffSSCatN1);
$testSSCATN1.append($select); |
Ça rend le code plus lisible et les erreurs plus faciles à déceler. En effet, une erreur dans du code HTML n’est pas fatale, et la représentation DOM produite risque de ne pas correspondre à ce que tu attends. C’est une situation difficile à détecter, qui peut faire perdre beaucoup de temps.
Pour écrire la boucle, il faut examiner le résultat renvoyé par ton serveur. À présent, les données se présentent sous cette forme :
1 2 3 4 5 6 7 8 9 10 11
| [
{
"souscategories_id": ... ,
"souscategories_nom": ... ,
},
{
"souscategories_id": ... ,
"souscategories_nom": ... ,
},
// etc.
] |
On a un tableau qui contient des objets ayant chacun deux clés. Cette fois on s’est assurés d’avoir un vrai tableau JSON, il a donc une propriété length qu’on va pouvoir utiliser pour faire une boucle.
1 2 3 4 5 6
| for (let i = 0; i < response.length; i++) {
$('<option>')
.val(response[i].souscategories_id)
.text(response[i].souscategories_nom)
.appendTo($select);
} |
Avec ça tu as tout ce qu’il faut. Je te laisse remettre les bouts de code ensemble
Partager