Comment dois-je écrire PHP $_POST vars dans un mysql_query fonction?
À accéder à ma base de données, j'ai à l'utilisateur de remplir un formulaire, et dans la page cible, la posté valeurs sont utilisées dans la requête MySQL.
$query = mysql_query("SELECT pass FROM database WHERE user='$_POST[user]'");
Cependant, pour une raison ou une autre, MySQL n'aime pas mon à l'aide d'un $_POST variable dans la commande, et il ne fonctionne que si je définis (par exemple) $user = $_POST['user'];
, puis mettre $utilisateur directement dans la commande SQL.
Sur l'autre main, je peux utiliser $_POST valeurs dans les états d'INSERTION des noms de colonnes ne sont pas nécessaires:
$query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', '$_POST[user]'");
Si j'essaie une instruction INSERT, où les attributs sont définis (par exemple,user='foo'
), puis le même problème apparaît.
Ce que j'ai fait une erreur dans ma requête SQL, la commande d'erreur lorsque vous exécutez, mais fonctionne avec la méthode de la mise en forme d'un INSERT de commande?
Espérons-le, ce n'est pas "pas de chance, on dirait que vous avez à céder l'ensemble de votre posté valeurs". Heh.
OriginalL'auteur Julian H. Lam | 2010-01-20
Vous devez vous connecter pour publier un commentaire.
D'abord, watch out pour les Injections SQL!
Maintenant, pour répondre à votre question, essayez de faire ceci à la place:
Vous faisiez un couple de choses de mal:
=
opérateur au lieu deLIKE
opérateur'
$_POST
tableau avec'
PS: Vous devriez utiliser
mysql_real_escape_string()
au lieu demysql_escape_string()
!Pour plusieurs raisons, voir dev.mysql.com/doc/refman/5.0/en/...
Wow, quelques bons conseils ici, ainsi que toutes les autres réponses. Bon avertissement à propos de l'injection SQL, ainsi... de réorganiser mon code ASAP.
Pourquoi utilisez-vous
mysql_escape_string
dans l'exemple de code et puis dites-OP de ne pas l'utiliser?Agriculteur: les Classements sont également impliqués. En règle générale je considère comme une des meilleures pratiques à l'aide de
LIKE
au lieu de=
chaque fois que les comparaisons de chaînes sont nécessaires.OriginalL'auteur Alix Axel
Vous êtes tout simplement d'insérer une variable dans une chaîne de caractères, donc il ne devrait pas d'importance qui vous êtes de la mettre en.
Il existe quelques problèmes à signaler.
Vous pouvez utiliser {} format pour le tableau des variables. Vous n'utilisez pas de guillemets autour de la arrray noms de clé dans ce format.
Deux, vous ne voudrais jamais faire une requête comme ça parce que vous êtes ouvert à sql injection de trous. Considérons, ce que si $_POST['utilisateur'] est "vache"; drop table de base de données;--"?
Vous devez exécuter mysql_real_escape_string sur le POST d'entrée avant de la mettre dans votre requête, ou check out en utilisant PHP PDO avec les requêtes préparées.
Une façon de le faire format de votre chaîne de caractères qui donne un peu de structure est d'utiliser sprintf.
OriginalL'auteur JAL
mysql_*()
fonctions rappelez-vous de toujours filtre (mysql_real_escape_string()) toutes les données qui provient de la source non fiable (comme utilisateur)Payer plus d'attention à la façon dont votre code ressemble. Il suffit de comparer les listes suivantes:
Dois-je expliquer quel est le meilleur à lire, les modifier ou de les comprendre?
D'accord, PDO est de loin supérieure à la base mysql_* les fonctions.
(Plusieurs mois plus tard) - certainement utiliser PDO maintenant.
OriginalL'auteur Crozin
Pourquoi ne pas vérifier et voir ce que mysql_error() a à dire à ce sujet? Si votre requête n'est pas valide, mysql_error() retournera un belle goutte de texte vous dire exactement ce qui s'est passé.
Comme pour MySQL n'aime pas le POST var si vous l'insérez directement pour certaines séries, mais pas les autres, alors vous devez vous assurer que vous êtes en utilisant des données cohérentes et de configurations pour chaque test. Si certains tests sont effectués à l'aide d'un GET, alors votre POST vars sera vide. Si vous utilisez des noms d'utilisateur différents pour chaque test, voir si ce qui est cohérent entre ceux qui échouent.
Et comme mentionné ci-dessus, lisez sur l'injection SQL et comment votre requête ne demandent qu'à être renversé par un utilisateur malveillant.
OriginalL'auteur Marc B
Essayer
et
C'est toujours une bonne idée pour désinfecter rien reçu via $_GET ou $_POST
OriginalL'auteur jtm