de l'aide i am dead with 7,3 ! ( migration php 5,4->7,3)

pascal1961
Invité n'ayant pas de compte PHPfrance

25 févr. 2020, 14:42

Bonjour,

J'ai un petit script qui marchait parfaitement bien avec php 5.3 mais avec l'obsoléte fonction mysql ,avec 7,3 les choses se complique pour le newbe que je suis.
le script (c'est une petition basique) a transformé en 7,3 est :
<?php
 echo '<center><table><tr><td><b>Nom</b></td><td><b>Prénom</b></td><td><b>Date de signature</b></td><td><b>country name</b></td></tr>';
    // On se connecte à la base de données
1     mysql_connect("$host", "$login", "$password");
2   mysql_select_db("$bdd");
    // On sécurise les champs
3    $nom = htmlspecialchars($_POST['nom']);
4    $prenom = htmlspecialchars($_POST['prenom']);
5   $pays = htmlspecialchars($_POST['pays']);
6   $date = date('d/m/Y');
7    $submit = htmlspecialchars($_POST['submit']);
    // On vérifie que tous les champs sont bien remplis
8    if($submit && empty($nom))
9   {
        // Message d'erreur
10        die('<center>Vous devez remplir tous les champs.<br /><br /></center>');
11  }
12   if($submit && empty($prenom))
13 {
        // Message d'erreur
14      die('<center>Vous devez remplir tous les champs.<br /><br /></center>');
15  }
16 if($submit && empty($pays))
17 {
        // Message d'erreur
18  die('<center>Vous devez remplir tous les champs.<br /><br /></center>');  
19 }
    // On vérifie que les champs sont assez longs pour être raisonnables
20 $long1 = strlen($nom);
21 $long2 = strlen($prenom);
22 $long3 = strlen($pays);
    // Si le nom est trop court (plus petit que 3 caractères)
 23 if($submit && $long1 < '3')
 24 {
        // Message d'erreur
 25     die('<center>Votre nom doit faire plus de 3 caractères.<br /><br /></center>');
 26 }
    // Si le prénom est trop court (plus petit que 3 caractères)
 27 if($submit && $long2 < '3')
28 {
        // Message d'erreur
29   die('<center>Votre prénom doit faire plus de 3 caractères.<br /><br /></center>');
30 }
    // Si le pays est trop court (plus petit que 3 caractères)
31    if($submit && $long3 < '3')
32   {
        // Message d'erreur
33        die('<center>Votre pays doit faire plus de 3 caractères.<br /><br /></center>');
34    }
35  if($submit)
36    {
        // On enregistre la participation à la pétition
37       mysql_query("INSERT INTO power_petition VALUES('', '" . $nom . "', '" . $prenom . "', '". $date ."','". $pays ."')");
38   }
    // On sélectionne les résultats
39  $sql = mysql_query('SELECT * FROM power_petition ORDER BY id DESC');
    // On compte le nombre de signatures
40   $signs = @mysql_num_rows($sql);
41  while($donnees = @mysql_fetch_array($sql))
42   {
43 ?><tr><td><?php echo $donnees['nom']; ?></td><td><?php echo $donnees['prenom']; ?></td><td><?php echo $donnees['date']; ?></td><td><?php echo $donnees['pays']; ?></td></tr>
44 <?php
45  }
46    echo '</table></center>';
    // On ferme la connexion MYSQL
47  mysql_close();
48 ?>
a la ligne 1 je mets :
mysqli_connect("$host", "$login", "$password" , "$bdd");
et le message d'erreur disparait.
je rajoute donc un i pour mysql_query et mysql_close et @mysqli_num_rows et @mysql_fetch_array comme vu "bétement" dans l'excellent tuto (post446278.html#p446278)

pour produire 2 nouvelles erreurs :
"call to undefinied function mysqli_query() expected at least 2 parameters 1 is given "
"mysqli_cloase () expects exactly 1 parameters o is given"
mais cela ne fonctionne pas , trop simple ?? #-o :?:

merci pour votre aide

Avatar du membre
Mammouth du PHP | 1609 Messages

25 févr. 2020, 14:57

Salut, si tu prends le temps de lire la documentation de ces fonctions, tu verras qu'il faut passer le lien mysqli (récupérer lors de la connexion) en paramètre, ce qui n'était pas nécessaire avec les fonctions mysql.
Développeur web depuis + de 20 ans

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

25 févr. 2020, 16:20

je rajoute donc un i pour mysql_query et mysql_close et @mysqli_num_rows et @mysql_fetch_array comme vu "bétement" dans l'excellent tuto (post446278.html#p446278)
Il y avait aussi un paragraphe en gras qui commence par IMPORTANT, dans cet excellent tuto :D
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 11 Messages

26 févr. 2020, 16:39

rebonjour,

j'ai refait le script en mode procédurale :
<?php

    echo '<center><table><tr><td><b>Nom</b></td><td><b>Prénom</b></td><td><b>Date de signature</b></td><td><b>country name</b></td></tr>';

    // On se connecte à la base de données
    $connection = mysqli_connect("$host", "$login", "$password", "$bdd");
    if (mysqli_connect_errno()) 
    {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit;
    }

    // On sécurise les champs
    $nom = htmlspecialchars($_POST['nom']);
    $prenom = htmlspecialchars($_POST['prenom']);
    $pays = htmlspecialchars($_POST['pays']);
    $date = date('d/m/Y');
    $submit = htmlspecialchars($_POST['submit']);

    // On vérifie que tous les champs sont bien remplis
    if($submit && empty($nom))
    {
        // Message d'erreur
        die('<center>Vous devez remplir tous les champs.<br /><br /></center>');
    }

    if($submit && empty($prenom))
    {
        // Message d'erreur
        die('<center>Vous devez remplir tous les champs.<br /><br /></center>');
    }
    if($submit && empty($pays))
    {
        // Message d'erreur
        die('<center>Vous devez remplir tous les champs.<br /><br /></center>');  
    }

    // On vérifie que les champs sont assez longs pour être raisonnables
    $long1 = strlen($nom);
    $long2 = strlen($prenom);
    $long3 = strlen($pays);
    // Si le nom est trop court (plus petit que 3 caractères)
    if($submit && $long1 < '3')
    {
        // Message d'erreur
        die('<center>Votre nom doit faire plus de 3 caractères.<br /><br /></center>');
    }

    // Si le prénom est trop court (plus petit que 3 caractères)
    if($submit && $long2 < '3')
    {
        // Message d'erreur
        die('<center>Votre prénom doit faire plus de 3 caractères.<br /><br /></center>');
    }
    // Si le pays est trop court (plus petit que 3 caractères)
    if($submit && $long3 < '3')
    {
        // Message d'erreur
        die('<center>Votre pays doit faire plus de 3 caractères.<br /><br /></center>');
    }

    if($submit)
    {
        // On enregistre la participation à la pétition
      $result = mysqli_query($connection, "INSERT INTO power_petition VALUES , ('', '" . $nom . "', '" . $prenom . "', '". $date ."','". $pays ."')");
      
    }

    // On sélectionne les résultats
    $sql = @mysqli_query("$connection , $result");


    // On compte le nombre de signatures
    $signs = @mysqli_num_rows($sql);

    while($donnees = @mysqli_fetch_array($sql))
    {

?>
et je n'ai plus d'erreur mais ca bug pour mettre en forme, je ne vois pas que viens faire @mysqli dans cette histoire #-o (je suppose aussi qu'il faut utiliser la fonction array :?: )
si je comprends bien on securise les champs avec real_escape_string :?: comme vue avec l'excellent tuto (post446278.html#p446278) :) :?:
un petit coup de pouce ferait pas de mal , merci
" Contrôler cela n'est pas forcement maîtriser ! "
"ce qui est facile pour les uns peut être difficile pour les autres ! " copyright Thuillier-charmet

Loi 92-597 1992-07-01 annexe JORF 3 juillet 1992
Toute représentation ou reproduction intégrale ou partielle faite sans le consentement de l'auteur ou de ses ayants droit ou ayants cause est illicite. Il en est de même pour la traduction, l'adaptation ou la transformation, l'arrangement ou la reproduction par un art ou un procédé quelconque.

Avatar du membre
Mammouth du PHP | 1609 Messages

26 févr. 2020, 16:46

Le @ devant une fonction sert juste à masquer les erreurs s'il y en a.

Et j'ai pas lu tout le code mais je vois déjà ici une erreur :
// ici ça fait un seul paramètre
@mysqli_query("$connection , $result");

// comme ça c'est mieux si ce n'est que le deuxième paramètre est sensé
// être une requête et non un résultat
@mysqli_query($connection , $result);
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 11 Messages

26 févr. 2020, 17:22

Le @ devant une fonction sert juste à masquer les erreurs s'il y en a.

Et j'ai pas lu tout le code mais je vois déjà ici une erreur :
// ici ça fait un seul paramètre
@mysqli_query("$connection , $result");

// comme ça c'est mieux si ce n'est que le deuxième paramètre est sensé
// être une requête et non un résultat
@mysqli_query($connection , $result);


il y a moins d’une minute
ah! merci , c'était un peu trop bien (j'ai pas trouvé le smiley mort de rire :D )
" Contrôler cela n'est pas forcement maîtriser ! "
"ce qui est facile pour les uns peut être difficile pour les autres ! " copyright Thuillier-charmet

Loi 92-597 1992-07-01 annexe JORF 3 juillet 1992
Toute représentation ou reproduction intégrale ou partielle faite sans le consentement de l'auteur ou de ses ayants droit ou ayants cause est illicite. Il en est de même pour la traduction, l'adaptation ou la transformation, l'arrangement ou la reproduction par un art ou un procédé quelconque.

Eléphanteau du PHP | 11 Messages

27 févr. 2020, 12:26

Le @ devant une fonction sert juste à masquer les erreurs s'il y en a.

Et j'ai pas lu tout le code mais je vois déjà ici une erreur :
// ici ça fait un seul paramètre
@mysqli_query("$connection , $result");

// comme ça c'est mieux si ce n'est que le deuxième paramètre est sensé
// être une requête et non un résultat
@mysqli_query($connection , $result);


il y a moins d’une minute
ah! merci , c'était un peu trop bien (j'ai pas trouvé le smiley mort de rire :D )

J'ai résolus le probléme pour le nombre de pétitionnaires grâce a l'excellent tuto pour les requetes https://sql.sh/fonctions/agregation/count
 
 // Gestion des requêtes
    
    $sql = "SELECT * FROM `power_petition`";
    
    // On compte le nombre de petitionnaires
    $result = mysqli_query($connection , $sql);
    $row_cnt = mysqli_num_rows($result);

   // On affiche ce nombre
    printf("Il y a %d petitionnaires.\n", $row_cnt);

    /* Fermeture du jeu de résultats */
    mysqli_free_result($result);
    }

    echo '</table></center>';

    /* fermeture de la connexion MYSQL */
    mysqli_close($connection);
    

?>
" Contrôler cela n'est pas forcement maîtriser ! "
"ce qui est facile pour les uns peut être difficile pour les autres ! " copyright Thuillier-charmet

Loi 92-597 1992-07-01 annexe JORF 3 juillet 1992
Toute représentation ou reproduction intégrale ou partielle faite sans le consentement de l'auteur ou de ses ayants droit ou ayants cause est illicite. Il en est de même pour la traduction, l'adaptation ou la transformation, l'arrangement ou la reproduction par un art ou un procédé quelconque.