Communication avec une base de donnée MySQL

Répondre
Partager Rechercher
Salut à tous !

Après bien des années , je reviens coder un peu pour aider un amis dans le besoin. Malheureusement , je ne suis plus à la page sur pas mal de choses et je vais avoir besoin de votre aide pour une petite remise à niveau.

Je souhaite stocker l'url d'un prim ( serveur ) de SL sur base de donnée externe MySQL via un page PHP.

Les morceaux de code que j'ai date d'il y à 10 ans et je n'arrive pas à me connecter à ma base de donnée.

Prim Serveur (RequestURL -> envoie sur page php pour stockage -> lecture du retour via un debug)



Code PHP:


string sUrl 
"http://blablabla.no-ip-org"
string sUrlServer;
string sLastUrlServer;
key kRequest;
integer sSilence FALSE;
integer iDebug TRUE;

gRefresh()
{
    
llRequestURL();
}

default
{
    
state_entry()
    {
        
gRefresh();  
    }
    
http_request(key idstring methodstring body)
    {
        if(
method == URL_REQUEST_GRANTED)
        {
            
sUrlServer body;
            
kRequest llHTTPRequest(sUrl,[HTTP_METHOD,"POST",HTTP_MIMETYPE,"application/x-www-form-urlencoded"],"req=enregistrer&prod="+llGetObjectName()+"&vers="+sUrlServer);
            
            if(
sLastUrlServer != sUrlServer)
            {
                
sLastUrlServer sUrlServer;
                if(!
sSilencellOwnerSay("URL Prim Server: "+sUrlServer);
            }
        }
        else if (
method == "GET")
        {
            
llOwnerSay(llGetObjectName()+": Connection externe http bloqué par le serveur.");
            
llHTTPResponse(id,200,"Vous avez pas le droit d acceder à se server via une page http.");
        }
        else
        {
            
llOwnerSay(llGetObjectName()+": erreur");
        }
    }
    
http_response(key request_idinteger status, list metadatastring body)
    {
        if(
request_id == kRequest)
        {
            if(
iDebugllOwnerSay("Key Request: "+(string)request_id+"\n"+
                                
"Status: "+(string)status+"\n"+
                                
"List Metadata: "+llList2CSV(metadata)+"\n"+
                                
"Reponse: "+body);
        }
    }
}
&
#8203; 

Page PHP ( connexion à la base de donnée puis à la table --> lecture de la commande puis enregistre ou met à jour l'url du serveur -- variable $out pour un message de retour)


Code PHP:

<?php 

    
/*
    *        Cours de script Expert
    *
    *    Stockage de données sur un serveur web.
    *
    *
    *
    */
    /////// 
    // Fonction de vérification d'un champ d'entrée de la page methode POST

    
function verification$champ )
    {
        if( isset( 
$_POST[$champ] ) )
            return 
$_POST[$champ];
        else
            return 
null;
    }
    
///////
 
    // Définition du message d'erreur
    
$msgerr "erreur";
    
$msgerr1 "erreur de connexion à la base de donnée";
    
$msgerr2 "erreur de connexion à la table";
 
    
//* Définition du message de sortie
 
    
$out "";
 
    
// Connexion à la base de données
 
    
$link mysqli_connect'localhost' ,'Admin','MDP','NomDB' );
 
    if(!
$link)
      die (
$msgerr1);
    
    
$dbselected mysqli_select_db($link,'NomTable');
 
    if(!
$dbselected)
      die (
$msgerr2);
 
    
// Chevron de sécurité
 
    
$out .= " <!>";
 
    
// Récupération du type de la requete

    
$req verification('req');
 
    
// Récupération du nom du produit
    
$prod verification('prod');

    
// Récupération de la version du produit
    
$vers verification('vers');

    
// Requete d'enregistrement d'une version ( "req=enregistrer&prod="+llGetObjectName()+"&vers="+sUrlServer )

    
if( $req == "enregistrer" && $prod != null && $vers != null )

    {

        echo 
'enregistrement';

        
// Test d'existence du produit

        
$res mysqli_query(" SELECT * FROM versions WHERE produit='".$prod."' ; ");

        
$nb mysqli_num_rows($res);

        
// Si le produit existe on met a jour sinon on insert.

        
if( $nb 

            
mysqli_query(" UPDATE versions SET version='".$vers."' WHERE produit='".$prod."' ; ");

        else

            
mysqli_query(" INSERT INTO versions VALUES ('".$prod."','".$vers."') ; ");

        
$out .= "OK";

    }

    else

        
$out .= $msgerr;

    
// Chevron de sécurité

    
$out .= "<!>";

    
// Sortie du script

    
echo $out;

    
// Deconnexion de la base de données

    
mysqli_close();

?>

Actuellement , je n'arrive pas à me connecter à la base de donnée . Message d'erreur : "erreur de connexion à la base de donnée"


Mon Serveur est un raspberry pi 3 B+ sous raspbian à jour


Version:

  • Apache/2.4.25 (Raspbian)
  • Version du client de base de données : libmysql - mysqlnd 5.0.12-dev - 20150407 - $Id:***********************************
  • Extension PHP : mysqlidot.gif curldot.gif mbstringdot.gif
  • Version de PHP : 7.0.27-0+deb9u1

Merci d'avance pour toutes aides sur ce sujet !

Dernière modification par RLP Ghost ; 27/05/2018 à 09h32.
Le message " "erreur de connexion à la base de donnée""
qui t es retourné vient de la page PHP , par la ligne PHP

$msgerr1 = "erreur de connexion à la base de donnée";
....
$link = mysqli_connect( 'localhost' ,'Admin','MDP','NomDB' );
if(!$link)
die ($msgerr1)



Donc la connexion web semble fonctionner .
Et ton problème est un problème d identification à ta base de données .

Une première piste à vérifier est d abord de vérifier les identifiants de connexion utilisés par ta page PHP
qui sont renseignés en paramètres de la fonction
à la ligne :
$link = mysqli_connect( 'localhost' ,'Admin','MDP','NomDB' );

1) le paramètre avec la valeur "localhost" présume que ton serveur php est sur la même machine que la machine sur laquelle se trouve ton serveur mysql .
Si ce n est pas le cas , change le dans la page PHP

2) le paramètre avec la valeur "NomDB"présume que une des bases de données que disposent ton serveur mysql s appelle "NomDB"
Pour le vérifier , va sur la machine où se trouve ton serveur mysql , en ouvrant une console en ligne de commandes
Connecte toi en en tapant la commande :

mysql -u root -p

On t affichera :

Enter password:

Tape ton mot de passe si tu en as renseigné un créant ton serveur mysql (ou la touche entrée si tu n as pas voulu le renseigner )


On t affichera
Welcome to the MySQL monitor. Commands end with ;
( du blabla pui le prompt )
mysql>

tape la commande

show databases;

On t affichera

+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |

| madatabaseperso |
etc ....

Les 3 bases de données information_schema , mysql, performance_schema sont plutôt des bases de données pour le fonctionnement interne de mysql .
Regarde donc les autres noms de base de données :
Regarde si le nom de ta base de donnée y est et te semble familier .
Puis édite ta page PHP avec ce nom
par exemple si ta base de données est "madatabaseperso" , tu rechangeras
ta page PHP par

$link = mysqli_connect( 'localhost' ,'Admin','MDP','madatabaseperso' );

3) le paramètre avec la valeur "Admin" et "MDP" présume que un utilisateur nommé "Admin" existe et que son mot de passe est "MDP"

Pour le vérifier , va sur la machine où se trouve ton serveur mysql , en ouvrant une console en ligne de commandes
Connecte toi en en tapant la commande :

mysql -u root -p

On t affichera :

Enter password:

Tape ton mot de passe si tu en as renseigné un créant ton serveur mysql (ou la touche entrée si tu n as pas voulu le renseigner )


On t affichera
Welcome to the MySQL monitor. Commands end with ;
( du blabla pui le prompt )
mysql>

tape la commande


select user, host, password from mysql.user;

On t affichera par exemple

+------------------+--------------+--------------+
| user | host | password |
+------------------+--------------+--------------+
| root | localhost | 37as%#8123fs |
| debian-test-user | localhost | HmBEqPjC5Y |
| johnsm | localhost | |
| adrianr | 10.11.12.13 | RFsgY6aiVg |

Les mots de passe sont cryptés, mais si ils ne sont pas renseignés , comme par exemple dans la ligne "johnsm" , cela veut dire que
tu n as pas besoin de renseigner le mot de passe das ta page PHP pour te connecter à la base de données

Modifie ta page PHP en conséquence .Dans l exemple ci dessus , si ton utilisateur est en fait johnsm modifie ta page PHP en ramplacant cette ligne et en laissant vide le 3ème paramètre réservé pour le mot de passe:

$link = mysqli_connect( 'localhost' ,'johnsm','','madatabaseperso' );

La colonne host a aussi son importance : pour le cas de "adrianr" ci dessus , cela veut dire que e serveur mysql n acceptera que des connections d un utilisateur nommé "adriansr" mais se connectant avec ce nom ou cette adresse IP


Modifie ta page PHP en conséquence . Dans l exemple ci dessus , si ton utilisateur est en fait adrianr modifie ta page PHP pour remplacer "Admin" par "adriansr" et "localhost" par "10.11.12.13"

$link = mysqli_connect( '10.11.12.13' ,'adriansr','','madatabaseperso' );



Tout ceci peut se faire aussi plus simplement si tu as dans ton ensemble serveur php / serveur www / serveur mysql d autre packeges du style phpmyadmin ou admirer ( https://www.adminer.org/en/phpmyadmin/ ) ou sdlbuddy ou autres qui fournissent une page web uniquement accessible en local sur ta machine et qui peut administrer les utilisateurs et les bases de données de ton serveur mysql


D autre part , , c est HS puisque ton problème est un problème de connexion , mais comme cela reste dans le cadre des permissions d utilisateurs de base de données
ta page PHP fait plus tard après la connexion un "select" , un "update", et un "insert .
Il faudra donc vérifier que ton utilisateur de base de données peut éxécuter ce type d ordres ordres/commandes SQL

Tu peux taper la commande mysql :

SELECT User, Host, Password ,select_priv, insert_priv, update_priv FROM mysql.user;

qui t affichera les utilisateurs pouvant répondre à ce critère .

Si ta page PHP ne faisait que plusieyrs ordres "select" , un utilistauer qui dans la colonne select_priv a la valeur "Yes" , et "No" dans les colonnes "insert_priv" et "update_priv " pourrait répondr eà cet autre critère


4) si malgré tout cela , tu ne te rappelles pas de tes identifiants de connexion , c est raté .
Tu peux éventuellement créer un autre utilisateur de base de donnée avec son mot de passe et ses permissions ("grants" )

Dans mysql
tapes la commande

CREATE USER 'tartanpion'@'localhost';

Cela créera l utilisateur de base de données mysql avec le nom "tartampion" se connectant à partir de la machine "localhost"

Puis donne les permissions à cet utilisateur

Dans ton cas , ta page PHP ne fait que des insert , des selects et des update

GRANT SELECT, INSERT , UPDATE ON mabasededonnesperso.* TO 'tartampion'@'localhost' IDENTIFIED BY 'HmBEqPjC5Y ';


Ce qui veut dire "donne les permission de select , insert , update sur toutes les tables ( à cause du ".*" ) de la base de données nommée "mabasededonnesperso" à l utilisateur nommé "tartampion" et qui se connecte avec le mot de passe "HmBEqPjC5Y "


Si tu fais une autre page PHP avec des ordres "delete", il te faudra faire la même commande mais avec cette fois ci , en rajoutant les permissions de "delete"
GRANT SELECT, INSERT , UPDATE ON mabasededonnesperso.* TO 'tartampion'@'localhost' IDENTIFIED BY 'HmBEqPjC5Y ';

en supposant que ta ligne dans ta page PHP se connecte par
$link = mysqli_connect( 'localhost' ,'tartampion','HmBEqPjC5Y ','mabasededonnesperso' )

Si tu veux créer un utilisateur ayant toutes les permissions sur ta base de données ( donc y compris créer des tables et les droper )
GRANT ALL ON mabasededonnesperso.* TO 'tartampion'@'localhost' IDENTIFIED BY 'HmBEqPjC5Y ';
C est mieux de limiter au juste nécessaire plutôt que de donner toutes les permissions

Tu peux voir la syntaxe sur le site officiel de mysql à cette page , pour d autres permissions que tu voudrais rajouter au besoin
https://dev.mysql.com/doc/refman/8.0/en/grant.html

5) si tu as besoin de créer une autre base de données alors tu saisis dans mysql


CREATE DATABASE mabasededonnesperso;

Il va falloir aussi activer ta base de données par la commande

USE mabasededonnesperso;

Si tu oublies la commande USE , la base de données n est pas accessible


6) si tu te rappelles de tes identifiants de connexion, qu ils sont correct et en phase avec ceux de ta page PHP ( nom de la base de donnée , nom ou IP de la machine , nom d utilisateur ), mais que tu as oublié ton mot de passe alors tu peux rechanger le mot de passe :

update mysql.user set authentication_string=password('NEWPASSWORD') where user='tartampion';
flush privileges;

dans l exmple où l utilisateur se connectant à mysql et existant dans la base de données , et que tu as renseigné dans ta page PHP s appelle tartanmpion

7) il est possible , je ne sais pas si c est ton cas , que tu lances ton serveur mysql avec un fichier d options ( des fichiers .ini , ou des fichiers .cnf ) . Ce fichier d options peut aussi rassembler des identifiants de connexion. Si c est le cas , cela peut t aider peut être à retrouver tes identifiants de connexion et de changer ta page PHP en rapport avec ceux ci . Il te faudra jouer avec le programme
musql_config_editor

Dernière modification par redpurple ; 24/05/2018 à 02h28.
Merci pour toutes ses précisions.

Donc en effet , mon raspberry héberge l'intégralité des serveurs ( Apache2 , php et MySQL ) d'ou l'utilisation du 'localhost' dans ma ligne de commande de connexion à la base de données.
Pour me faciliter la tache avec MySQL , j'ai installé PHPMyAdmin pour l'interface de gestion graphique ( sans ça j'aurai été perdu d'avance vu mon niveau... )

Dans un premier temps je constate un problème avec la ligne de commande mysql -u root -p

a4c358848d679aabf73059067b3d4a10.png


On peut voir qu'après avoir entrer le mot de passe que le raspberry répond: Welcome to MariaDB monitor

Aurai-je 2 programmes de base de données avec une préférence orienté sur celui-ci ?

Dernière modification par RLP Ghost ; 27/05/2018 à 09h34.
La commande est "show databases;" ( avec le point virgule à la fin comme toute commande )

Tu as tapé "show databses" donc avec une faute de frappe .

Mais puisque tu as phpmyadmin , va plutôt sur phpmyadmin , normalement tu as la liste des bases de données
Dans le tableau de gauche tu dois avoir toute la liste de bases de données
Sélectionne la bonne base de donnée , va dans le panneau de droite et clique sur l onglet privilèges, dans le menu du haut de la page
Il va s afficher la liste des utilisateurs ayant certains droits ( ou privilèges ) sur ta base de données .
Sous dorme d un tableau avec les colonnes :

Utilisateur Client Type Privilèges «Grant» Action


Regarde si un utilisateur ( qui ne soit pas root ) a un accès en select , insert , update ,delete , dans la colonne "Privilèges" et dont la colonne "Grant" vaut "Yes" , "oui" ou "True" ( suivant ta version de phpmyadmin)



MariaDB est une version dérivée de MySQL. Je ne connais pas davantage . Probablement leurs développeurs ont gardé les mêmes noms de mysql pour les programmes de commande mais ont changé le nom d affichage.

Dernière modification par redpurple ; 27/05/2018 à 07h33.
Suite à toutes ses explications , j'ai recontrôlé et j'ai trouvé mon erreur.

Mon problème de connexion à la base de donnée venait d'une faute de frappe entre le code de ma page PHP et le nom d’appellation de ma base...

J'en ai profité pour contrôler que l'utilisateur de la base de donnée possède bien tous les privilèges:


c8ae6ac594978ed14cf3884759593080.png



Mais bon , je n'ai pas complètement solutionné mon souci

Maintenant , il me retourne le message de la variable $msgerr2 = "erreur de connexion à la table";

Code PHP:

$dbselected mysqli_select_db($link ,'NomTable');

    if(!
$dbselected)
    die (
$msgerr2); 

Image console raspberry:

419b310abdbc4daec1aa980e015de5c9.png

Image du panneau de la database sur PHPMyAdmin:

18119b9dfa7b51cbe682aa46ce8f1706.png


Je pense que je me trompe sur la façon de sélectionner la table.

Dernière modification par RLP Ghost ; 27/05/2018 à 10h00.
Bonjour,

La fonction mysqli_select_db sert à changer la base de données par défaut pour la connexion courante, le deuxième paramètre est le nom de la base, pas celui d'une table.

Tu gagnerais peut-être du temps en utilisant un framework, même léger pour simplifier la syntaxe.
Salut bestmomo ( Merci encore pour les guides que tu as put faire à l’époque , c'est un peu grâce à toi que j'ai commencer à coder le LSL )

Donc je suis à coté de la plaque avec la fonction que j'utilise pour sélectionner ma table.
Je ne vois pas de quoi tu parle en terme de framework. Pourrais-tu m'orienter ?



Bon sinon enfin , je suis parvenu à enregistrer des informations dans ma table , plusieurs erreurs de code:

Toute la partie du code avec mysqli_select_db qui servait à rien sauf à me (die) mon script php.
La fonction mysqli_query où je ne rappelais pas la variable de connexion à la database $link

Code PHP:

// Test d'existence du produit 

        
$res mysqli_query($link," SELECT * FROM NomTable WHERE version='".$prod."' ; ");

        
$nb mysqli_num_rows($res);

        

        
// Si le produit existe on met a jour sinon on insert.

        
if( $nb 
    {
            
mysqli_query($link," UPDATE NomTable SET produit='".$vers."' WHERE version='".$prod."' ; ");
        
$out .= "Update";
    }
        else
        {
            
mysqli_query($link," INSERT INTO NomTable VALUES ('".$prod."','".$vers."') ; ");
        
$out .= "Add";
    } 
je viens aussi de me rendre compte que les colonnes de ma table ( NomTable ) n’était pas bien construite sur leur nom d’appellation ( produit , version )
j'ai encore des améliorations de format à faire car produit='".$vers."' et version='".$prod."' , c'est inversé.

fa32769c386982a23aa17f0a8de5abae.png

Maintenant , j'ai une base de code qui va me permettre d'avancer sur mon projet. Je reviendrai certainement vous poser quelque question pour la suite.

Merci pour tous

Dernière modification par RLP Ghost ; 27/05/2018 à 11h15.
En ce qui concerne les frameworks PHP c'est juste pour se simplifier la vie et éviter du codage de bas niveau. Personnellement pour les API j'utilise Lumen qui possède de bons outils de gestion de bases de données, en particulier l'ORM Eloquent.
Citation :
Publié par bestmomo
En ce qui concerne les frameworks PHP c'est juste pour se simplifier la vie et éviter du codage de bas niveau. Personnellement pour les API j'utilise Lumen qui possède de bons outils de gestion de bases de données, en particulier l'ORM Eloquent.
Je vois que tu t'es encore perfectionné en "parlé chinois" cher Best...
Citation :
Publié par anpton
Je vois que tu t'es encore perfectionné en "parlé chinois" cher Best...
La réponse s'adresse à quelqu'un qui est dans le coup mon cher Anpton

Mais je peux publier une traduction si nécessaire ...
Mmoui .. Passer par un framework pourquoi pas . Ceci dit je doute que la taille des tables soit si grosse ou que la base de donnée soit si complexe . Apparemment il n y a qu une seule table qui ne devrait même pas être très volumineuse et seulement 2 ou 3 colonnes

Peut etre même qu une page PHP qui decode un fichier texte CSV ou un fichier texte Json aurait pu suffire sans avoir besoin d utiliser une base de données.
Si la taille des données ne fait que quelques centaines de kilo octets c est peut etre plus pratique sans avoir de ralentissement de la page
Vous avez complètement raison.
Mon manque de connaissance m'oblige certainement à passer par ce système de stockage d'information pas forcement nécessaire au fonctionnement de mon produit final.

Comme on dit système D.

La magie du script , c'est toujours de contourner les problèmes par une autre façon de coder.

L'optimisation est dans la maîtrise des différents langages.

Le LSL , je peux encore faire un effort par le nombre d'années où j'ai coder grâce à vous ( Ahuri , Lancelot (Magic Cat ) , Bestmomo )
mais le PHP et le MySQL sont comme pour moi du chinois
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés