Bonjour à tous,

Aprés scrapper des données je souhaite les inserer 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'execute 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

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 loins. Si vous pouvez m'aider j'en serai ravi.

Merci d'avance, bonne soirée.

26 réponses


Tekuni
Auteur
Réponse acceptée

Sa y est j'ai réussi en faisant ça :

for ($u = 0; $u < count($csv); $u++){
               $tableau = array(
                    "Equipe" => $csv[$u][0],
                    "GP" => $csv[$u][1],
                    "AVG" => $csv[$u][2],
                    "0_but" => $csv[$u][3],
                    "1_but" => $csv[$u][4],
                    "2_but" => $csv[$u][5],
                    "3_but" => $csv[$u][6],
                    "4_but" => $csv[$u][7],
                    "5_but" => $csv[$u][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($tableau);
            }
Tekuni
Auteur

Bonsoir,
J'ai essayé ça mais ça ne fonctionne pas non plus :

$pdo = new PDO('mysql:host=localhost;dbname=resultat_stats', 'root', '');        
                $rqt = "INSERT INTO but_exact ('Equipe', 'GP', 'AVG', '0_but', '1_but', '2_but', '3_but', '4_but', '5_but')";
                $rqt = " VALUES ";
                $rqt = "$csv[0] , $csv[1], $csv[2], $csv[3], $csv[4], $csv[5], $csv[6], $csv[7], $csv[8]";
                $stmt = $pdo->prepare($rqt);

                foreach ($csv as $ligne) {
                    //parcours des lignes
                    foreach ($ligne as $key => $value) {
                        if ($key == 'Equipe') {
                            $stmt->bindParam('Equipe', $value);
                        }
                        if ($key == 'GP') {
                            $stmt->bindParam('GP', $value);
                        }
                        if ($key == 'AVG') {
                            $stmt->bindParam('AVG', $value);
                        }
                        if ($key == '0_but') {
                            $stmt->bindParam('0_but', $value);
                        }
                        if ($key == '1_but') {
                            $stmt->bindParam('1_but', $value);
                        }
                        if ($key == '2_but') {
                            $stmt->bindParam('2_but', $value);
                        }
                        if ($key == '3_but') {
                            $stmt->bindParam('3_but', $value);
                        }
                        if ($key == '4_but') {
                            $stmt->bindParam('4_but', $value);
                        }
                        if ($key == '5_but') {
                            $stmt->bindParam('5_but', $value);
                        }
                        $stmt->execute();
                    } //fin foreach ligne
                } //fin foreach tableau*/

Bonsoir,
Fait un echo de $rqt juste avant le prepare, tu vas voir ta 1ère erreur
ensuite, il manque les marqueurs dans la requete. (cf la doc de la méthode prepare)

Tekuni
Auteur

Bonsoir,
Si je fait un echo de $rqt avant le prepare ça me met : Array , Array, Array, Array, Array, Array, Array, Array, Array
Et j'ai regardé les marqueurs de la méthode prepare et je vois pas !!

donc $svc[0] est un array et non un string
tu ne les vois les marqueurs pas car il n'y en a pas
$rqt avant le prepare devrait contenir la requête complète et non seulement la ligne précédende. Car tu ne fais pas de concaténation mais écrase chaque ligne.

Tekuni
Auteur

Si je fais un var_dump($csv[0]) j'ai un array avec toute la ligne de donnée mais si je fais var_dump($csv[0][0]) là j'ai bien un string avec juste la donnée

Tekuni
Auteur

Bonsoir,

Je suis toujours en recherche de solution. Si quelqu'un à une idée de solution je suis toujours preneur !!

Bonne soirée

la solution tu l'as trouvé dans ton dernier post.

Tekuni
Auteur

On va dire une partie car j'arrives pas à faire ma requête !!

qu'elle est ton nouveau code ?

Tekuni
Auteur
$pdo = new PDO('mysql:host=localhost;dbname=resultat_stats', 'root', '');        
                $rqt = "INSERT INTO but_exact ('Equipe', 'GP', 'AVG', '0_but', '1_but', '2_but', '3_but', '4_but', '5_but')";
                $rqt = " VALUES ";
                $rqt = "$csv[0][?], $csv[0][?], $csv[0][?], $csv[0][?], $csv[0][?], $csv[0][?], $csv[0][?], $csv[0][?], $csv[0][?]";

               // echo $rqt;
                $stmt = $pdo->prepare($rqt, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

                foreach ($csv as $ligne) {
                    //parcours des lignes
                    foreach ($ligne as $key => $value) {
                        if ($key == 'Equipe') {
                            $stmt->bindParam('Equipe', $value);
                        }
                        if ($key == 'GP') {
                            $stmt->bindParam('GP', $value);
                        }
                        if ($key == 'AVG') {
                            $stmt->bindParam('AVG', $value);
                        }
                        if ($key == '0_but') {
                            $stmt->bindParam('0_but', $value);
                        }
                        if ($key == '1_but') {
                            $stmt->bindParam('1_but', $value);
                        }
                        if ($key == '2_but') {
                            $stmt->bindParam('2_but', $value);
                        }
                        if ($key == '3_but') {
                            $stmt->bindParam('3_but', $value);
                        }
                        if ($key == '4_but') {
                            $stmt->bindParam('4_but', $value);
                        }
                        if ($key == '5_but') {
                            $stmt->bindParam('5_but', $value);
                        }
                        $stmt->execute(array());
                    } //fin foreach ligne
                } //fin foreach tableau*/

et tu n'as toujours pas vu que le écho de ta requête n'affiche pas cette dernière en entier ?

tu as été lire la doc de la méthode prepare ?

Tekuni
Auteur

Oui je suis allé lire la doc, je suis dessus (https://www.php.net/manual/fr/pdo.prepare.php)

tu ne réponds pas à ma 1ère question

et donc tu retrouves dans la doc, ce que tu as dans ton code avec les marqueurs ?

Tekuni
Auteur

Bon tant pis j'arrive pas, peu être c'est pas possible comme ça ! je vais chercher autrement !! Merci de ton temps !!

si c'est possible, tu fais juste des erreurs.
Je ne donne pas la solution, mais t'indique des méthodes pour trouver les erreurs. Ceci afin de t'aider à progresser

Tekuni
Auteur

Bon je vais essayer de ne pas me décourager.
"et tu n'as toujours pas vu que le écho de ta requête n'affiche pas cette dernière en entier ?"
Si je fais un echo sur $rqt, j'ai les marqueurs qui s'affiche (?).
Est ce que dans un premier temps, c'est normal que ça m'affiche ça ? Sur la doc ça met ça "$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");"
Si je met que des ? cela m'affiche aussi des ?
Je début et c'est un peu poussé pour moi !!

comme tu ne fais pas de concaténation, tu écrases à chaque fois ce que tu écris dans $rqt
du coup ta requête n'est pas complète. il te manque le début.

Tekuni
Auteur

Bonjour,

j'ai du mal avec le mot concaténation. Est ce que ça veux dire mettre dans une variable ? comme ci-dessous

$equipe = $csv[0][0];
$GP = $csv[0][1];
$AVG = $csv[0][2];
...

non, cela veut dire assembler.
je t'invite a revoir les bases du php.

$var = "je suis un chaine";
$var .= ", avec un autre bout de chaine";

et tu peux même améliorer en sortant les 3 lignes avant le "execute" de la boucle for
car le but d'une requête est aussi de ne pas la préparer à chaque fois. et tu n'auras qu'une instance de pdo et non autant de ligne que dans ton fichier

Tekuni
Auteur

Si je sors avant il n'y a que la derniere ligne dans ma bdd !!

montre ton code, stp

Tekuni
Auteur
for ($u = 0; $u < count($csv); $u++){
                    $tableau = array(
                         "equipe" => $csv[$u][0],
                         "gp_ht_a" => $csv[$u][1],
                         "avg_ht_a" => $csv[$u][2],
                         "0_5_ht_a" => $csv[$u][3],
                         "1_5_ht_a" => $csv[$u][4],
                         "2_5_ht_a" => $csv[$u][5],
                         "3_5_ht_a" => $csv[$u][6],
                         "4_5_ht_a" => $csv[$u][7],
                         "5_5_ht_a" => $csv[$u][8],
                         "bts_ht_a" => $csv[$u][9],
                         "cs_ht_a" => $csv[$u][10],
                         "fts_ht_a" => $csv[$u][11],
                         "wtn_ht_a" => $csv[$u][12],
                         "ltn_ht_a" => $csv[$u][13]
                     );

                     $pdo = new PDO('mysql:host=localhost;dbname=resultat_stats', 'root', '');   
                     $query = 'INSERT INTO total_but_ht_a (equipe, gp_ht_a, avg_ht_a, 0_5_ht_a, 1_5_ht_a, 2_5_ht_a, 3_5_ht_a, 4_5_ht_a, 5_5_ht_a, bts_ht_a, cs_ht_a, fts_ht_a, wtn_ht_a, ltn_ht_a) VALUES (:equipe, :gp_ht_a, :avg_ht_a, :0_5_ht_a, :1_5_ht_a, :2_5_ht_a, :3_5_ht_a, :4_5_ht_a, :5_5_ht_a, :bts_ht_a, :cs_ht_a, :fts_ht_a, :wtn_ht_a, :ltn_ht_a)';
                     $insert = $pdo->prepare($query);
                     $insert->execute($tableau);
                     }
 Et si je ferme mon for avant $pdo j'ai juste la derniere ligne dans ma bdd.

ce n'est pas ce que j'ai dit.
sortir avant le for seuleme les 3 lignes qui précéde le "execute"

Tekuni
Auteur

Ok merci c'est bon, tout fonctionne !!