Ouvrir une connexion d'une base de données en pph [Résolu/Fermé]

Signaler
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014
-
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014
-
Bonsoir à toutes et à tous,
je crée actuellement une petite application personnelle en php. Comme j'ai besoin d'une base de donnée, j'utilise phpmyadmin avec mon serveur local.
Je suis passé sur pas mal de forum pour essayer de résoudre mon problème seul, mais en vain...
Alors voilà :
J'ai créé manuellement cette base de données (menu de phpmyadmin, créer une nouvelle base, créer une table, ajouter des attributs...).
J'aimerai pouvoir ajouter des valeur à la table de ma base de donnée (j'aurai plus tard d'autre table, mais avant, je construis ma première page pour me permettre de ne pas avoir toujours la même erreur) à l'aide du formulaire créer (en php).
J'ai une erreur au niveau de la connexion à ma base de donnée. Voici ce que j'ai fait :

page bibliotheque.php (là ou je mets mes fonctions communes à toutes mes pages)

// Adresse sur le réseau du serveur MySQL
define('serveur', 'localhost');
// Nom d'utilisateur du serveur MySQL
define('user', 'localhost_root');
// Mot de passe de l'utilisateur MySQL
define('pwd', 'localhost_pwd');
// Nom de la BD dans le serveur MySQL
define('name', 'localhost_nom_bd');

function connexion(){
$c = mysqli_connect($serveur, $user, $pwd, $name) or erreur('Connexion au serveur de BD');
return $c;
}

et dans la page de mon formulaire j'ai :

connexion();

Est ce que la façon de procéder à la connexion est bonne ?

Merci d'éclairer ma lanterne...

Cordialement,

Lunick

13 réponses

Messages postés
49
Date d'inscription
vendredi 11 juillet 2014
Statut
Membre
Dernière intervention
6 août 2014
10
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 :
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
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
49
Date d'inscription
vendredi 11 juillet 2014
Statut
Membre
Dernière intervention
6 août 2014
10
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 :

$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.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
49
Date d'inscription
vendredi 11 juillet 2014
Statut
Membre
Dernière intervention
6 août 2014
10
Pour les requêtes sans paramètres, il faut utiliser query :

$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 ;)
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014

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
$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
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014

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
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
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014

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 :
$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
Messages postés
49
Date d'inscription
vendredi 11 juillet 2014
Statut
Membre
Dernière intervention
6 août 2014
10
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 :

= $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'];
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014

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
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014

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 :
$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
Messages postés
49
Date d'inscription
vendredi 11 juillet 2014
Statut
Membre
Dernière intervention
6 août 2014
10
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)
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014

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
Messages postés
1377
Date d'inscription
mercredi 18 mars 2009
Statut
Membre
Dernière intervention
5 mars 2020
187
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 :

$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
Messages postés
21
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
5 août 2014

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