Ouvrir une connexion d'une base de données en pph
Résolu/Fermé
lunick90
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014
-
28 juil. 2014 à 21:40
lunick90 Messages postés 21 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 5 août 2014 - 31 juil. 2014 à 22:35
lunick90 Messages postés 21 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 5 août 2014 - 31 juil. 2014 à 22:35
A voir également:
- Ouvrir une connexion d'une base de données en pph
- Gmail connexion - Guide
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir fichier .bin - Guide
- Gmail connexion autre compte - Guide
- Comment ouvrir un fichier docx ? - Guide
13 réponses
CookieSpirit
Messages postés
48
Date d'inscription
vendredi 11 juillet 2014
Statut
Membre
Dernière intervention
6 août 2014
12
28 juil. 2014 à 23:04
28 juil. 2014 à 23:04
Alors oui et non, c'est pas vraiment comme ça qu'il faudrait procéder.
Je vais vous aider en plusieurs étapes :
1) Je vous conseille fortement PDO et ses requêtes préparées pour l'échange PHP->SQL. Ce système offre une très bonne protection contre les injections SQL et c'est de plus très simple à utiliser. Je vous copie mon petit bout de code pour la connexion :
Ensuite, pour les requetes rien de plus simple :
Grâce au combo prepare/execute, aucun risque de subir d'injection directe.
2) Avez-vous inclus votre fichier contenant la fonction dans le 2ème?
ça se fait avec cette méthode :
Dans chaque fichier php où vous mettrez ce code vous pourrez utiliser les fonctions contenues dans connexionbdd.php
3) N'oubliez pas de remplacer 'localhost_pwd' etc par vos identifiants SQL, ça peut paraitre bête mais beaucoup de monde l'oublie.
Cordialement, CookieSpirit
Je vais vous aider en plusieurs étapes :
1) Je vous conseille fortement PDO et ses requêtes préparées pour l'échange PHP->SQL. Ce système offre une très bonne protection contre les injections SQL et c'est de plus très simple à utiliser. Je vous copie mon petit bout de code pour la connexion :
try { $bdd = new PDO('mysql:host=hote;dbname=nomdelabase', 'pseudo', 'pass'); } catch (PDOException $e) { die('Erreur: ' . $e->getMessage()); }
Ensuite, pour les requetes rien de plus simple :
$req = $bdd->prepare('UPDATE comptes SET pseudo = :pseudo'); $req->execute(array('pseudo' => $variableavecpseudo));
Grâce au combo prepare/execute, aucun risque de subir d'injection directe.
2) Avez-vous inclus votre fichier contenant la fonction dans le 2ème?
ça se fait avec cette méthode :
require_once("mesfonctions/connexionbdd.php");
Dans chaque fichier php où vous mettrez ce code vous pourrez utiliser les fonctions contenues dans connexionbdd.php
3) N'oubliez pas de remplacer 'localhost_pwd' etc par vos identifiants SQL, ça peut paraitre bête mais beaucoup de monde l'oublie.
Cordialement, CookieSpirit
CookieSpirit
Messages postés
48
Date d'inscription
vendredi 11 juillet 2014
Statut
Membre
Dernière intervention
6 août 2014
12
Modifié par CookieSpirit le 29/07/2014 à 14:09
Modifié par CookieSpirit le 29/07/2014 à 14:09
Effectivement votre connexion est bonne, faites bien attention a mettre le $ devant bdd (j'imagine que c'est juste une faute de frappe).
Pour les requêtes "comptes" est le nom d'une table et pseudo est une des colonnes, j'ai juste copié une partie de mon code et l'ait allégé.
Un exemple plus simple serait :
Bien sûr la requête n'est pas complète, toute table (sauf cas spécifiques) SQL se doit d'avoir une colonne 'id' avec l'attribut A_I (auto incrémentation) afin de pouvoir modifier une et une seule ligne à la fois, on pourra donc compléter le code précédent :
Après, que ce soit PDO ou tout autre classe (ou presque) permettant d'accéder à une base de donnée auront des requêtes SQL fortement similaire, SQL étant un langage à part.
Cordialement, CookieSpirit
Edit : Si vous utilisez Wamp, n'oubliez pas de vérifier que PDO est activé en cliquant gauche sur l'icone Wamp de la barre des tâches, ensuite allez dans PHP puis Extensions PHP, vérifier que php_pdo_mysql est bien activé.
Chez la plupart des hébergeurs, cette extension est activée par défaut, rien à installer de plus.
Pour les requêtes "comptes" est le nom d'une table et pseudo est une des colonnes, j'ai juste copié une partie de mon code et l'ait allégé.
Un exemple plus simple serait :
$req = $bdd->prepare('UPDATE nomdelatable SET colonne = :colonne'); $req->execute(array('colonne' => $variableamettrededans));
Bien sûr la requête n'est pas complète, toute table (sauf cas spécifiques) SQL se doit d'avoir une colonne 'id' avec l'attribut A_I (auto incrémentation) afin de pouvoir modifier une et une seule ligne à la fois, on pourra donc compléter le code précédent :
$req = $bdd->prepare('UPDATE nomdelatable SET colonne = :colonne WHERE id = :id'); $req->execute(array('colonne' => $variableamettrededans, 'id' => $iddelaligne));
Après, que ce soit PDO ou tout autre classe (ou presque) permettant d'accéder à une base de donnée auront des requêtes SQL fortement similaire, SQL étant un langage à part.
Cordialement, CookieSpirit
Edit : Si vous utilisez Wamp, n'oubliez pas de vérifier que PDO est activé en cliquant gauche sur l'icone Wamp de la barre des tâches, ensuite allez dans PHP puis Extensions PHP, vérifier que php_pdo_mysql est bien activé.
Chez la plupart des hébergeurs, cette extension est activée par défaut, rien à installer de plus.
CookieSpirit
Messages postés
48
Date d'inscription
vendredi 11 juillet 2014
Statut
Membre
Dernière intervention
6 août 2014
12
Modifié par CookieSpirit le 29/07/2014 à 22:44
Modifié par CookieSpirit le 29/07/2014 à 22:44
Pour les requêtes sans paramètres, il faut utiliser query :
puis pour récuperer le résultat :
ensuite si votre table avait par exemple une colonne titre, pour l'afficher il suffit de faire :
Voilà, j'espère que ça vous aidera ;)
$req = $bdd->query('SELECT * FROM table1 WHERE id = 1');
puis pour récuperer le résultat :
$donnees = $req->fetch();
ensuite si votre table avait par exemple une colonne titre, pour l'afficher il suffit de faire :
echo $donnees['titre'];
Voilà, j'espère que ça vous aidera ;)
lunick90
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014
29 juil. 2014 à 07:31
29 juil. 2014 à 07:31
Bonjour et merci pour votre aide rapide.
Comme mon application reste en local et ne sera pas exportée sur la toile, je me moque des injections pour le moment... mais c'est un coup à prendre, et il faut le prendre de suite !!
J'ai quelques questions concernant votre réponse CookieSpirit :
- pour les requêtes
où comptes est la table dont j'ai besoin pour ma requête et pseudo, l'attribut de cette dernière ?
- pour les identifiants : j'utilise wampserver sous windows, je n'ai pas changé le mot de passe ni le login, donc ça me donne :
est ce bien ça ?
Merci de votre aide
Cordialement
Lunick
Comme mon application reste en local et ne sera pas exportée sur la toile, je me moque des injections pour le moment... mais c'est un coup à prendre, et il faut le prendre de suite !!
J'ai quelques questions concernant votre réponse CookieSpirit :
- pour les requêtes
$req = $bdd->prepare('UPDATE comptes SET pseudo = :pseudo'); $req->execute(array('pseudo' => $variableavecpseudo));
où comptes est la table dont j'ai besoin pour ma requête et pseudo, l'attribut de cette dernière ?
- pour les identifiants : j'utilise wampserver sous windows, je n'ai pas changé le mot de passe ni le login, donc ça me donne :
bdd = new PDO('mysql:host=localhost;dbname=nomdemabase', 'root', '');
est ce bien ça ?
Merci de votre aide
Cordialement
Lunick
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lunick90
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014
Modifié par lunick90 le 29/07/2014 à 20:56
Modifié par lunick90 le 29/07/2014 à 20:56
Bonsoir,
oui c'est bien une faute de frappe, que je n'ai pas (encore) faite dans mon script !
Merci pour l'aide apportée pour mon problème.
Une dernière chose, en PDO, comment faire une requête "simple" du type
(par exemple) et l'afficher par la suite ?
Parce que je suis perdu.. j'ai essayé plein de chose trouvé sur d'autre forums ou sur les différentes documentations mais rien ne fait ce que je veux !
Merci par avance
Cordialement
Lunick
oui c'est bien une faute de frappe, que je n'ai pas (encore) faite dans mon script !
Merci pour l'aide apportée pour mon problème.
Une dernière chose, en PDO, comment faire une requête "simple" du type
SELECT * FROM table1 WHERE table1.id = 1
(par exemple) et l'afficher par la suite ?
Parce que je suis perdu.. j'ai essayé plein de chose trouvé sur d'autre forums ou sur les différentes documentations mais rien ne fait ce que je veux !
Merci par avance
Cordialement
Lunick
lunick90
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014
30 juil. 2014 à 07:34
30 juil. 2014 à 07:34
Bonjour et merci pour le temps que vous passez à m'aider.
Je viens d'essayer le code (mis à ma sauce) que vous m'avez donné. Il y a une erreur qui ressort, la même qu'hier et essayant de trouver par moi même :
Fatal error: Call to a member function fetch() on a non-object in [chemin_de_mon_fichier][ligne_i]
voilà mon code :
cette requête me permet de chercher dans ma table table1, les enregistrements correspondant à un mot clé (valeur) que j'ai renseigné.
Comment résoudre ce problème de fetch ?
Merci de votre aide
Cordialement
Lunick
Je viens d'essayer le code (mis à ma sauce) que vous m'avez donné. Il y a une erreur qui ressort, la même qu'hier et essayant de trouver par moi même :
Fatal error: Call to a member function fetch() on a non-object in [chemin_de_mon_fichier][ligne_i]
voilà mon code :
$req = $bdd->query("SELECT att1, att2 FROM table1 WHERE att2 like %".$_GET['valeur']."%"); $donnees = $req->fetch(); echo $donnees['att1']; echo $donnees['att2'];
cette requête me permet de chercher dans ma table table1, les enregistrements correspondant à un mot clé (valeur) que j'ai renseigné.
Comment résoudre ce problème de fetch ?
Merci de votre aide
Cordialement
Lunick
CookieSpirit
Messages postés
48
Date d'inscription
vendredi 11 juillet 2014
Statut
Membre
Dernière intervention
6 août 2014
12
Modifié par CookieSpirit le 31/07/2014 à 02:54
Modifié par CookieSpirit le 31/07/2014 à 02:54
Théoriquement c'est dû à une erreur dans la requête SQL, essayez de remplacer les doubles guillemets entre $_GET['valeur'] par des guillemets simples :
Vérifiez aussi que tout ce qui est écrit dans la requête est présent dans la base (colonnes att1 et att2, table table1...)
Mais personnellement je vous conseille d'utiliser les requêtes préparées, là votre code est extrêmement vulnérable aux injections sql
le mieux est de faire :
= $req = $bdd->query("SELECT att1, att2 FROM table1 WHERE att2 like %'.$_GET['valeur'].'%");
Vérifiez aussi que tout ce qui est écrit dans la requête est présent dans la base (colonnes att1 et att2, table table1...)
Mais personnellement je vous conseille d'utiliser les requêtes préparées, là votre code est extrêmement vulnérable aux injections sql
le mieux est de faire :
$recherche = '%' . $_GET['valeur'] . '%'; $req = $bdd->prepare("SELECT att1, att2 FROM table1 WHERE att2 like :recherche"); $req->execute(array('recherche' => $recherche)); $donnees = $req->fetch(); echo $donnees['att1']; echo $donnees['att2'];
lunick90
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014
31 juil. 2014 à 07:29
31 juil. 2014 à 07:29
Bonjour,
j'ai commencé par remplacé les double cotes " par des simples cote '. Ca na rien donné au début, mais quand j'ai pris le code que vous m'aviez donné, ça a marché...
Lorsque j'ai plusieurs enregistrement qui correspondent au terme $_GET['valeur'], je devrai pouvoir les afficher. J'ai essayé de faire un while et un foreach, mais sans succès (pour la seconde méthode, j'ai du m'y prendre comme un pied, ça doit être pour ça !!).
La boucle, je dois la mettre à quel endroit : après le fetch ou avant ?
Merci pour l'aide apportée,
Cordialement
Lunick
j'ai commencé par remplacé les double cotes " par des simples cote '. Ca na rien donné au début, mais quand j'ai pris le code que vous m'aviez donné, ça a marché...
Lorsque j'ai plusieurs enregistrement qui correspondent au terme $_GET['valeur'], je devrai pouvoir les afficher. J'ai essayé de faire un while et un foreach, mais sans succès (pour la seconde méthode, j'ai du m'y prendre comme un pied, ça doit être pour ça !!).
La boucle, je dois la mettre à quel endroit : après le fetch ou avant ?
Merci pour l'aide apportée,
Cordialement
Lunick
lunick90
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014
31 juil. 2014 à 07:47
31 juil. 2014 à 07:47
Finallement, en cherchant un tout petit peu plus long que son nez, on finit par trouvé quelque chose.
alors voilà ce que j'ai fait :
sauf que ce code affiche plusieurs fois le même enregistrement lorsque je demande dans ma requete de regarder dans plusieurs tables. Comment faire pour qu'il n'affiche une et une seule fois chaque ligne ?
Merci de votre aide
Cordialement,
Lunick
alors voilà ce que j'ai fait :
$recherche = '%' . $_GET['valeur'] . '%'; $req = $bdd->prepare("SELECT * FROM motrice WHERE att1 like :recherche"); $req->execute(array('recherche' => $recherche)); while($donnees = $req->fetch()){ echo $donnees['att1'],'[separateur]', $donnees['att2']; }
sauf que ce code affiche plusieurs fois le même enregistrement lorsque je demande dans ma requete de regarder dans plusieurs tables. Comment faire pour qu'il n'affiche une et une seule fois chaque ligne ?
Merci de votre aide
Cordialement,
Lunick
CookieSpirit
Messages postés
48
Date d'inscription
vendredi 11 juillet 2014
Statut
Membre
Dernière intervention
6 août 2014
12
31 juil. 2014 à 20:24
31 juil. 2014 à 20:24
A mon avis c'est un problème de conception de votre base SQL, il vaut mieux effectuer les recherches dans une seule table à la fois. Pourquoi avez vous besoin d'effectuer une recherche dans plusieurs tables? (Si ce n'est pas indiscret)
lunick90
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014
31 juil. 2014 à 21:05
31 juil. 2014 à 21:05
Bonsoir,
j'ai besoin de rechercher dans plusieurs table à la fois, car j'ai crée des tables ayant des attributs similaires et d'autre différents.
un exemple serait surement le bienvenu :
table1 : t1.id - t1.nom - t1.prenom - t1.[autres_attribut]...
table2 : t2.id - t2.nom - t2.prenom - t2.[autres_attributs_differents_de_t1]...
En fait, mon schéma de ma base de données n'est pas du tout optimisée...
j'aurai du créer une table qui regroupe les champs nom et prenom dans une table t et laisser les autres attributs dans leurs tables actuelles, et lier les tables entres elles !!
La solution que j'ai trouvé, c'est de faire une recherche table après table et d'afficher les différents résultats obtenus. Cela me donne un code pas du tout propre, mais qui fonctionne comme je le souhaite !
Par rapport à ma question initiale (et la seconde), c'est résolu, qu'en pensez vous ?
Si vous avez une proposition pour la recherche, je suis preneur !!
Cordialement,
Lunick
j'ai besoin de rechercher dans plusieurs table à la fois, car j'ai crée des tables ayant des attributs similaires et d'autre différents.
un exemple serait surement le bienvenu :
table1 : t1.id - t1.nom - t1.prenom - t1.[autres_attribut]...
table2 : t2.id - t2.nom - t2.prenom - t2.[autres_attributs_differents_de_t1]...
En fait, mon schéma de ma base de données n'est pas du tout optimisée...
j'aurai du créer une table qui regroupe les champs nom et prenom dans une table t et laisser les autres attributs dans leurs tables actuelles, et lier les tables entres elles !!
La solution que j'ai trouvé, c'est de faire une recherche table après table et d'afficher les différents résultats obtenus. Cela me donne un code pas du tout propre, mais qui fonctionne comme je le souhaite !
Par rapport à ma question initiale (et la seconde), c'est résolu, qu'en pensez vous ?
Si vous avez une proposition pour la recherche, je suis preneur !!
Cordialement,
Lunick
totodunet
Messages postés
1377
Date d'inscription
mercredi 18 mars 2009
Statut
Membre
Dernière intervention
5 mars 2020
199
Modifié par totodunet le 31/07/2014 à 22:06
Modifié par totodunet le 31/07/2014 à 22:06
bonsoir,
N'ayant pas le schéma de ta BDD sous les yeux j'ai un peu dû mal à comprendre. Mais pour ce qui concerne le problème des doublons, tu peux utiliser la clause DISTINCT juste après le SELECT dans ta requête :
mais si tu trouves ta BDD mal faîte, il est conseillé de changer sa structure à la simplicité avant de faire des opérations de requête dessus. sinon plusieurs tables peuvent avoir des attributs similaires, ce n'est pas ça qui montre un problème de conception.
Qui ne tente rien n'a rien
N'ayant pas le schéma de ta BDD sous les yeux j'ai un peu dû mal à comprendre. Mais pour ce qui concerne le problème des doublons, tu peux utiliser la clause DISTINCT juste après le SELECT dans ta requête :
$req = $bdd->prepare("SELECT DISTINCT * FROM motrice WHERE att1 like :recherche");
mais si tu trouves ta BDD mal faîte, il est conseillé de changer sa structure à la simplicité avant de faire des opérations de requête dessus. sinon plusieurs tables peuvent avoir des attributs similaires, ce n'est pas ça qui montre un problème de conception.
Qui ne tente rien n'a rien
lunick90
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014
31 juil. 2014 à 22:35
31 juil. 2014 à 22:35
Bonsoir,
j'avais cette clause DISTINCT lorsque j'ai vu que j'avais des doublons, mais ça n'avait rien changé !
Donc finalement, j'ai séparé ma requête initiale en autant de requêtes que de table ! Le code est lourd, et redondant, mais je travaille actuellement à le rendre plus souple (en créent des fonctions ou à simplifier des opérations).
Je peux vous transmettre ma base de données par message, si vous le souhaitez...
Cordialement
bonne soirée/nuit
Lunick
j'avais cette clause DISTINCT lorsque j'ai vu que j'avais des doublons, mais ça n'avait rien changé !
Donc finalement, j'ai séparé ma requête initiale en autant de requêtes que de table ! Le code est lourd, et redondant, mais je travaille actuellement à le rendre plus souple (en créent des fonctions ou à simplifier des opérations).
Je peux vous transmettre ma base de données par message, si vous le souhaitez...
Cordialement
bonne soirée/nuit
Lunick