Annonce

Lorsque vous exposez un problème que vous rencontrez sur votre site, n’omettez pas de bien préciser l’adresse de la page (URL) concernée.

Ouvrez un nouveau sujet de discussion pour poser une question, n'utilisez pas une discussion déjà ouverte si votre problème est différent.
Lorsque votre sujet est résolu, indiquez-le en cliquant sur le lien "Passer le sujet en résolu".

Pour les possesseurs de sites Minecraft : Tous les ports TCP/UDP en sortie sont ouverts.
Pour en savoir plus : https://www.franceserv.fr/wiki/minecraft

#1 Re : Développement » [Résolu] Requête préparées » 26/09/2020 17:16:17

Encore une fois merci.
Je ne voyais pas ce détail et je tournais en rond.
J'avais aussi utilisé $_GET au lieu de $_POST
Cordialement

#2 Développement » [Résolu] Requête préparées » 26/09/2020 17:16:17

philippe40
Réponses : 3

Bonjour,

J'ai créé une requête préparée insert qui ne fonctionne pas :
   try {          
                 $connexion = new PDO('mysql:host='.$host.';dbname='.$base, $user, $pass);
                 $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                
                 $prepared = $connexion->prepare
                 (
                 "INSERT INTO wp3_achats (id,code_article, product_name,createdon,qt,pa,latitude,longitude,id_magasin,utilisateur )           
                    VALUES
                  (
                     :id ,
                     :codearticle ,               
                     :created ,
                     :qt  ,
                     :pa ,
                     :latitude ,
                     :longitude ,
                     :idmagasin ,
                     :utilisateur
                    )"
                 );
                       
                $prepared->bindParam(':id'         , $_GET['id']);       
            $prepared->bindParam(':codearticle', $_GET['code_article']);
                $prepared->bindParam(':created',     $_GET['createdon']);       
                $prepared->bindParam(':qt',          $_GET['qt']);       
                $prepared->bindParam(':pa',          $_GET['pa']);       
                $prepared->bindParam(':latitude',    $_GET['latitude']);       
                $prepared->bindParam(':longitude',   $_GET['longitude']);
                $prepared->bindParam(':idmagasin',   $_GET['id_magasin']);
                $prepared->bindParam(':utilisateur', $_GET['utilisateur']);                      
                                       
                $prepared->execute();
                                                                              
         }
               
  catch(PDOException $x) { die("Secured"); }

        $prepared   = null;
        $connection = null;

Malgré tous mes essais, elle ne fonctionne pas.

J'ai une requête équivalente en injection directe qui fonctionne 

   try {          
                 $dbh = new PDO('mysql:host='.$host.';dbname='.$base, $user, $pass);
                                 
                 $sql = "INSERT INTO wp3_achats (id,code_article,createdon,qt,pa,latitude,longitude,id_magasin,utilisateur)
                         VALUES
                         (
                         '$_POST[id]'           ,
                         '$_POST[code_article]' ,                       
                         '$_POST[createdon]'    ,
                             '$_POST[qt]'           ,
                         '$_POST[pa]'           ,
                         '$_POST[latitude]'     ,
                         '$_POST[longitude]'    ,                        
                         '$_POST[id_magasin]'   ,
                         '$_POST[utilisateur]'   
                         )";
                        
                   if ($dbh->query($sql) === TRUE) {  echo "New record created successfully";}
                  
                   else
                  {
                      echo "Error: " . $sql . "<br>" . $dbh->error;                                       
                  }                
                }
            catch (PDOException $error) {die("Erreur de connexion : " . $error->getMessage() );}           

            $dbh->close();

Pouvez-vous m'aider ?

Cordialement
Philippe

#3 Re : Développement » [Résolu] Test d'intégration de données dans ma base de données » 25/09/2020 12:15:56

Bonjour,
J'ai suivi vos conseils et utilisé la requête que vous m'avez conseillé.
Le fait d'utiliser une requête préparée semble mieux fonctionner
Merci
Cordialement
Philippe

#4 Re : Développement » [Résolu] Test d'intégration de données dans ma base de données » 25/09/2020 12:15:56

Merci  pour votre réponse.

Le fait que vous ne voyez pas mes scripts est à cause du fait que je teste sur mon environnement de test en local pour voir les log erreurs. c'est beaucoup + facile pour moi.

testexistligne.php est une invention. Le fichier PHP est en réalité testachats.php (mal nommé car il s'agit en fait du fichier articles que je teste).

Je vais essayer votre idée.
Je vous dis si ça marche

Cordialement
Philippe

#5 Développement » [Résolu] Test d'intégration de données dans ma base de données » 25/09/2020 12:15:56

philippe40
Réponses : 3

Bonjour,
J'ai une nouvelle aide à vous demander :
Dans une table de ma base de données, j'ai inséré des lignes.

Dans mon programme c# j'envoie des requêtes de la forme :
http://mon site/testexistligne.php?id=34555555  (par exemple)
pour vérifier si la base de données contient cette référence.

mon fichier testexistligne.php contient ceci :

   $host='serveur';
    $user='user';
    $pass='mdp';
    $base=basebdd_db3';
   
    $dbh = new PDO('mysql:host='.$host.';dbname='.$base, $user, $pass);       
    $query = $dbh->query('SELECT EXISTS (SELECT * FROM wp3_articles WHERE
    code_article='.$_GET['id'].') AS membre_exists');

    if($query->fetchColumn()  != 0)    {echo  "true";}    else      {echo "false"; }
   
    $dbh = null;

Le programme C# boucle sur une liste d'une centaine de clé pour vérifier si la référence existe dans la base de données, envoie la requête et obtient la réponse vrai ou faux.
Cela fonctionne pour les premières lignes. ensuite, le serveur m'envoie une erreur TIME OUT .

Après chaque requête je réinitialise pourtant  ma connexion.

Avez-vous une solution pour ce problème

Merci d'avance
Cordialement
Philippe

#6 Re : Développement » [Résolu] Insérer un valeur négative dans mySQl » 12/09/2020 07:26:05

Encore une fois merci de votre aide.
Je n'avais pas vu la faute et je tournais en rond.
Je vais tenir compte de votre avis sur la protection des injections
cordialement
Philippe

#7 Développement » [Résolu] Insérer un valeur négative dans mySQl » 12/09/2020 07:26:05

philippe40
Réponses : 2

Bonsoir,
J'ai une requête qui envoie les données suivantes dans une page PHP

array (
  'id' => '160',
  'code_article' => '3660603004927',
  'product_name' => 'Bénédicta Sauce au bleu le pot de 260 g',
  'createdon' => '2020-09-11',
  'qt' => '1',
  'pa' => '2.74',
  'longitide' => '-1.2560526',
  'latitude' => '44.0785292',
  'id_magasin' => '2',
  'utilisateur' => '82942d7411af0066',
)

Le champ longitude est négatif mais s'enregistre à zéro dans la base de données

Dans ma page PHP

$dbh = new PDO('mysql:host='.$host.';dbname='.$base, $user, $pass);
                                 
$sql = "INSERT INTO wp3_achats (id,code_article, product_name,createdon,qt,pa,longitude,latitude,id_magasin,utilisateur)
                         VALUES
                         (
                         '$_POST[id]'           ,
                         '$_POST[code_article]' ,
                         '$_POST[product_name]' ,
                         '$_POST[createdon]'    ,
                             '$_POST[qt]'           ,
                         '$_POST[pa]'           ,
                         '$_POST[longiture]'    ,         
                         '$_POST[latitude]'     ,
                         '$_POST[id_magasin]'   ,
                         '$_POST[utilisateur]'   
                         )";

Le type de  champ dans ma base de données est double(10,4)

Mes recherche sur internet sont restées infructueuses

Avez vous une solution pour ce problème
Merci d'avance
Cordialement
Philippe

#8 Re : Développement » [Résolu] Images stockées dans Blob » 05/09/2020 16:55:34

J'ai enfin trouvé la solution à mon problème :

1) Contrairement à ma requête sur la base de données postgresql, il ne faut pas utiliser decode
decode('$_POST[imagesmall]', 'base64'))";
mais seulement mettre le champ comme tous les autres c'est à dire pour ce cas seulement
'$_POST[imagesmall]'

Dans le champ blob, les données de la base Mysql ne sont pas enregistrées au format 64

2) Dans la requête de lecture des données il faut transformer le champ blob
FROM_BASE64(image_small) as image_small pour que la restitution de l'image se fasse correctement

  echo '<td>' .
      '<img src = "data:image/png;base64,' . base64_encode($data['image_small']) . '" width = "50px" height = "50px"/>'
      . '</td>';
      echo '</tr>';

Je partage avec vous la solution de ce problème qui m'a demandé beaucoup de temps de réflexion pour ceux qui serait intéressés

Cordialement
Philippe

#9 Re : Développement » [Résolu] Images stockées dans Blob » 05/09/2020 16:55:34

Un grand merci pour toutes vos explications bien utiles.
Je ne suis pas un grand spécialiste PHP (plutôt un grand débutant) mais cette partie n'est pas le cœur de mon métier. Cependant vos explications dans mon mélange de PDO
et les fonctions Mysql me montre un chemin d'apprentissage.

J'ai réussi à afficher des images stockées dans un blob dans mes pages web.
(première étape à la résolution de mon problème)
Pour enregistrer mes image j'utilise un upload dans une page index.php
<body>
    <form enctype="multipart/form-data" action="upload.php" method="post">
        <label>Uploader le fichier image:</label><br />
        <input name="userImage" type="file" />
        <input type="submit" value="Uploader" />
    </form>
    </div>
</body>

et j'enregistre ainsi mes images dans upload.php avec les commandes suivantes ;
    //Récupérer le contenu de l'image
        $file = $_FILES['userImage']['tmp_name'];
        $image = addslashes(file_get_contents($file));

Cela se fait manuellement.


Mon problème est le suivant :
Les images sont contenues dans une base de données SQLITE dans un champ blob
j'utilise un programme c# pour lire les données de ma base et les transférer dans la base de données Mysql du serveur francesrv. à l'adresse http://pensebete.franceserv.fr/insert.php"

le programme c#
Les données blob sont transformées en text avec un codage 64bits
data.Add("imagesmall", Convert.ToBase64String(vh.ImageSmall)
La commande qui envoie les données au serveur
var response = client.PostAsync("http://pensebete.franceserv.fr/insert.php", encodedContent);
l
Coté serveur j'ai le script insert.php
ma requête d'insertion est
$sql = "INSERT INTO wp3_articles (code_article, generic_name,product_name,image_small)
    VALUES
('$_POST[codearticle]',
'$_POST[genericname]',
'$_POST[productname]',
decode('$_POST[imagesmall]', 'base64'))";

Les données s'nregistrent dans la base de données Mysql sans problème mais la conversion des données blob ne correspond pas à des images. => lecture des images impossible

Si j'utilise avec la même requête dans une base postgresql, je n'ai pas de problème
La différence entre postgresql et Mysql est le type de champ utlisé : Bytea pour porgresql et blob pour Mysql.

Avez-vous une idées pour résoudre mon problème ?

Cordialement
Philippe

#10 Développement » [Résolu] Images stockées dans Blob » 05/09/2020 16:55:34

philippe40
Réponses : 4

Bonjour à tous.

Voici mon problème :

Je stocke une image dans un champ blob de ma base Mysql à l'aide de la requête sql ci-dessous
dans le champ nommé image_small
         
$sql = "INSERT INTO wp3_articles (code_article, image_small)
  VALUES ('$_POST[codearticle]',decode('$_POST[imagesmall]', 'base64'))";

Pour afficher mon image sur une page web j'exécute le php suivant :

<?php
    $host='localhost';
    $user='xxxx';
    $pass='';
    $base='basededonnee';


    $idPhoto0 = $_GET['idPhoto'];
    $link = $dbh = new PDO('mysql:host='.$host.';dbname='.$base, $user, $pass)
    $sql =  "select image_small from wp3_articles where code_article='{$idPhoto0}' "  ;
    $res = $link->query($sql);    
    $raw = mysql_fetch_row($res, 'image_small');
    header('Content-Type: image/jpeg');
 
     echo mysql_real_escape_string($raw);

    pg_close($link);
?>
Je n'ai pas de restitution de mon image

J'ai testé équivalent sur une base Postgresql dans un champ bytea avec le php équivallent :

<?php
    $idPhoto0 = $_GET['idPhoto'];
    $link = pg_connect("xxxxxxxxxxxxxxxx");
    $sql =  "select image_small from wp3_articles where code_article='{$idPhoto0}' "  ;
    $res = pg_query($link, $sql);
    $raw = pg_fetch_result($res, 'image_small');
    header('Content-Type: image/jpeg');
    echo pg_unescape_bytea($raw);
    pg_close($link);
?>

ça marche sans problème.

La différence de stockage est tous 2 binaires
Postgresql :  byte[]      Mysql : Blob

La lecture des données hex dans les champs postgresql et mysql sont différents

Avez vous une explication de cette différence ?
Avez-vous une suggestion à me faire pour m'aider à résoudre ce problème ?

Merci d'avance

Cordialement
Philippe

#11 Re : Support technique » [Résolu] Requête Post via application C# » 28/08/2020 20:39:30

Ne cherchez pas j'ai trouvé le problème
Pour info
Celà provenait de mon programme
la ligne 
string Serveur ="http://pensebete.franceserv.fr/insert.php"; était enregistré dans une variable :
string Serveur = Apache + insert.php
Apache contenant http://pensebete.franceserv.fr/
En remplaçant la variable par l'adresse complète, je n'ai plus de problème
Cordialement
Philippe

#12 Support technique » [Résolu] Requête Post via application C# » 28/08/2020 20:39:30

philippe40
Réponses : 1

Bonjour,
J'ai un problème d'envoie de données vers ma base de données via un programme développé dans la plateforme  Xamarin :
Erreur renvoyée par le serveur :

One or more errors occurred. (Unable to resolve host "pensebete.francesrv.fr": No address associated with hostname)

Mon programme exécute la  requête PHP suivante :
-------------------------------------------------------------------------------------------

<?php

    file_put_contents("log/".date("Ymd").".txt", var_export($_POST, true));
       
   $host='sql.franceserv.fr';
    $user='xxxxx';
    $pass='xxxxxxx'';
    $base='philippe40_db3';
   
    try {          
         $dbh = new PDO('mysql:host='.$host.';dbname='.$base, $user, $pass);               
                
        $sql = "INSERT INTO wp3_articles (code_article, generic_name,product_name)
     VALUES ('$_POST[codearticle]','$_POST[genericname]','$_POST[productname]')";

         if ($dbh->query($sql) === TRUE)
               {  echo "New record created successfully";}           
               else {echo "Error: " . $sql . "<br>" . $dbh->error;}            
                }
            catch (PDOException $error) {die("Erreur de connexion : " . $error->getMessage() );}           
            $dbh->close();
?>

-------------------------------------------------------------------------------------------------------

La fonction c#

       public static Task<bool> ExportLigneToServer(Article vh)
        {
            return Task.Run(() =>

            {
                using (var client = new HttpClient())
                {
                    string Serveur ="http://pensebet.franceserv.fr";

                    client.BaseAddress = new Uri(Serveur);

                    client.DefaultRequestHeaders.Accept.Clear();

                    client.DefaultRequestHeaders.Accept.Add(new
                    MediaTypeWithQualityHeaderValue("application/json"));                 

                    try
                    {
                        var data = new Dictionary<string, string>
                       {
                           { "codearticle", vh.CodeArticle.ToString() },
                           { "genericname", vh.GenericName.ToString()},
                           { "productname", vh.ProductName.ToString() }
                                         
                       };
                                                     
                        var content = new FormUrlEncodedContent(data);
                        var response = client.PostAsync(Serveur, content);
                        var responseString = response.Result;

                    }
                    catch (Exception ex)
                    {
                        var c = ex;
                    }

                    return true;
                }
            });
        }

Je dispose d'un environnement de test qui fonctionne parfaitement.
Merci de votre aide
Cordialement
Philippe

#14 Re : Support technique » [Résolu] cONNEXION A LA BASE DE DONNEES PAGE PHP » 26/08/2020 15:49:52

Merci pour les infos WordPress
Pour la connexion à la base de données, j'ai toujours le même problème
Erreur de connexion : SQLSTATE[HY000] [1044] Access denied for user 'philippe40'@'%' to database 'philippe40_bd3'
Cordialement
Philippe

#15 Re : Support technique » [Résolu] cONNEXION A LA BASE DE DONNEES PAGE PHP » 26/08/2020 15:49:52

Autre info : j'ai fait recalculé mon mot de passe par francesrv

Pied de page des forums

Propulsé par FluxBB

[ Générées en 0.428 secondes, 12 requêtes exécutées - Utilisation de la mémoire : 1.83 Mio (pic d'utilisation : 1.88 Mio) ]