Inserer dans bdd

Par Tekuni, il y a 4 ans


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, il y a 4 ans

Bonsoir,

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

Bonne soirée

Carouge10, il y a 4 ans

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

Tekuni, il y a 4 ans

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

Carouge10, il y a 4 ans

qu'elle est ton nouveau code ?

Tekuni, il y a 4 ans

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*/
Carouge10, il y a 4 ans

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, il y a 4 ans

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 !!

Carouge10, il y a 4 ans

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, il y a 4 ans

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, il y a 4 ans
$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*/
Carouge10, il y a 4 ans

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 ?

Carouge10, il y a 4 ans

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, il y a 4 ans

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

Carouge10, il y a 4 ans

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, il y a 4 ans

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 !!

Carouge10, il y a 4 ans

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, il y a 4 ans

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]; ...
Carouge10, il y a 4 ans

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";
Tekuni, il y a 4 ans

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); }
Carouge10, il y a 4 ans

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, il y a 4 ans

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

Carouge10, il y a 4 ans

montre ton code, stp

Tekuni, il y a 4 ans
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.
Carouge10, il y a 4 ans

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

Tekuni, il y a 4 ans

Ok merci c'est bon, tout fonctionne !!