La syntaxe SQL: passage de variable de requête SQL
C'est mon premier programme et j'ai fait de longues recherches pour tenter de répondre à cette question, et je ne peux pas résoudre le problème:
<?php
include "connect.php";
if (!$connection)
{
die('Could not connect: ' . mysql_error());
}
$submit = $_POST["submit"];
if ($submit=="Submit") {
$date = $_POST["date"];
$name = $_POST["name"];
$activity = $_POST["activity"];
$activity_level = $_POST["activity_level"];
$find_role = ("SELECT sales_role
FROM role
LEFT JOIN USER on user.role_id = role.id
WHERE user.user = '$name'");
$find_activity_points = ("SELECT $activity_$role
FROM $activity
WHERE activity_level = '$activity_level'");
$role = mysql_query($find_role);
$activity_points = mysql_query($find_activity_points);
if ($activity_points !== false) {
}
else {
echo mysql_error ();
die;
}
$convert_activity_points = array();
while ($row = mysql_fetch_array($activity_points, MYSQL_ASSOC)) {
$convert_activity_points[] = $row;
}
$set_points = "UPDATE $name SET $activity='$convert_activity_points' WHERE day='$date'";
mysql_query($set_points);
}
mysql_close($connection);
?>
Et c'est le message d'erreur que je reçois quand je soumettre form.php pour update.php:
Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre versions du serveur MySQL pour la bonne syntaxe à utiliser près DE cadran OÙ activity_level='70" à la ligne 1
P. S. je sais qu'il existe des vulnérabilités d'injection SQL, mais je suis la seule personne à l'aide de ce programme et je l'utilise en local sur mon ordinateur. Je suis d'accord avec les vulnérabilités pour l'instant.
Edit: code Modifié (j'apprécie vraiment les commentaires)
$find_role = "SELECT sales_role FROM role LEFT JOIN USER on user.role_id=role.id WHERE user.user='$name'";
$find_activity_points = "SELECT %s_%s FROM $activity WHERE activity_level='%d'";
list($role) = mysql_fetch_array(mysql_query($find_role));
$activity_points = mysql_query(
sprintf($find_activity_points, //the main string
$activity, $role, $activity, $activity_level) //the "arguments"
);
if ($activity_points !== false) {
}
else {
echo mysql_error ();
die;
}
Met à jour le tableau avec des 0 et n'affiche pas une erreur msg.
Re les vulnérabilités d'injection SQL, voir mon premier PS déclaration
- Avez-vous regardé ce que les requêtes sql sont transmises à la base de données mysql par juste
echo
eux? Aussi, pourquoi avez-vous ajouter des parenthèses autour des cordes, comme("foo bar")
? - Est
activity_level
un type numérique? Pourrait-il en être les guillemets autour de la70
? - Possible faute de frappe: "$activity_$rôle"
- Vous dire quelque chose à partir de la mise à jour mais il y a seulement des instructions select.
- JOINTURE EXTERNE avec OÙ sur la même table est égale à INNER JOIN!
- Quelles sont les parenthèses autour de la requête pour?
- "Je suis d'accord avec les vulnérabilités pour l'instant." 🙁 !!
- "Je suis d'accord avec les vulnérabilités pour l'instant." C'est pourquoi nous avons pirates se sentir comme les dieux après le piratage de systèmes réalisés par ces programmeurs.
Vous devez vous connecter pour publier un commentaire.
Sur cette ligne:
Je ne peux pas voir n'importe où dans votre code que vous définissez la valeur de
$role
avant l'exécution de la requête.Donc, en supposant que
$activity == 'Eating'
votreSELECT
déclaration peut ressembler à quelque chose comme ceci:Cela peut conduire à votre erreur, comme je le crois, MySQL ne permet pas de
$
caractères dans le tableau/des noms de colonne.Comme Babiker a a suggéré, vous concaténation ou de l'utilisation de sprintf() peut aider à résoudre certains de ces diverses questions.
Edit: pour Répondre à votre question dans les commentaires.
Comme d'autres l'ont mentionné, le changement de vos
$find_activity_points
ligne similaire à la suivante:Une chose à garder à l'esprit, c'est quand vous faites instruction SQL de concaténation ("SELECT" . $activité . ") comme dans mon exemple, vous vous ouvrez L'Injection SQL attaques.
role
avec un$
. Ailleurs dans le code, elle fait référence à unsales_role
champ, alors peut-être que c'est juste censé être$activity . "_role"
(c'est à direEating_role
à l'aide de votre exemple).Au premier coup d'oeil, je pense que "peut-être" activity_level type de données n'est pas la chaîne, mais nombre. Si vous n'avez pas besoin de placer des '...' dans OÙ activity_level = '$activity_level'
Edit: pour être sûr de ce que provoque les problèmes, je recommande journalisation, comme dans l'exemple ici. Il suffit d'inclure la classe et le journal de votre requête dans un fichier (très facile), puis d'examiner la requête elle-même.
$rôle n'est pas défini jusqu'à ce que plus tard dans votre programme, et même alors, il est une non-valeur scalaire qui va ruiner votre requête ainsi. Vous essayez d'utiliser les variables avant qu'ils ont des valeurs. Ils ne fonctionnent pas de cette façon, une fois que la chaîne est définie, elle contiendra les valeurs de ces variables au moment où elle a été déclarée.
Vous voudrez probablement utiliser sprintf.
http://php.net/manual/en/function.sprintf.php
Et puis
Bien sûr, vous avez encore besoin d'obtenir
$role
un (scalaire) de la valeur qui peut être traité correctement au sein de la chaîne. Un (peu dangereux, mais rapide) façon de le faire serait:La concaténation de chaînes de php pour mysql cordes par exemple:
$_POST["activity_level"]
est une chaîne de caractères avec'
en elle.Solution: