2017-08-22 3 views
0

J'ai une page qui met à jour les données d'un utilisateur spécifique. L'utilisateur a une position, qui est une clé étrangère. La mise à jour de la requête (ci-dessous) fonctionne bien sans la position, mais avec la position, j'obtiens l'erreur suivante.PHP: Erreur sur l'instruction Update avec sous-requête

Requête:

Erreur dans la requête: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de « SELECT positionid DE visitorsystem.position OÙ positionName LIKE « % Informat » à la ligne 3

J'ai essayé de me frayer un chemin autour en utilisant la jointure intérieure comme j'ai vu quelques solutions données ici sur la pile mais rien n'a fonctionné. Aucune suggestion ?

+0

Votre sous-requête ne doit pas être entre guillemets, mais entre parenthèses –

+1

** ATTENTION **: Lors de l'utilisation de mysqli, vous devriez utiliser [requêtes paramétrées] (http://php.net/manual/fr/mysqli). quickstart.prepared-statements.php) et ['bind_param'] (http://php.net/manual/fr/mysqli-stmt.bind-param.php) pour ajouter des données utilisateur à votre requête. ** N'utilisez PAS ** l'interpolation ou la concaténation de chaîne pour y parvenir car vous avez créé un [bogue d'injection SQL] grave (http://bobby-tables.com/). ** NE JAMAIS ** mettre directement dans une requête les données utilisateur '$ _POST',' $ _GET' ou ** tout **, cela peut être très dangereux si quelqu'un cherche à exploiter votre erreur. – tadman

+0

Note: L'interface orientée objet de 'mysqli' est significativement moins verbeuse, rendant le code plus facile à lire et à auditer, et n'est pas facilement confondue avec l'interface' mysql_query' obsolète. Avant de vous investir trop dans le style procédural, cela vaut la peine de changer. Exemple: '$ db = new mysqli (...)' et '$ db-> prepare (" ... ")' L'interface procédurale est un artefact de l'ère PHP 4 quand l'API 'mysqli' a été introduite et ne devrait pas être utilisée dans une nouvelle – tadman

Répondre

1

aller dans les sous-requêtes parens réguliers, pas de guillemets, donc dans un sens général:

SELECT x FROM y WHERE z IN (SELECT z FROM a) 

guillemets simples et doubles (par défaut) sont uniquement pour les valeurs de chaîne.

+0

J'ai également essayé entre parenthèses mais malheureusement cela ne fonctionnera toujours pas – Chanter

+1

"Ne fonctionne pas" n'est pas un diagnostic utile Vous pouvez avoir d'autres problèmes Consultez votre journal des erreurs pour plus de détails. – tadman

+0

J'ai essayé de placer la sous-requête entière entre parenthèses plusieurs fois et une erreur d'analyse a été donnée.J'ai fermé mon navigateur et appliqué le changement à nouveau, d'une certaine manière cela a fait une différence et travaillé cette fois.Très confus .. Merci pour l'aide :)! Je prendrai également note sur les questions de sécurité, merci de le signaler – Chanter