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 :

Insérer dans bdd


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Insérer dans bdd
    Bonjour à tous,

    Après scrapper des données je souhaite les insérer dans ma bdd. Du coup je récupère tout une ligne de donné qui contient mes 9 champs de ma table. Lors que j'exécute le code j'ai une erreur :
    Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe prs de ''.Array.''
    Voici mon 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
    function table_but_exact($lien_exact)
            {
     
                foreach ($lien_exact as $lien2) {
                    $html = new simple_html_dom();
                    $html->load_file($lien2);
                    $csv = [];
                    $tr = $html->find('#btable', 0);
                    foreach ($tr->find('tr') as $item) {
                        $td = $item->find("td");
                        $temp = [];
                        for ($i = 0; $i < sizeof($td); $i++) {
                            if ($i <> 2) {
                                $text = $td[$i]->text();
                                $text = trim($text);
                                $text = str_replace(",", "", $text);
                                $text = str_replace("%", "", $text);
                                $text = str_replace("&nbsp;", "", $text);
                                $text = str_replace('(', "", $text);
                                $text = str_replace(')', "", $text);
     
                                array_push($temp, $text);
                            }
                        }
                        if (sizeof($td) > 8) {
                            $csv[] = $temp;
                        }
                    }
                    $pdo = new PDO('mysql:host=localhost;dbname=resultat_stats', 'root', '');
                    foreach ($csv as $data) {
                        $ajouter = "INSERT INTO but_exact VALUE '.$data.'";
                        $preparedajouter = $pdo->prepare($ajouter);
                        $preparedajouter->execute();
                    }
                }
            }
    Je ne sais pas si j'en suis loin. Si vous pouvez m'aider j'en serai ravi.

    Merci d'avance, bonne soirée.

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 910
    Points : 6 703
    Points
    6 703
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $pdo = new PDO('mysql:host=localhost;dbname=resultat_stats', 'root', '');
    foreach ($csv as $data) {
        $ajouter = "INSERT INTO but_exact VALUE '.$data.'";
        $preparedajouter = $pdo->prepare($ajouter);
        $preparedajouter->execute();
    }
    Ce n'est pas de cette manière qu'on compose une requête, en concaténant les données à insérer directement dans la requête comme tu le fais. Il y a un tutoriel sur le site qui explique comment faire des requêtes préparées. Le manuel PHP est aussi d'un grand secours.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour et merci de ta réponse,

    Du coup ça fait trois jours que je regarde et essaie mais sans résultat !!

    c'est bien un code dans ce genre qu'il faut : (vue dans la doc)

    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
    $query = 'INSERT INTO foo (nom, prix) VALUES (?, ?);';
    $prep = $pdo->prepare($query);
     
    $prep->bindValue(1, 'item 1', PDO::PARAM_STR);
    $prep->bindValue(2, 12.99, PDO::PARAM_FLOAT);
    $prep->execute();
     
    $prep->bindValue(1, 'item 2', PDO::PARAM_STR);
    $prep->bindValue(2, 7.99, PDO::PARAM_FLOAT);
    $prep->execute();
     
    $prep->bindValue(1, 'item 3', PDO::PARAM_STR);
    $prep->bindValue(2, 17.94, PDO::PARAM_FLOAT);
    $prep->execute();
     
    $prep = NULL;

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 910
    Points : 6 703
    Points
    6 703
    Par défaut
    Alors oui c'est l'idée. Mais tu as un autre problème avec ton code, c'est que ta variable $data n'est pas une chaîne de caractères mais un tableau de chaîne de caractères, donc j'imagine que ton intention est de boucler sur ces chaînes pour les insérer dans ta base.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Quand je fais var_dump($csv[0]); ça m'affiche un array avec la première ligne à insérer. et si je fais un var_dump($csv[0][0]); j'ai un string avec le premier champs à insérer.

    Mais j'arrive pas voir comment concaténant les données à insérer.

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 431
    Points : 15 803
    Points
    15 803
    Par défaut
    la 1re étape est de définir quelle requête vous voulez obtenir..
    ensuite vous pourrez construire cette requête à l'aide de ce qui est expliqué ici :
    https://www.php.net/manual/fr/language.types.array.php

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bon essayer et grâce à votre aide j'ai un résultat.

    avec ce code j'arrive à inserer la premiere ligne :
    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
     
    $csv = array(
                        "Equipe" => $csv[0][0],
                        "GP" => $csv[0][1],
                        "AVG" => $csv[0][2],
                        "0_but" => $csv[0][3],
                        "1_but" => $csv[0][4],
                        "2_but" => $csv[0][5],
                        "3_but" => $csv[0][6],
                        "4_but" => $csv[0][7],
                        "5_but" => $csv[0][8]
                    );
     
                    $pdo = new PDO('mysql:host=localhost;dbname=resultat_stats', 'root', '');   
                    $query = 'INSERT INTO but_exact (Equipe, GP, AVG, 0_but, 1_but, 2_but, 3_but, 4_but, 5_but) VALUES (:Equipe, :GP, :AVG, :0_but, :1_but, :2_but, :3_but, :4_but, :5_but)';
                    $insert = $pdo->prepare($query);
                    $insert->execute($csv);
    Maintenant j'essaie de faire une boucle pour rentrer tous les lignes.

    Je suis sur la bonne voie ??

    Merci d'avance

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 910
    Points : 6 703
    Points
    6 703
    Par défaut
    Il y a de l'idée, mais à mon avis tu te compliques la vie inutilement avec ta variable $csv qui ne sert pas à grand chose. Tu devrais plutôt insérer directement ta variable $temp, par exemple:
    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
    function table_but_exact($lien_exact) {
        $pdo = new PDO('mysql:host=localhost;dbname=resultat_stats', 'root', '');
        $query = 'INSERT INTO but_exact (Equipe, GP, `AVG`, 0_but, 1_but, 2_but, 3_but, 4_but, 5_but) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)';
        $statement = $pdo->prepare($query);
     
        foreach ($lien_exact as $lien2) {
            $html = new simple_html_dom();
            $html->load_file($lien2);
            $table = $html->find('#btable', 0);
     
            foreach ($table->find('tr') as $item) {
                $tds = $item->find("td");
     
                if (count($tds) < 10)
                    continue; // on passe directement au tr suivant
     
                $temp = [];
     
                unset($tds[2]); // plus besoin de tester l'index 2, on l'enlève.
     
                foreach($tds as $td) {
                    $text = $td->text();
                    $text = str_replace([',', '%', '&nbsp;', '(', ')'], '', $text);
                    $text = trim($text);
     
                    $temp[] = $text;
                }
                // attention: si count($temp) > 10, il faudra réduire sa taille d'une manière ou d'une autre. 
                $statement->execute($temp);
     
            }
        }
    }
    NB: ici j'utilise ? comme place holder, mais si tu préfères qu'ils soient nommés, tu peux construire facilement ton tableau associatif:
    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
    function table_but_exact($lien_exact) {
        $pdo = new PDO('mysql:host=localhost;dbname=resultat_stats', 'root', '');
        $query = 'INSERT INTO but_exact (Equipe, GP, `AVG`, 0_but, 1_but, 2_but, 3_but, 4_but, 5_but) VALUES (:Equipe, :GP, :AVG, :0_but, :1_but, :2_but, :3_but, :4_but, :5_but)';
        $statement = $pdo->prepare($query);
        $columns = ['Equipe', 'GP', 'AVG', '0_but', '1_but', '2_but', '3_but', '4_but', '5_but'];
     
        foreach ($lien_exact as $lien2) {
        // ...
     
                // attention: si count($temp) > 10, il faudra réduire sa taille d'une manière ou d'une autre. 
                $data = array_combine($columns, $temp);
                $statement->execute($data);
     
            }
        }
    }
    Autre chose que je trouve suspect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (sizeof($td) > 8) {
        $csv[] = $temp;
    }
    car tu as besoin d'au moins 10 tds par ligne (9 dont tu as besoin, plus celle qui est ignorée). Dans le cas où il y en aurait plus, il faudra alors interrompre la boucle foreach sur $tds avant.

    En PHP, sizeof et count sont synonymes. sizeof est un héritage du langage C dont la syntaxe du PHP est inspiré, néanmoins sizeof en C renvoie le nombre d'octets qu'occupent une variable en mémoire, alors que le sizeof de PHP lui se contente de renvoyer le nombre d'items d'une variable dotée de l'interface "Countable" (c'est le cas du tableau PHP), ce qui n'a donc rien à voir avec l'occupation mémoire. C'est pourquoi on lui préfère count qui dans cette perspective est finalement plus explicite.


    Aussi, ce n'est pas une super idée de nommer une colonne AVG car c'est un mot clef SQL. D'ailleurs lorsque tu auras fini de te dépatouiller avec ton PHP, n'hésite pas à jeter un œil aux excellents tutoriels de la rubrique SQL.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci de ta réponse, j'avais fais une boucle et j'avais réussi a obtenir ce que je voulais, mais ta fonction a l'air plus optimisé.

    Merci a tous !!

Discussions similaires

  1. [WD16] Inserer dans une BDD les enregistrements d'une table
    Par elgeek dans le forum WinDev
    Réponses: 4
    Dernier message: 29/03/2011, 17h43
  2. [MySQL] Inserer qté dans bdd
    Par Shivas dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/06/2010, 13h27
  3. inserer page html dans bdd
    Par Magik22 dans le forum Bases de données
    Réponses: 2
    Dernier message: 10/07/2009, 20h48
  4. [MySQL] la fonction PHP qui permet de recuperer la dernière ligne inserée dans bdd
    Par otari dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 06/06/2007, 20h05

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