• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd zapytania PDO dla pewnych danych

Object Storage Arubacloud
0 głosów
130 wizyt
pytanie zadane 15 stycznia 2017 w PHP przez Klik Obywatel (1,540 p.)
edycja 15 stycznia 2017 przez Klik

Witam.

Mam problem tego rodzaju że dla pewnych danych zapytanie PDO zwraca błąd a dla innych działa najzupełniej prawidłowo.

Zapytanie to dodaje nowe tagi do bazy danych.

Najpierw pobrane tagi w formie stringa czyszczę, zamieniam na tablicę i usuwam duplikaty.

public function createTags(){
        if(isset($_POST['tags']) && $_POST['tags']!=""){
            if($this->cleanTags($_POST['tags'])) {
                $string = mb_strtolower(rtrim($_POST['tags'],','));
                $this->tags = explode(',', str_replace(' ','',$string));
                foreach ($this->tags as $tag){
                   $tagInArr = array_keys($this->tags,$tag);
                   if(count($tagInArr)>1){
                       for($i=1;$i<count($tagInArr);$i++){
                       unset($this->tags[$tagInArr[$i]]);
                       }
                   }
                }
                return true;
            }
        }
        return false;
    }

private function cleanTags($string){
        $cleanString = htmlspecialchars(strip_tags($string),ENT_QUOTES,'UTF-8');
        if($cleanString!==$string) return false;
        return true;
    }

W kolejnej metodzie dokonuje wpisu do bazy danych:

public function updateTags($tags){
        
        $placeholders = array();
        echo 'Liczba tagów '.count($tags).'<br>';
        foreach($tags as $d){
            $placeholders[] = '('  .'?' . ')';
        }
        $a = implode(',',$placeholders);
        echo 'Placeholdery '.$a.'<br>';

        try {
            $checkTag = $this->db->prepare("INSERT INTO tags (name) VALUES ". implode(',',$placeholders)." ON DUPLICATE KEY UPDATE name=name ");
            var_dump($tags);
            $checkTag->execute($tags);

        }catch (PDOException $e) {
            echo $e->getMessage();
        }
    }

 

I dla pewnych tagów gdzie jeśli wystąpiły duplikaty PDO zwraca błąd :

SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

Ale według tego co pokazuje echo to liczba placeholderów jest taka sama jak liczba danych w tablicy pokazana przez var_dump.

Przykład:

Tagi wpisane do pola input w formularzu: "ma,ma,ka,ma,"

I komunikaty po próbie wykonania skryptu:

2
(?),(?)
array(2) { [0]=> string(2) "ma" [2]=> string(2) "ka" } SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

Więc według tego wszystko powinno zadziałać. Co ciekawe jeśli wystąpią powtórzenia tagów w innej konfiguracji to skrypt działa.

Poniżej lista przykladowa lista tagów działających oraz nie przesyłanych w formularzu.

BŁĘDNA:

ma,ma,ka,ma,
ma,ma,ka
ma, ka, aha,ma, la, ma
ma, ka, aha,ma, la,
ma, ka, aha,ma, la

OK:

ma,ka,ma
ma,ma,ma
ka,ma,ma,ma
ka,ma,ma,ma,ka
ka,ma,ka,ma,ma,ka
ma, ka, aha, la,

Proszę o wyjaśnienie co jest nie tak.

Dziękuję

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
1 odpowiedź 972 wizyt
pytanie zadane 28 maja 2016 w PHP przez Mateusz Analityk Stary wyjadacz (13,710 p.)
0 głosów
3 odpowiedzi 92 wizyt
0 głosów
1 odpowiedź 172 wizyt
pytanie zadane 11 stycznia 2021 w PHP przez WiktroH Mądrala (6,550 p.)

92,555 zapytań

141,404 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...