Script à passer de Mysql à Mysqli

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Script à passer de Mysql à Mysqli

Par piluche  -  10 reponses  -  Le 11/07/2017 13:10  -  Editer  - 

Bonjour à tous,

J' ai récupéré la maintenance d'un site d'une association de golfeurs et un des scripts essentiels est en Mysql et ne fonctionne plus, le site étant passé sous Mysql et PHP 7.0

Ce script se connecte au site de la Fédération Française de golf pour récupérer les handicaps des joueurs et les actualiser dans la base de données du site sous Joomla 3.7.3 et l'extension Community Builder qui gère les profils utilisateurs?

Je suis un amateur qui ne maitrise pas bien le coding.

Quelqu'un peut-il m'aider à modifier le script suivant pour le rendre actif sous Mysqli ?
Un grand merci d'avance
Cordialement,

Philippe

    $__host = "_____";
$__user = "____";
$__base = "_____";
$__password = "_____";       

$joueurArr = array();
// On se connecte à la base MySql
if (mysql_connect($__host, $__user, $__password) == true) {
    if (mysql_select_db($__user)) {
        mysql_query("SET NAMES 'utf8'");
        // Liste joueurs dans le formulaire ci dessous
        $joueurSQL = mysql_query("SELECT * from jnew_comprofiler WHERE cb_ndelicence <> ''");
        if (mysql_num_rows($joueurSQL) > 0) {
            while ($joueurLine = mysql_fetch_array($joueurSQL)) {
                $joueurArr[]  = $joueurLine;
            }
        }

        ?>
        <table>
        <?
        $i = 0;
        foreach ($joueurArr as $joueur) {
            $oldindex = $joueur["cb_index"];
            $newindex = getIndex( $joueur["cb_ndelicence"] );
            $joueurid = $joueur["id"];
            If ($oldindex <> $newindex) {
                $joueurSQL2 = mysql_query("Update jnew_comprofiler set cb_indexold = '$oldindex', cb_index = '$newindex' WHERE id = $joueurid");    
                $i = $i +1;
                ?>
                <tr>
                    <td><?=$joueurid . " " . $joueur ["firstname"] ." ". $joueur ["lastname"] ." ". $joueur ["cb_indexold"]."> nouvel index:  " . $newindex ?></td>
                </tr>
                <?
            }
        }
        ?>
        </table>
 

Réponses apportées à cette discussion

Par Cyrano  -  Le 11/07/2017 13:41  -  Haut de page  - 

Salut,
une de mes connaissances avait rencontré ce problème il n'y a pas très longtemps.

Il est bon de savoir que pratiquement toutes les fonctions mysql_xxx existent en mysqli_xxx : donc avec un outil comme par exemple Notepad++, il est assez facile de mettre à jour l'ensemble des fichiers en une seule fois en faisant un rechercher/remplacer dans les fichiers, en cherchant « mysql_ » et en remplaçant par « mysqli_ »

À moins d'utiliser certaines fonctions exotiques, ça devrait fonctionner immédiatement.

 
Par piluche  -  Le 11/07/2017 14:11  -  Haut de page  - 

Merci Cyrano,

J'ai déjà essayé de remplacer mysql par mysqli avec Notepad ++, mais ça ne fonctionne pas.

J'ai ce message d'erreur :

Warning: mysqli_select_db() expects exactly 2 parameters, 1 given in /home/users5/p/piluche/www/components/com_comprofiler/codeffg/getindex.php on line 88

J'ai lu quelque part que les fonctions mysqli_xx demandent 2 arguments dans l'écriture du script qui suit.

Et je ne sais pas faire ça.

Merci de toute aide à la réécriture de ce script sous mysqli

 
Par Cyrano  -  Le 11/07/2017 15:41  -  Haut de page  - 

Hé bien il faut rajouter le paramètre tout simplement. Sur cette fonction en particulier, elle ne devrait, si le script est bien fait, être présente qu'à un seul endroit, ça ne demande pas un effort considérable.

Et accessoirement, un petit tour dans la documentation de PHP pour l'extension mysqli ne nuirait sûrement pas.

 
Par piluche  -  Le 11/07/2017 16:47  -  Haut de page  - 

Merci, mais je ne suis pas un "pro"
Je ne sais pas faire ça et ne comprend pas bien les documents de la doc.
J'aurais simplement souhaité que quelqu'un puisse récrire ce script sous msqli. Tu sais faire ça ?
Sinon, tant pis, je vais chercher ailleurs

Encore merci pour avoir eu la gentillesse de prendre en compte mon problème

 
Par Cyrano  -  Le 11/07/2017 17:13  -  Haut de page  - 

Ok, ce n'est guère compliqué.

Avec mysqli, tu vas remplacer deux lignes.

Ton code est incomplet, et manque deux accolades « } » fermantes, il ne faudra donc pas oublier d'en faire sauter une : actuellement, tu as :

if (mysql_connect($__host, $__user, $__password) == true)
{
    if (mysql_select_db($__user))
    {

À remplacer par

if(false !== ($link = mysqli_connect($__host, $__user, $__password)))
{
    if (mysqli_select_db($link, $__base))
    {

Le reste devrait fonctionner correctement, enfin à condition de bien remplacer les autres fonctions mysql_ par mysqli_

 
Par piluche  -  Le 11/07/2017 18:22  -  Haut de page  - 

Merci pour ce coup de main

J'ai bien fait ce que tu m'as dit ( j'espère..)
Voilà ce que je reçois à l'appel du script :

Warning: mysqli_query() expects parameter 1 to be mysqli, null given in /home/users5/p/piluche/www/components/com_comprofiler/codeffg/getindex.php on line 91

Warning: mysqli_query() expects at least 2 parameters, 1 given in /home/users5/p/piluche/www/components/com_comprofiler/codeffg/getindex.php on line 93

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, null given in /home/users5/p/piluche/www/components/com_comprofiler/codeffg/getindex.php on line 94

Dois y avoir autre chose à modifier..

Je te repasse le script dans son intégralité :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>

<?php

    $ecoleid = $_GET['ecoleid'];
    $where = "";
    if (isset($ecoleid)) {
        $where = " And EcoleId = " . $ecoleid;
    }

    function getHtml( $url, $post_data )
    {
        $curl = curl_init();

        $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
        $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
        $header[] = "Referer: http://www.ffgolf.org/";
        $header[] = "Cache-Control: max-age=0";
        $header[] = "Connection: keep-alive";
        $header[] = "Keep-Alive: 300";
        $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
        $header[] = "Accept-Language: en-us,en;q=0.5";
        $header[] = "Pragma: "; // browsers keep this blank.

        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post_data));
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);

        $html = curl_exec($curl); // execute the curl command
        curl_close($curl); // close the connection

        return $html; // and finally, return $html
    }

    function requestFFGolfData( $licence_number )
    {
        $post_data = array('ezjscServer_function_arguments' => 'ajaxfleolerestapi::indexflash::' . $licence_number, 'ezxform_token' => "");
        $html_page = getHtml( 'http://www.ffgolf.org/ezjscore/call/', $post_data );    
        return $html_page;
    }

    function getIndex( $licence_number )
    {
        $html_page = requestFFGolfData( $licence_number );
        $regex = "/.*Index ([0-9\\.]*) au.*/s";
        $result = "Error";
        if( preg_match( $regex , $html_page , $matches ) && "" != $matches[ 1 ] )
            $result = $matches[ 1 ];
        If (strpos($html_page, "rouge") > 0 )
            $result = "LR";
        If (strpos($html_page, "non renou") > 0 )
            $result = "LNR";
        If (strpos($html_page, "invalide") > 0 )
            $result = "LNV";
        return $result;    
    }

    function getCertif( $licence_number )
    {
        $html_page = requestFFGolfData( $licence_number );    
        $result = "2";
        If (strpos($html_page, "valide") > 0 )
            $result = 1;
        If (strpos($html_page, "Pas de certificat") > 0 )
            $result = 0;
        return $result;    
    }

    $__host = "___";
    $__user = "___";
    $__base = "___";
    $__password = "___";       

    $joueurArr = array();
    // On se connecte à la base mysqli
    if(false !== ($link = mysqli_connect($__host, $__user, $__password)))
{
    if (mysqli_select_db($link, $__base))
    {
        mysqli_query($mysqli,"SET NAMES 'utf8'");
            // Liste joueurs dans le formulaire ci dessous
            $joueurSQL = mysqli_query("SELECT * from jnew_comprofiler WHERE cb_ndelicence <> ''");
            if (mysqli_num_rows($joueurSQL) > 0) {
                while ($joueurLine = mysqli_fetch_array($joueurSQL)) {
                    $joueurArr[]  = $joueurLine;
                }
            }

            ?>
            <table>
            <?
            $i = 0;
            foreach ($joueurArr as $joueur) {
                $oldindex = $joueur["cb_index"];
                $newindex = getIndex( $joueur["cb_ndelicence"] );
                $joueurid = $joueur["id"];
                If ($oldindex <> $newindex) {
                    $joueurSQL2 = mysqli_query("Update jnew_comprofiler set cb_indexold = '$oldindex', cb_index = '$newindex' WHERE id = $joueurid");    
                    $i = $i +1;
                    ?>
                    <tr>
                        <td><?=$joueurid . " " . $joueur ["firstname"] ." ". $joueur ["lastname"] ." ". $joueur ["cb_indexold"]."> nouvel index:  " . $newindex ?></td>
                    </tr>
                    <?
                }
            }
            ?>
            </table>
            <br><br>
        <?= $i ?> Mises a jour d'index et certificats...<a href="http://www.escpeuropealumnigolf.com">Retour</a>
        <? } 
    }
    ?>

</body>
</html>
 
Par Cyrano  -  Le 11/07/2017 18:36  -  Haut de page  - 

Mouais, c'est pourtant pas le plus dur, et la documentation n'est pas si compliquée que ça.

Alors je vais faire une exception parce que le code est court, voici un corrigé :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
$ecoleid = $_GET['ecoleid'];
$where = "";
if(isset($ecoleid))
{
    $where = " And EcoleId = " . $ecoleid;
}
function getHtml($url, $post_data)
{
    $curl = curl_init();

    $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[] = "Referer: http://www.ffgolf.org/";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[] = "Accept-Language: en-us,en;q=0.5";
    $header[] = "Pragma: "; // browsers keep this blank.
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post_data));
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    $html = curl_exec($curl); // execute the curl command
    curl_close($curl); // close the connection
    return $html; // and finally, return $html
}
function requestFFGolfData($licence_number)
{
    $post_data = array('ezjscServer_function_arguments' => 'ajaxfleolerestapi::indexflash::' . $licence_number, 'ezxform_token' => "");
    $html_page = getHtml('http://www.ffgolf.org/ezjscore/call/', $post_data);
    return $html_page;
}
function getIndex($licence_number)
{
    $html_page = requestFFGolfData($licence_number);
    $regex = "/.*Index ([0-9\\.]*) au.*/s";
    $result = "Error";
    if(preg_match($regex, $html_page, $matches) && "" != $matches[1])
    {
        $result = $matches[1];
    }
    if(strpos($html_page, "rouge") > 0)
    {
        $result = "LR";
    }
    if(strpos($html_page, "non renou") > 0)
    {
        $result = "LNR";
    }
    if(strpos($html_page, "invalide") > 0)
    {
        $result = "LNV";
    }
    return $result;
}
function getCertif($licence_number)
{
    $html_page = requestFFGolfData($licence_number);
    $result = "2";
    if(strpos($html_page, "valide") > 0)
    {
        $result = 1;
    }
    if(strpos($html_page, "Pas de certificat") > 0)
    {
        $result = 0;
    }
    return $result;
}

$__host = "___";
$__user = "___";
$__base = "___";
$__password = "___";

$joueurArr = array();
// On se connecte à la base mysqli
if(false !== ($link = mysqli_connect($__host, $__user, $__password)))
{
    if(mysqli_select_db($link, $__base))
    {
        mysqli_query($link, "SET NAMES 'utf8'");
        // Liste joueurs dans le formulaire ci dessous
        $joueurSQL = mysqli_query($link, "SELECT * from jnew_comprofiler WHERE cb_ndelicence <> ''");
        if(mysqli_num_rows($joueurSQL) > 0)
        {
            while(false != ($joueurLine = mysqli_fetch_array($joueurSQL)))
            {
                $joueurArr[] = $joueurLine;
            }
        }
?>
                <table>
<?php
        $i = 0;
        foreach($joueurArr as $joueur)
        {
            $oldindex = $joueur["cb_index"];
            $newindex = getIndex($joueur["cb_ndelicence"]);
            $joueurid = $joueur["id"];
            if($oldindex != $newindex)
            {
                $joueurSQL2 = mysqli_query($link, "Update jnew_comprofiler set cb_indexold = '$oldindex', cb_index = '$newindex' WHERE id = $joueurid");
                $i = $i + 1;
?>
        <tr>
            <td>
                <?php echo($joueurid . " " . $joueur["firstname"] . " " . $joueur["lastname"] . " " . $joueur["cb_indexold"] . "> nouvel index:  " . $newindex); ?>
            </td>
        </tr>
<?php
            }
        }
?>
    </table>
    <br>
    <br>
    <?php echo($i); ?> Mises a jour d'index et certificats... <a href="http://www.escpeuropealumnigolf.com">Retour</a>
<?php
    }
}
?>
  </body>
</html>

Normalement ça devrait fonctionner correctement. J'ai aussi supprimé les short_open_tag, ces trucs sont à bannir, ce sont de mauvaises pratiques.

Mais à noter également : ce forum est destiné à l'apprentissage, je ne corrige pas le code des autres, je tâche de leur enseigner à le corriger eux-même, sinon le site devient sans intérêt.

 
Par piluche  -  Le 12/07/2017 11:34  -  Haut de page  - 

Merci beaucoup Cyrano, tu me sauves.
Ca fonctionne parfaitement
Désolé de t'avoir demandé les corrections.
Je commence seulement à me familiariser et comprendre le codage.
Il me faudra encore du temps, et je ne suis pas de la première jeunesse ( 70 ans, eh oui, jeune geek :-))
Mais je fais de mon mieux
Merci encore
Philippe

 
Par Cyrano  -  Le 12/07/2017 11:50  -  Haut de page  - 

Ok, je comprends.
Mais « À cœur vaillant, rien d'impossible. »

Je suis moi-même autodidacte et j'ai commencé à coder à presque 40 ans, mais je suis encore le cadet (54).

Pour apprendre le codage, l'âge importe assez peu en réalité, il faut essentiellement de la logique, ça c'est élémentaire, ainsi que de la rigueur et de la discipline. Ensuite je dirais qu'il faut avancer par étapes : d'abord le statique (HTML, CSS) et ensuite on introduit de la programmation (PHP, SQL et JavaScript). Mais ça fait tout de même 5 langages, ce qui fait du développement web un des métiers les plus compliqués en informatique, d'autant plus que chacun de ces langages évolue, et que se tenir à jour implique de tous les suivre.

Je reste néanmoins disponible pour tout conseil pratique. Comme je le mentionnais plus tôt, l'idée c'est d,amener le débutant à être autonome, sur la base de ce vieux proverbe chinois « Si tu donnes un poisson à un homme, il se nourrira une journée, si tu lui enseignes la pèche, il se nourrira toute sa vie » : en développement informatique, c'est pareil.

Il ne faut pas non plus hésiter à passer du temps dans les documentations, elles sont souvent enrichies d'exemples pratiques courants. Sinon il existe aussi quantité de tutoriels et éventuellement fouiller d'autres forums peut être utile (PHPFrance, Developpez.com, etc...) L'intérêt ici, c'est qu'on est tranquille, je suis tout seul à répondre et il y a peu de monde, on a donc le temps de s'occuper d'une question sans stress à cause de dizaines d'autres questions en attente.

Un autre truc que je recommande volontiers, c'est de participer activement sur un forum, et pas juste en posant des questions : en proposant des réponses aussi, c'est extrêmement formateur et j'ai énormément appris comme ça sur PHPFrance il y a quelques années maintenant.

Dernier truc pratique : bien aligner son code avec des indentations logiques, ça facilite grandement la relecture et on se repère infiniment plus facilement pour corriger une anomalie.

@+ :)

 
Par piluche  -  Le 12/07/2017 13:19  -  Haut de page  - 

Merci pour tous ces conseils et avoir pris le temps de venir à mon secours.
J'espère un jour savoir me débrouiller seul, mais c'est effectivement complexe.
Bonne journée,
Amicalement
Philippe

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !