IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Modification d'un script pour php7.3 et PDO


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur spécialisé
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 238
    Par défaut Modification d'un script pour php7.3 et PDO
    Bonjour,

    Voici des semaine que je travaille sur un vieux script qui me permet d'importer des fichiers csv dans mes tables .

    J'avais récupérer ce script sur internet et adapté pour mon cas perso.

    Je changé de version php pour passer à la 7.3 en sachant que je devrais mettre à jour ce script.

    J'ai réussi avec un peut d'aide de Julp pour ne pas le nommer lol. je le remercie encore au passage.

    Je bloque sur la requête d'insertion.

    Voici les fonctions qui fonction sur ancienne version de php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <?
    function connecter(){                               // ouverture de connection
    include('config.inc.php');
        $connexion = mysql_connect($host, $user, $pass)or die('Erreur SQL : '.mysql_error());
        $choix_base = mysql_select_db($bdd, $connexion)or die('Erreur SQL : '.mysql_error());
    }
    function deconnecter(){                             // fermeture de connection en cours
        mysql_close();
    }
    function requette($str_query, $connect=1){
        if ($connect==1){connecter();}                  // si connect =1 on se connect
        $resultat = mysql_query($str_query)or die('Erreur SQL : '.mysql_error());
        if ($connect==1){deconnecter();}                // si connect =1 on se deconnect
        return $resultat;
    }
    function ajouter($bd_table, $str_champs_valeurs, $connect = 1){
        $i=0;
        $champs="";
        $valeurs="";
     
        if ($connect==1){connecter();}                  // si connect =1 on se connect
        $resultat = split("#", $str_champs_valeurs);    // decoupage ds le tableau sous forme: 'nom_de_chapmp=text a insere'
        for ($i = 0; $i<sizeof($resultat); $i++){        // boucle - parcourir tableau
            $pos=strpos($resultat[$i],"=") ;            // on recupere la position de carractaire de decoupage
            $champs.=substr($resultat[$i], 0, $pos) . ", "; // on decoupe et stock des champs sous forme: 'champ1, champ2, ...'
            $valeurs.="'".substr($resultat[$i], $pos+1,strlen($resultat[$i])- $pos+1 )."', "; // sous forme: "'val1', 'val2', ..."
        }
        $champs=substr($champs,0,sizeof($valeurs)-3);   // il faut enleve dernier - ", "
        $valeurs=substr($valeurs,0,sizeof($valeurs)-3); // il faut enleve dernier - ", "
        $str_query="INSERT INTO ".$bd_table."(".$champs.") VALUES (".$valeurs.")"; //construction de query
        $resultat = requette($str_query ,0);                            // envoi de query
        if ($connect==1){deconnecter();}                // si connect =1 on se deconnect
        return $resultat;
    }
    //fonction qui verrifie l'existence d'un libelé dans un champ de la bdd
    // ex verif_libelle ("contact", "nom", "toto");
    function verif_exist($table, $champ, $exist, $connect=1){
        if ($connect==1){connecter();}                  // si connect =1 on se connect
        $resultat = mysql_query("select * from ".$table." where ".$champ." ='".$exist."'")or die('Erreur SQL : '.mysql_error());
        $nb_result_e = mysql_num_rows($resultat);
        if ($nb_result_e > 0){
            return 1;
        }else {
            return 0;
        }
        if ($connect==1){deconnecter();}                // si connect =1 on se deconnect
    }
    ?>
    et l'ancien bout de code que je n'arrive pas à modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <?php
    function requette_avec_erreur($str_query, $connect=1){
            if ($connect==1){connecter();}                  // si connect =1 on se connect
            $resultat = mysql_query($str_query);
            if ($connect==1){deconnecter();}                // si connect =1 on se deconnect
            if ($resultat)
            {
                return $resultat;
            }
            else
            {
     
                return 0;
                //erreur(3); //si on veux renvoyer ? une action pr?cise en cas d'erreur
            }
     
        }
        echo '<br /><strong>import en cours</strong> <br /><br />';
        $erreur_sql = ""; //on initialise le journal des erreurs
            //insert dans la base
        echo 'La ligne 1 du fichier CSV correspond à la définition des champs. <br />';
        connecter();
        for ($u=1; $u<$numligneval; $u++) {     
            if ($valeurs[$u] != ""){
                $req = "INSERT INTO $table $colones VALUES ".utf8_encode($valeurs[$u])." ";
                //echo "<br>".$req.'<br />';
     
                if (requette_avec_erreur($req,0)) {
                    echo 'ajout de la ligne '.($u+1).' du fichier '.$name_file.'.<br />';
                } else {
                    $erreur_sql .= '<font color="red">ligne '.($u+1).' du fichier '.$name_file.' -> Erreur SQL '.mysql_errno().' : '.mysql_error().'</font><br>';
                    echo '<font color="red">ligne '.($u+1).' -> Erreur SQL</font><br />';
                }
            }
     
        }
            deconnecter();
        echo '<br /><strong>Fin de l\'import</strong><br /> ';
        // affich
    age des erreurs
        echo '<strong> JOURNAL DES ERREURS SQL</strong><br />';
        if (!empty($erreur_sql)){
            echo $erreur_sql;
        } else {
            echo 'Pas d\'erreur détectée lors de l\'import';
        }
    ?>
    Et voici comme j'ai modifier les fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?
    function connecter(){
        try
            {
                $bdd = new PDO('mysql:host=***;dbname=***;charset=utf8', '***', '***',
                array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
            }
        catch (Exception $e)
            {
                die('Erreur : ' . $e->getMessage());
            }
    }
    function deconnecter(){
        unset($bdd);
    }
    function requette($str_query, $connect=1){
    	if ($connect==1){connecter();}
    	$resultat->execute();
    	$str_query = $resultat->fetchAll(PDO::FETCH_ASSOC);
    	if ($connect==1){deconnecter();}
    	return $resultat;
    }
    function ajouter($bd_table, $str_champs_valeurs, $connect = 1){
    	$i=0;
    	$champs="";
    	$valeurs="";
    	if ($connect==1){connecter();}
    	$resultat = split("#", $str_champs_valeurs); 	// decoupage ds le tableau sous forme: 'nom_de_chapmp=text a insere'
     
    	for ($i = 0; $i<sizeof($resultat); $i++){  		// boucle - parcourir tableau
    		$pos=strpos($resultat[$i],"=") ;			// on recupere la position de carractaire de decoupage
    		$champs.=substr($resultat[$i], 0, $pos) . ", "; // on decoupe et stock des champs sous forme: 'champ1, champ2, ...'
    		$valeurs.="'".substr($resultat[$i], $pos+1,strlen($resultat[$i])- $pos+1 )."', "; // sous forme: "'val1', 'val2', ..."
    	}
     
    	$champs=substr($champs,0,sizeof($valeurs)-3); 	// il faut enleve dernier - ", "
    	$valeurs=substr($valeurs,0,sizeof($valeurs)-3);	// il faut enleve dernier - ", "
    	$str_query = $bdd->query('INSERT INTO '.$bd_table.' ('.$champs.') VALUES ('.$valeurs.')'); //construction de query
    	$resultat = requette($str_query ,0);							// envoi de query
    	if ($connect==1){deconnecter();}				// si connect =1 on se deconnect
    	return $resultat;
    }
    //fonction qui verrifie l'existence d'un libelé dans un champ de la bdd
    // ex verif_libelle ("contact", "nom", "toto");
    function verif_exist($table, $champ, $exist, $connect=1){
    	if ($connect==1){connecter();}	// si connect =1 on se connect
    	$resultat = $bdd->query('SELECT * FROM '.$table.' WHERE '.$champ.'= '.$exist.'');
    	$nb_result_e = $resultat->rowCount();
    	if ($nb_result_e > 0){
    		return 1;
    	}else {
    		return 0;
    	}
    	if ($connect==1){deconnecter();}				// si connect =1 on se deconnect
    }
    ?>
    et le bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    function requette_avec_erreur($str_query, $connect=1)
    				{
    					if ($connect==1){connecter();} // si connect =1 on se connect
    					$resultat = $bdd->prepare($str_query);
    					$resultat->execute();
    					$str_query = $resultat->fetchAll(PDO::FETCH_ASSOC);
    					if ($connect==1){deconnecter();} // si connect =1 on se deconnect
    					if ($resultat) return $resultat;
    					else return 0;
    					//erreur(3); //si on veux renvoyer ? une action pr?cise en cas d'erreur	
    				}
    			echo '<br /><strong>import en cours</strong> <br /><br />';
    			$erreur_sql = ""; //on initialise le journal des erreurs
    			//insert dans la base
    			echo 'La ligne 1 du fichier CSV correspond à la définition des champs. <br />';
    			connecter();
    			for ($u=1; $u<$numligneval; $u++)
    				{		
    					if ($valeurs[$u] != "")
    						{
    							$req = $bdd->query('INSERT INTO '.$table.' '.$colones.' VALUES '.utf8_encode($valeurs[$u]).'');
    							$req = "INSERT INTO $table $colones VALUES ".utf8_encode($valeurs[$u])." ";
    							//echo "<br>".$req.'<br />';
    							if (requette_avec_erreur($req,0))
    								{
    									echo 'ajout de la ligne '.($u+1).' du fichier '.$name_file.'.<br />';
    								}
    							else
    								{
    									$erreur_sql .= '<font color="red">ligne '.($u+1).' du fichier '.$name_file.'</font><br>';
    									echo '<font color="red">ligne '.($u+1).' -> Erreur SQL</font><br />';
    								}
    						}
     
    				}
    		deconnecter();
    		echo '<br /><strong>Fin de l\'import</strong><br /> ';
    		// affichage des erreurs
    		echo '<strong> JOURNAL DES ERREURS SQL</strong><br />';
    		if (!empty($erreur_sql)) echo $erreur_sql;
    		else echo 'Pas d\'erreur détectée lors de l\'import';
    		echo '<p>&nbsp;&nbsp;&nbsp;</p>';
    Voici le message d"erreur
    Fatal error: Uncaught Error: Call to a member function prepare() on null in /home/dansleq/www/admin/import_csv.php:361 Stack trace: #0 /home/dansleq/www/admin/import_csv.php(381): requette_avec_erreur('INSERT INTO Lis...', 0) #1 /home/dansleq/www/admin/admin.php(81): include('/home/dansleq/w...') #2 {main} thrown in /home/dansleq/www/admin/import_csv.php on line 361

    Merci beaucoup à tout ceux et celles qui voudrons bien m'aider à faire les modifications.

  2. #2
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Bonjour.
    Tu ne sais pas quelque chose d'essentiel : la portée des variables.
    Dans une fonction, tu ne peux utiliser que les variables que tu passes en paramètre.
    Sinon, il ne connaît pas.
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function db_ecriture ($pdo, $sql, array()=NULL){
     
    }
    Si tu ne passes pas $pdo en paramètre, rien ne marchera.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Membre éclairé
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur spécialisé
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 238
    Par défaut
    Merci pour ta réponse Dendrite,
    J'ai modifié mon code comme çi dessous et ça avance.
    J'ai une entrée dans ma table mais c'est une entrée vide et toujours la même je suppose vu le message d"erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    function requette($str_query, $connect=1){
    	if ($connect==1){
    		try
    		{
    			$bdd = new PDO('mysql:host=***;dbname=***;charset=utf8', '***', '***', 
    			array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    		}
    	catch (Exception $e)
    		{
    			die('Erreur : ' . $e->getMessage());
    		}
    	}
    	$resultat->execute();
    	$str_query = $resultat->fetchAll(PDO::FETCH_ASSOC);
    	if ($connect==1){unset($bdd);}
    	return $resultat;
    }
    function ajouter($bd_table, $str_champs_valeurs, $connect = 1){
    	$i=0;
    	$champs="";
    	$valeurs="";
    	if ($connect==1){
    		try
    		{
    			$bdd = new PDO('mysql:host=***;dbname=***;charset=utf8', '***', '***',  
    			array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    		}
    	catch (Exception $e)
    		{
    			die('Erreur : ' . $e->getMessage());
    		}
    		}
    	$resultat = split("#", $str_champs_valeurs); 	// decoupage ds le tableau sous forme: 'nom_de_chapmp=text a insere'
     
    	for ($i = 0; $i<sizeof($resultat); $i++){  		// boucle - parcourir tableau
    		$pos=strpos($resultat[$i],"=") ;			// on recupere la position de carractaire de decoupage
    		$champs.=substr($resultat[$i], 0, $pos) . ", "; // on decoupe et stock des champs sous forme: 'champ1, champ2, ...'
    		$valeurs.="'".substr($resultat[$i], $pos+1,strlen($resultat[$i])- $pos+1 )."', "; // sous forme: "'val1', 'val2', ..."
    	}
     
    	$champs=substr($champs,0,sizeof($valeurs)-3); 	// il faut enleve dernier - ", "
    	$valeurs=substr($valeurs,0,sizeof($valeurs)-3);	// il faut enleve dernier - ", "
    	$str_query = $bdd->query('INSERT INTO '.$bd_table.' ('.$champs.') VALUES ('.$valeurs.')'); //construction de query
    	$resultat = requette($str_query ,0);							// envoi de query
    	if ($connect==1){unset($bdd);}				// si connect =1 on se deconnect
    	return $resultat;
    }
    //fonction qui verrifie l'existence d'un libelé dans un champ de la bdd
    // ex verif_libelle ("contact", "nom", "toto");
    function verif_exist($table, $champ, $exist, $connect=1){
    	if ($connect==1){
    		try
    		{
    			$bdd = new PDO('mysql:host=***;dbname=***;charset=utf8', '***', '***',  
    			array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    		}
    	catch (Exception $e)
    		{
    			die('Erreur : ' . $e->getMessage());
    		}
     
    	}	// si connect =1 on se connect
    	$resultat = $bdd->query('SELECT * FROM '.$table.' WHERE '.$champ.'= '.$exist.'');
    	$nb_result_e = $resultat->rowCount();
    	if ($nb_result_e > 0){
    		return 1;
    	}else {
    		return 0;
    	}
    	if ($connect==1){unset($bdd);}				// si connect =1 on se deconnect
    }
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    <?php
    function requette_avec_erreur($str_query, $connect=1)
    				{
    					try
    						{
    							$bdd = new PDO('mysql:host=***;dbname=***;charset=utf8', '***', '***',  
    							array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    						}
    					catch (Exception $e)
    						{
    							die('Erreur : ' . $e->getMessage());
    						}
    					$resultat = $bdd->prepare($str_query);
    					$resultat->execute();
    					$str_query = $resultat->fetchAll(PDO::FETCH_ASSOC);
    					if ($connect==1){unset($bdd);} // si connect =1 on se deconnect
    					if ($resultat) return $resultat;
    					else return 0;
    					//erreur(3); //si on veux renvoyer ? une action pr?cise en cas d'erreur	
    				}
    			echo '<br /><strong>import en cours</strong> <br /><br />';
    			$erreur_sql = ""; //on initialise le journal des erreurs
    			//insert dans la base
    			echo 'La ligne 1 du fichier CSV correspond à la définition des champs. <br />';
    			try
    						{
    							$bdd = new PDO('mysql:host=***;dbname=***;charset=utf8', '***', '***', 
    							array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    						}
    					catch (Exception $e)
    						{
    							die('Erreur : ' . $e->getMessage());
    						}
    			for ($u=1; $u<$numligneval; $u++)
    				{		
    					if ($valeurs[$u] != "")
    						{
    							$req = $bdd->query('INSERT INTO '.$table.' '.$colones.' VALUES '.utf8_encode($valeurs[$u]).'');
    							$req = "INSERT INTO $table $colones VALUES ".utf8_encode($valeurs[$u])." ";
    							//echo "<br>".$req.'<br />';
    							if (requette_avec_erreur($req,0))
    								{
    									echo 'ajout de la ligne '.($u+1).' du fichier '.$name_file.'.<br />';
    								}
    							else
    								{
    									$erreur_sql .= '<font color="red">ligne '.($u+1).' du fichier '.$name_file.'</font><br>';
    									echo '<font color="red">ligne '.($u+1).' -> Erreur SQL</font><br />';
    								}
    						}
     
    				}
    		unset($bdd);
    		echo '<br /><strong>Fin de l\'import</strong><br /> ';
    		// affichage des erreurs
    		echo '<strong> JOURNAL DES ERREURS SQL</strong><br />';
    		if (!empty($erreur_sql)) echo $erreur_sql;
    		else echo 'Pas d\'erreur détectée lors de l\'import';
    		echo '<p>&nbsp;&nbsp;&nbsp;</p>';
    ?>
    Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'mail' in /home/dansleq/www/admin/import_csv.php:394 Stack trace: #0 /home/dansleq/www/admin/import_csv.php(394): PDO->query('INSERT INTO Lis...') #1 /home/dansleq/www/admin/admin.php(81): include('/home/dansleq/w...') #2 {main} thrown in /home/dansleq/www/admin/import_csv.php on line 394

  4. #4
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Il me semble que tu appelles encore des $bdd que ta fonction ne peut pas connaître.

    Sinon, pour enlever les 2 derniers caractères d'une chaîne, moi, je fais comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $champs=substr($champs,0,-2);
    As-tu vérifié ce que vaut ta variable champs après ton substr ?
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

Discussions similaires

  1. Modif d'un script pour demarrage automatiquement
    Par krapoulos dans le forum jQuery
    Réponses: 6
    Dernier message: 17/03/2013, 20h12
  2. [PowerShell] Script pour lister date des dernières modifications apportée à un fichier
    Par Thoms13 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 16/03/2010, 12h39
  3. Réponses: 8
    Dernier message: 29/07/2009, 16h34
  4. Modification d'un script de digicode pour l'accès a l'administration
    Par K3p'' dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/04/2009, 18h44
  5. Réponses: 3
    Dernier message: 31/03/2008, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo