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
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
A voir également:

13 réponses

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

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
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
0
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
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
0
CookieSpirit Messages postés 49 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
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'];
0
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
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
0
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
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
0
CookieSpirit Messages postés 49 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 6 août 2014 12
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)
0
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
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
0
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
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
0
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
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
0