[RESOLU] Requête MySQL infructueuse

Petit nouveau ! | 4 Messages

26 mars 2019, 00:12

Bonjour à tous,
J'ai cherché sur le net, aussi bien des cours de MySQL en PHP que des forum, mais je n'ai pas trouvé mon bonheur. Du coup, je me permet d'ouvrir un post afin de voir si quelqu'un pouvais m'aider.
J'ai depuis un an environ un site internet que j'ai écrit en PHP. Dans celui-ci, j'ai une base de données utilisateurs. Lorsque j'ouvre ma page d'accueil, je peux savoir le nombre de personnes qui se sont inscrites sur mon site. Depuis un an, j'avais un serveur à la maison qui hébergeait mon site et j'utilisais une requête mysqli afin d'avoir ceci. Par contre, suite à un déménagement à l'étranger, je me suis mis sur un serveur mutualisé et j'ai dû recodé une partie de mon site en utilisant la fonction "new PDO" pour la connexion MySQL et c'est là que les ennuis ont commencés. Je pense que ça doit être un truc tout bête, mais je dois dire que ça fait plusieurs jours que je suis dessus et je n'y arrive plus.

Ma page d'accueil (qui fonctionne très bien) me donne le nombre de personnes inscrites sur mon site. Pour cela, j'ai codé ceci
        try
                {
                $link=new PDO('mysql:host='.$server.'; dbname='.$database.'', $mysql_user, $mysql_pwd);
                }
        catch (Exception $e)
                {
                die('Erreur: '. $e->getMessage());
                }

        $requete = "SELECT * FROM Ma_Base";
        if ($result_query=$link->query($requete))
                {
                while($dnn = $result_query->fetch())
                        {
                        $num_rows++;
                        }
                $result_query->Close();
                echo "$num_rows inscrits";
                }
        }
Par la suite, lorsque quelqu'un veux se connecter, une autre page est utilisée avec la requête MySQL suivante, qui tombe en échec:
        try
                {
                $link=new PDO('mysql:host='.$server.'; dbname='.$database.'', $mysql_user, $mysql_pwd);
                }
        catch (Exception $e)
                {
                die('Erreur: '. $e->getMessage());
                }
        $requete="SELECT * FROM Ma_Base WHERE user_name LIKE '$Login' AND pswrd LIKE PASSWORD('$Pass') AND active LIKE 'true'";
        if ($result_query=$link->query($requete))
                        {
                        while($dnn = $result_query->fetch())
                                {
                                 ...
                                 }
                        $result_query->closeCursor();
                        }
En comparant les deux codes, je me dit que la seule différence vient du fait que dans le deuxième cas, je fait une requête conditionnelle. Du coup, j'ai essayé de l'écrire différemment, comme par exemple en utilisant ' ' à la place de " ". J'ai aussi essayé en supprimant complètement les ' '. Mais rien n'y fait. Je dois probablement avoir plusieurs erreurs qui font que lorsque j'arrive à en corriger une, une autre erreur non corrigé empêche le code de fonctionner. J'ai même essayé un vérificateur de code PHP, mais il ne m'a rient trouvé.

Si quelqu'un a une idée sur ce qui ne fonctionne pas, je suis tout à fait preneur.

Je vous remercie pour votre aide.

Guillaume

PHP: 7.0
MySQL: 5.1

Mammouth du PHP | 1533 Messages

26 mars 2019, 09:53

test tes requète dans php my admin, il est plus loquace pour t'indiquer les erreurs.

je n'utiliserait pas LIKE mais plutot un = .
c'est mieux point de vue performance.

pour connaitre le nombre d'inscrit, un SELECT COUNT(*) FROM ma_base t'apporte la solution directement sans avoir à ramener toutes les données inutiles
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Petit nouveau ! | 4 Messages

26 mars 2019, 21:24

Merci beaucoup Spols pour la réponse.
Oui, je suis d'accord, SELECT COUNT(*) FROM ma_base serait bien, mais je n'aurais pas pu faire la comparaison avec la page suivante qui pose problème. En fait, ça permettait d'avoir une référence qui fonctionne afin de montrer que ça marche d'un coté mais pas de l'autre.
J'ai aussi essayé avec les = à la place des LIKE, mais rien n'y fait, je n'arrive pas faire fonctionner la page.

Ce qui est curieux, c'est que ça fonctionnait pendant un moment et puis d'un coup plus. Par contre, je ne sais pas ce que j'ai modifié.

En tout cas, merci encore pour la réponse.

Mammouth du PHP | 1076 Messages

26 mars 2019, 21:25

"test tes requète dans php my admin, il est plus loquace pour t'indiquer les erreurs."
ça donne quoi ?

Petit nouveau ! | 4 Messages

26 mars 2019, 21:31

Juste pour information, j'ai utilisé la fonction
ini_set('display_errors', 'stdout');
et j'ai obtenu ceci:

Fatal error: Uncaught Error: Call to a member function query() on null in /home/xxx/www/1.php:73 Stack trace: #0 {main} thrown in /home/xxx/www/1.php on line 73

La ligne 73 étant la suivante:
if ($result_query=$link->query($requete))
Merci

Petit nouveau ! | 4 Messages

27 mars 2019, 00:17

Je viens trouver, par contre, si quelqu'un a une solution pour simplifier, je suis preneur.
Voilà ce que j'avais et je détaille un peu plus que dans le premier message
 try
                {
                $link=new PDO('mysql:host='.$server.'; dbname='.$database.'', $mysql_user, $mysql_pwd);
                }
        catch (Exception $e)
                {
                die('Erreur: '. $e->getMessage());
                }
...
if...
...
        $requete="SELECT * FROM Ma_Base WHERE user_name LIKE '$Login' AND pswrd LIKE PASSWORD('$Pass') AND active LIKE 'true'";
        if ($result_query=$link->query($requete))
                        {
                        while($dnn = $result_query->fetch())
                                {
                                 ...
                                 }
                        $result_query->closeCursor();
                        }
De ce fait, j'ai juste modifier le code comme ceci:
...
if...
...
 try
                {
                $link=new PDO('mysql:host='.$server.'; dbname='.$database.'', $mysql_user, $mysql_pwd);
                }
        catch (Exception $e)
                {
                die('Erreur: '. $e->getMessage());
                }

        $requete="SELECT * FROM Ma_Base WHERE user_name LIKE '$Login' AND pswrd LIKE PASSWORD('$Pass') AND active LIKE 'true'";
        if ($result_query=$link->query($requete))
                        {
                        while($dnn = $result_query->fetch())
                                {
                                 ...
                                 }
                        $result_query->closeCursor();
                        }
Par contre, comme j'ai plusieurs requêtes MySQL, je dois ajouter la partie try... catch... avant chaque requête. Et ça fonctionne. Par contre, l'idéal serait de n'utiliser qu'une seule fois les fonctions try et catch.
Est-ce que quelqu'un saurait comment faire?

Merci.