Bonjour à tous,

Voila je rencontre un petit problème avec phpMyAdmin dans la fenêtre SQL.
la requête échoue lorsqu'il y a un critère litéral avec des quotes.

Ce que je fais

Voici ma config : Ubuntu, phpMyadmin 4.6.3, nginx 1.10, php 7.01, MySQL 5.7

select * from tags where title='fruits'

 MySQL a répondu: 
#1064 - Erreur de syntaxe près de '& LIMIT 0, 25' à la ligne 1

il semble que les apostrophes soient converties en entités html &#039
d'où le "prés &"

Si vous avez déjà eu ce problème, merci de m'apporter vos lumières

Merci

7 réponses


Salut,

Pour le "près de &", je pense que c'est parce que phpmyadmin modifie ta requête et y ajoute & LIMIT 0, 25 parce qu'il pagine.

Tu as essayé avec des " ou des ` ?

Huggy
Auteur

Je ne pense pas que ce soit le LIMIT 0, 25 car si je met mon propre LIMIT c'est pareil
la requête en erreur retournée :

select * from tags where title=& LIMIT 0, 25
 MySQL a répondu: 
#1064 - Erreur de syntaxe près de '& LIMIT 0, 25' à la ligne 1

ce qui me fait penser que ça coince juste après le =
si je fais

select * from tags where id=1

aucun problème

Si j'examine la requête ajax transmise, j'ai ça

sql_query :"select+*+from+tags+where+title='fruits'"

ce qui me semble correct (j'obtiens la même chose sur un poste qui fonctionne)

Huggy
Auteur

Il y a un déjà un pb lorsque dans la fenêtre SQL, on clique sur le bouton Format
celui-ci affiche une requête foireuse

SELECT
  *
FROM
  tags
WHERE
  title = 'fruits';

ce bouton lance une requête ajax vers db_sql_format.php
le résultat retourné contient des &#039 à la place des quotes

Et ça donne quoi avec " ou ` ?

Huggy
Auteur

ni les guillemets ni les accent grave sont reconnus pour encadrer un litéral

#1064 - Erreur de syntaxe près de '&quot LIMIT 0, 25' à la ligne 1
#1054 - Champ fruit inconnu dans where clause

Ce qui est bizarre sur l'erreur avec les ", c'est que c'est le second qui semble poser problème, et non le premier. Sinon, on aurait une erreur de syntaxe près de &quotfruits&quot LIMIT 0, 25.

Huggy
Auteur

Bon j'avance doucement
j'ai pointé la source du problème sans vraiment pouvoir le résoudre
En fait phpmyadmin n'y est pour rien, c'est php qui déconne
le problème vient du comportement de la variable $_POST qui est censée de désencoder les entitiés html mais qui ne le fait ici que partiellement.
un exemple tout bête : l'envoi par formulaire d'une valeur contenant une apostrophe encodée
j'ai mis 2 encodages différents de l'apostrophe &#39 et &apos

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test html entities</title>
</head>
<body>

        <form action="do.php" method="post">
        <input type="text" name="valeur" value="&#39;coucou&apos;">
        <input type="submit" value="OK">
        </form>

</body>
</html>

voici le fichier qui reçoit la valeur

<?php
echo $_REQUEST['valeur'];  /// ne désencode pas
echo "<br />";
echo $_POST['valeur'];   // ne désencode pas
echo "<br />";
echo filter_input(INPUT_POST, 'valeur');  // ok désencode
?>

le résultat de ces trois sorties vu en affichant la source de la page

&#039;coucou&#039;<br />&#039;coucou&#039;<br />'coucou'

les 2 premières contiennent toujours des entités html et en plus le &apos est converti en &#39
normalement on devrait avoir

'coucou'<br />'coucou'<br />'coucou'

Si quelqu'un a une explication ou connait la variable magique qui gère ce comportement, je suis preneur

Pour résoudre mon problème avec phpMyAdmin j'ai salement rajouté un html_entity_decode dans le fichier import.php ligne 114

if (! empty($sql_query)) {
        $sql_query = html_entity_decode($sql_query,ENT_QUOTES);  // <<< hack 
    ...