Problème de base de donnée

Résolu/Fermé
Abdl85 Messages postés 18 Date d'inscription jeudi 28 novembre 2019 Statut Membre Dernière intervention 31 mai 2022 - 28 févr. 2020 à 21:31
Abdl85 Messages postés 18 Date d'inscription jeudi 28 novembre 2019 Statut Membre Dernière intervention 31 mai 2022 - 30 mai 2020 à 05:03
Salut à tous! Je suis en train de programmer directement sur mon site distant c'est-à dire le site est déjà en ligne. Je voulais créer une page de connexion à la base de donnée msql. Comme je ne travaille pas en Local comment insérer le nom du serveur dans le code.

3 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
28 févr. 2020 à 22:15
Bonjour,

De la même façon que tu mets tes autres codes....
Via FTP.

Pour ce qui est du nom d'hôte... il faut utiliser celui fourni par ton hébergeur.

1
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
9 avril 2020 à 00:52
Bonsoir,

Pour ma part, j'ai toujours un fichier init.php (ci-dessous) et les deux premières lignes de mes pages web commencent toutes par

<?php
require('init.php');
...
?>
<html>
...


Dès lors, je suis systématiquement connecté à ma BDD que j'interroge ainsi :

$requete = "SELECT ... FROM ... WHERE ... [etc.] ...;";
$resultat = ExecRequete($requete,$connexion);

while($r = mysql_fetch_object($resultat)) {
	// Instructions. Ex:
	// $nom = $r->nom;
	// $prenom = $r->prenom;
	// $dnaiss = cvdate($r->dnaiss,'-'); // cvdate() dans init.php
	// etc...
}


NB: Si exceptionnellement une page n'avait pas besoin d'accéder à la BDD ni avoir besoin des variables et fonctions incluses dans init.php, la ligne 2 : require() pourrait être commentée.

Si je voulais traiter les différentes erreurs possibles

$resultat = ExecRequete($requete,$connexion,1); // ... ,1
switch ($mysqlerr) { // $mysqlerr dans init.php
	case 1049 : /* instructions pour base inexistante */ break;
	case 1146 : /* instructions pour table inexistante */ break;
	case .... : /* instructions selon le cas */ break;
}


Tu rédiges tes scripts tels quels sur ta machine locale puis tu les transfères par FTP sur ton hébergement.

Attention pour le nom du serveur. Il dépend de ton hébergeur. Pourquoi ?

Parce que celui qui crée la base de données (totobase) donne accès à un utilisateur (toto) de cette façon :
- soit à partir de n'importe où :
GRANT ALL PRIVILEGES ON totobase.* TO 'toto' IDENTIFIED BY ('mot-de-passe'); // ou
GRANT ALL PRIVILEGES ON totobase.* TO 'toto'@'%' IDENTIFIED BY ('mot-de-passe'); // en mysql, % = n'importe quoi, n'importe où

- soit à partir d'une machine donnée. Sur la machine 157.12.28.104 accès à la BDD ; sur une autre, non.
GRANT ALL PRIVILEGES ON totobase.* TO 'toto'@'157.12.28.104' IDENTIFIED BY ('mot-de-passe');

- soit à partir de la machine qui héberge le serveur de BDD :
GRANT ALL PRIVILEGES ON totobase.* TO 'toto'@'localhost' IDENTIFIED BY ('mot-de-passe'); // ou
GRANT ALL PRIVILEGES ON totobase.* TO 'toto'@'127.0.0.1' IDENTIFIED BY ('mot-de-passe'); // 127.0.0.1 = localhost


A partir de n'importe où :
Cela veut dire que tu peux accéder à distance à ta BDD. Si tu as par exemple sur TA machine locale, à la maison, un programme client mysql DOS, tu peux très bien, sans aller sur le serveur, taper dans l'interface DOS (commande 'cmd') la commande :
mysql --host=159.162.21.214 --user=toto --password=mot-de-passe --execute="SELECT ... FROM totobase.matable ... WHERE ...;"


A partir d'une machine donnée :

Tu ne pourras taper la commande ci-dessus seulement qu'à partir de la machine 157.12.28.104

A partir de la machine qui héberge le serveur de BDD :
L'exécuteur de la commande (personne physique connectée en SSH ou un script déposé sur le serveur) doit être SUR le serveur qui ne sera reconnu que par 'localhost' ou '127.0.0.1'
Dans ce cas là, dans init.php ci-dessous, la définition de serveur : define("SERVER", "..."); doit être soit 'localhost' soit '127.0.0.1' mais pas le numéro de la machine elle-même.

<?php
// Fichier init.php

// ---------- Infos de connexion à la BDD sur le serveur
define ("NOM",           "username"); // Nom de l'utilisateur mysql
define ("PASS",            "xxxxxx"); // Mot de passe
define ("SERVER", "111.222.333.444"); // IP ou nom FQDN ou localhost
define ("BASE",          "basename"); // Nom de la base

// Affiche un éventuel message d'erreur et stopppe tout.
function showError($error,$sql) {
   $cnx = $GLOBALS["connexion"];
   if($error == 1) { echo "Serveur indisponible !"; }
   if($error == 2) { echo "Base de données indisponible !";    }
   if($error == 3) { echo "Erreur dans la requête !<br/>".mysql_error($cnx)."<br/>$sql"; }
   exit;
}

// Exécute une requête et retourne son résultat ou un message d'erreur
// $re = 0|1 : 1=retourne le numéro d'erreur dans une variable (à traiter)
function ExecRequete($request,$connexion,$re=0) {
   global $mysqlerr;
   $result = mysql_query($request,$connexion);
   if($result) { return $result; }
   else {
		if($re) {
			$mysqlerr = mysql_errno();
			return;
		}
		showError(3,$request);
   }
}

// Effectue la connexion au serveur de BDD puis sélectionne la BDD
if(!@$connexion = mysql_pconnect(SERVER,NOM,PASS)) { showError(1); }
if(!@$ok = mysql_select_db(BASE,$connexion))       { showError(2); }

// ---------- Autres définitions
$mysqlerr = 0; dernière erreur mysql. Pour éventuel traitement
// ...
// ...
// Autres définitions de variables et de fonctions utiles en permanence
// - date mysql -> date fr, date fr -> date mysql
// - écriture du/des menu(s)
// - etc.
// Si une fonction est très féquemment utilisée dans l'application : incluse dans init.php
// Si une fonction est rarement utilisée dans l'application : incluse dans la page concernée
// Exemples :
// ===== Fonction de conversion de date
// $d = date à mettre en forme
// $sep = séparateur ('-' ou '/')
// si $sep = '-' => date = AAAA-MM-JJ. On veut donc du JJ/MM/AAAA
// si $sep = '/' => date = JJ/MM/AAAA. On veut donc du AAAA-MM-JJ
function cvdate($d,$sep) {
	$td = explode($sep, $d);
	switch ($sep) {
		case '-' : return $td[2]."/".$td[1]."/".$td[0]; break;
		case '/' : return $td[2]."-".$td[1]."-".$td[0]; break;
	}
}
// etc...
?>


Voilà. J'espère t'avoir été utile.
1
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
9 avril 2020 à 07:43
Bonjour
Depuis le 28 février... J'espère qu'il a déjà résolu son souci.

Je note également que tu es en retard aussi sur la librairie mysql.
Il serait temps de passer à PDO ou mysqli.
:-)
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137 > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
9 avril 2020 à 13:37
Je l'espère aussi pour lui, mais je ne l'ai vu qu'hier. C'était plus pour donner une manière de travailler que résoudre le problème qui est probablement aujourd'hui résolu, quoiqu'il n'ait pas été marqué comme résolu.

Tu as raison, je devrais passer à PDO ou mysqli mais je n'arrive pas à m'y faire. je ne trouve pas de doc suffisamment claire expliquant la philosophie de ces interfaces ni des exemples pertinents. C'est comme les classes d'objets PHP, je suis toujours à l'ancienne méthode. Pas de fonction __construct(), le constructor, c'est la fonction qui porte le nom de la classe ; pas de fonctions public ou private. etc...

Je vois des trucs : "faites comme ça, tapez ceci..." mais aucune explication du pourquoi et je ne retiens pas si je ne comprends pas pourquoi.

Faudrait que je me botte les fesses, mais bon... je procrastine sur ce plan...
En tout cas, merci de me le rappeler. Ce serait pourtant le temps en ce moment avec le confinement. J'aurais le temps ; reste à trouver la motivation...

Bonne continuation à toi.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023
9 avril 2020 à 13:50
La meilleur motivation que je puisse te donner c'est que c'est obsolète. (que ce soit l'extension mysql_* ou les classes telles que tu les écris .. )
Depuis PHP >7 ton code ne fonctionne plus.
Sachant que php7 et au moins 3 fois plus performant que le php5 ...et qu'il ne sera bientôt plus disponible chez les hébergeurs web...

Bonne après midi à toi.
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137 > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
9 avril 2020 à 18:50
P...tain ! Tu me fous le moral à plat ! Déjà qu'il y a le confinement, ça en plus, c'est le pompon sur le gâteau ou la cerise sur le bouquet, au choix ! Bon, trêve de plaisanterie, il va donc falloir que je m'y mette...
Entre PDO et mysqli, tu me conseillerais quoi, plutôt et pourquoi ?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023
9 avril 2020 à 20:23
Personnellement j'ai une net préférence pour PDO.
Mysqli est strictement réservé aux bdd mysql alors que PDO est compatible avec plusieurs SGBD.
0
Abdl85 Messages postés 18 Date d'inscription jeudi 28 novembre 2019 Statut Membre Dernière intervention 31 mai 2022
30 mai 2020 à 05:03
Merci pour votre aide.
0